Skip to content

09 · Sampling:从 logits 选择下一个 token

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

社区教程,与 nano-vLLM 上游项目无官方隶属关系。