采样器预热¶
采样器使用配置的解码策略(例如,贪婪或概率性)将模型 logits 转换为下一个 token 选择。其预热阶段会针对代表性的批处理大小和采样参数组合集,为编译的图变体或内部代码路径做好准备,从而使第一个实际用户请求能够避免额外的编译或设置延迟。
预热确保常见的超参数组合能够提前编译,并且贪婪和随机分支策略以及元数据刷新路径都得到执行和稳定。它还处理批处理大小增加或减少的情况,从而平滑后续的缩放行为。跳过采样器预热不会影响正确性,只会影响最早的各种采样请求的延迟情况。以下列表显示了缺少预热的结果
- 使用新配置的第一个请求(例如,第一个带有
top-k路径的high-temp,或在负载扩展后第一个批处理大小)可能会触发图的重新编译,从而增加该请求的延迟。 - 尾部延迟方差增加,因为具有不同工作负载的早期请求可能会触发多个错开的编译。
- 批处理大小转换逻辑(其中路径设置为
batch_changed=True)可能会在实时流量中支付初始化成本。
此预热过程在以下情况下被跳过
VLLM_SKIP_WARMUP设置为 true。- 引擎配置为在不需要图捕获或编译的模式下强制立即执行,并且采样器仍然按需首次运行,但没有单独的预热调用。
引入新的采样行为时,例如 nucleus filtering、penalties 或 speculative metadata,请更新 warmup_sampler 中的 sampling_configs,以确保相应的图路径已预编译并准备就绪。
解码桶配置环境变量间接决定了采样器预热哪些批处理大小,因为采样器从解码桶中派生其测试批处理大小。
执行预热¶
预热例程在 warmup_sampler 中实现,它系统地遍历采样堆栈,处理一系列模式的笛卡尔积,例如批处理大小、温度、top-p 和 top-k,以及一个指示批处理大小是否已更改的标志。要执行预热,请遵循以下过程
-
通过在区分的解码桶批处理大小列表前添加
[0, 1]来构建测试批处理大小列表,因为这些批处理必须始终预热。 -
定义 12 个采样配置,涵盖以下设置。每个配置都应出现两次 - 一次带
batch_changed=True,一次带batch_changed=False- 以处理任何与批处理大小调整相关的内部快速路径或缓存无效逻辑。
- 贪婪:
temperature=0.0 - 典型随机采样:
temperature=1.0 - 创意设置:
0.7/0.9/top-k=50 - 保守:
0.3/0.95/top-k=20 - 高温度:
1.2/0.8/top-k=100 - 仅 top-p 变体:例如
0.8/0.85/top-k=0
-
通过创建形状为
(batch_size, hidden_size)的隐藏状态张量并使用model.compute_logits计算 logits,为每个批处理大小准备虚拟数据。 -
为每个批处理大小实例化至少一个虚拟请求对象,提供占位符提示 token 和一个 KV 块。
-
对于每个配置,请遵循以下子步骤
- 更新每个请求中的
SamplingParams,例如temperature、top_p和top_k。 - 将请求标记为贪婪或随机以测试分支。
- 使用填充的占位符填充
req_output_token_ids并刷新内部采样元数据。 - 调用
_run_sampling并传入batch_changed,以便更改和未更改的批处理大小代码路径都能被编译或执行。 - 重置每个迭代的采样器簿记集或列表。
- 更新每个请求中的
-
完成一个批处理大小的所有采样配置后,清除请求映射并继续。
-
执行 HPU 同步并记录成功。
日志¶
以下示例展示了预热期间典型的日志序列
INFO 09-22 16:39:42 [hpu_model_runner.py:3347] Warming up sampler with batch sizes: [0, 1, 138] and following configs:
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=0.0, top_p=1.0, top_k=0, batch_changed=True
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=1.0, top_p=1.0, top_k=0, batch_changed=True
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=0.7, top_p=0.9, top_k=50, batch_changed=True
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=0.3, top_p=0.95, top_k=20, batch_changed=True
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=1.2, top_p=0.8, top_k=100, batch_changed=True
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=0.8, top_p=0.85, top_k=0, batch_changed=True
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=0.0, top_p=1.0, top_k=0, batch_changed=False
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=1.0, top_p=1.0, top_k=0, batch_changed=False
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=0.7, top_p=0.9, top_k=50, batch_changed=False
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=0.3, top_p=0.95, top_k=20, batch_changed=False
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=1.2, top_p=0.8, top_k=100, batch_changed=False
INFO 09-22 16:39:42 [hpu_model_runner.py:3349] temp=0.8, top_p=0.85, top_k=0, batch_changed=False
INFO 09-22 16:39:42 [hpu_model_runner.py:3350] Starting sampler warmup...
INFO 09-22 16:39:43 [hpu_model_runner.py:3411] Sampler warmup completed successfully
如果全局跳过预热,则不会显示这些日志。