09 · Sampling:从 logits 选择下一个 token
模型输出还不是文字
Qwen3 最后一层为词表中的每个 token 输出一个 logit。Sampler 必须把这些分数转成一个具体 token id,之后 tokenizer 才能解码成文字。
nano-vLLM 的最小 Sampler 做三件事:
python
logits = logits.float() / temperature
probs = softmax(logits)
sample = argmax(probs / Exp(1))最后一步利用指数随机变量实现与 categorical sampling 等价的选择技巧,避免显式调用更复杂的采样接口。
Temperature
temperature < 1:放大 logit 差异,分布更尖锐,更稳定。temperature > 1:缩小差异,分布更平,更随机。- 非常接近 0 时趋向 greedy,但上游
SamplingParams当前明确不允许 greedy sampling,并要求 temperature 大于一个小阈值。
为什么先转 float
模型可能使用 float16 或 bfloat16。softmax 对数值稳定性敏感,先转 float32 能降低溢出或精度损失风险。之后只返回 token id,额外开销有限。
最小实现省略了什么
生产采样器通常还支持:top-k、top-p、重复惩罚、logit bias、停止词、结构化输出、多候选 beam 等。nano-vLLM 的目标是展示推理引擎主干,因此只保留 temperature 与最大长度 / EOS 控制。
随机性与可复现
同一个 prompt 不一定得到相同输出。做 benchmark 时,性能输入长度可以固定,但若验证输出内容,还需要控制随机种子、模型版本、精度和采样配置。
HTML INTERACTIVE LAB09 · Sampling:从 logits 选择下一个 token
单独打开 ↗课后习题等待完成
temperature 增大通常会怎样改变分布?
动手任务
在互动实验中固定 logits,分别使用 temperature=0.3、1.0、1.8 各采样 500 次,记录最高概率 token 的出现次数。
下一节:Tensor Parallel