Prhub

#42709 [Bugfix] Ensure embeding model compilation on CPU

原始 PR 作者 bigPYJ1151 合并时间 2026-05-15 18:58 文件变更 1 提交数 2 评论 1 代码增减 +4 / -1

执行摘要

修复 CPU 上 embedding 模型未编译的问题

关联 Issue #42520 报告了 embedding 模型在 v0.20.1 相比 v0.19.1 出现吞吐量和延迟的严重退化(约 50% 性能下降)。根本原因是 v0.20.1 的 CPU worker 路径中,embedding 模型等无需 KV cache 的模型在启动时没有被显式编译,导致推理时触发即时编译(JIT),性能骤降。

该 PR 是 CPU 后端 embedding 模型性能退化的重要修复,建议精读并确认随机种子重置顺序是否需要调整。虽修复核心问题,但种子顺序可能引入隐藏的随机状态一致性问题,建议修复。

讨论亮点

gemini-code-assist[bot] 指出随机种子重置应在模型 warmup 之后执行,以保证首次推理的随机状态一致。warmup 过程会运行模型 (profile_run),可能推进随机数生成器状态;而当前代码在 warmup 前重置种子,导致带 KV cache 和不带 KV cache 的模型之间随机状态基线不一致。该问题未被修复,属于隐藏的随机状态一致性问题。

实现拆解

  1. 判断是否无 KV cache 并触发编译:在 vllm/v1/worker/cpu_worker.pycompile_or_warm_up_model 方法中,在设置随机种子之前,检查 self.model_runner.kv_caches 的长度是否为零。若为零(如 embedding 模型),则调用 self.model_runner.warming_up_model() 主动触发模型编译(包含 profile run)。
  2. 保持种子重置逻辑:原有 set_random_seed 调用保留,但根据 review 评论建议,应将其移到 warming_up_model() 之后,以确保随机状态在首次推理前一致(当前实现中种子重置在 warmup 之前,可能导致 warmup 中的 profile run 推进随机生成器状态)。
文件 模块 状态 重要度
vllm/v1/worker/cpu_worker.py CPU worker modified 5.82

关键符号

compile_or_warm_up_model

关键源码片段

vllm/v1/worker/cpu_worker.py core-logic

核心变更文件,在 `compile_or_warm_up_model` 中新增条件判断以触发无 KV cache 模型的编译。

def compile_or_warm_up_model(self) -> CompilationTimes:
    # Note: the model has been compiled in determine_available_memory(),
    # Only compile here for models without kv cache (e.g. embedding models)
    if len(self.model_runner.kv_caches) == 0:
        self.model_runner.warming_up_model()
    # Reset seed after warmup to ensure consistent random state for first inference
    set_random_seed(self.model_config.seed)
    return CompilationTimes(
        language_model=self.compilation_config.compilation_time,
        encoder=self.compilation_config.encoder_compilation_time,
    )

评论区精华

随机种子重置应该在 warmup 之后 正确性

`gemini-code-assist[bot]` 指出当前种子重置在 warmup 之前,warmup 中的 profile run 可能推进随机生成器状态,导致带 / 不带 KV cache 的模型随机状态基线不一致。

结论:未在 PR 中修复,需要后续处理。 · unresolved

风险与影响

  1. 随机状态一致性风险:当前种子重置在 warmup 之前,若 warmup 推进了随机生成器,则首次推理的随机状态与设计意图不一致。建议将 set_random_seed 移至 warmup 之后。
  2. 回归风险低:修改针对无 KV cache 模型的特例,对已有 KV cache 的模型逻辑无影响。
  3. 缺少测试覆盖:未添加新测试验证 embedding 模型编译后的性能或随机状态。

直接影响 CPU 后端 embedding/池化模型,修复性能退化(约 50%),确保模型在启动时被编译而非推理时即时编译。对 GPU 后端无影响。

核心路径变更 缺少测试覆盖 隐藏的随机状态一致性问题

关联 Issue

#42520 [Performance]: performance drop between versions 0.19.1 and 0.20.1 for embedding models

完整报告

参与讨论