Prhub

#43139 [Model Runner V2] Fix lora `Triton Error [CUDA]: device-side assert triggered`

原始 PR 作者 yewentao256 合并时间 2026-05-21 09:00 文件变更 1 提交数 4 评论 7 代码增减 +14 / -1

执行摘要

修复 V2 model runner 在 dummy run 时 LoRA 未初始化引起的 Triton 断言错误

执行 VLLM_USE_V2_MODEL_RUNNER=1 pytest tests/entrypoints/openai/tool_parsers/test_hermes_tool_parser.py::test_non_streaming_tool_call[llama] 时,由于 dummy run 未初始化 LoRA 元数据,导致 Triton 内核 device-side assert 触发。详见 issue 和 PR body 中的报错堆栈。

此 PR 值得精读,尤其是理解 V2 model runner 中 dummy run 路径与 LoRA 的交互。关注点:1)临时方案的设计权衡;2)未来向 LoRA warmup 迁移的 plan。开发者应跟踪 PR#35536 的进展。

讨论亮点
  1. gemini-code-assist[bot] 建议使用 _set_active_loras 替代直接访问私有属性:reviewer 认为应使用 LoRAModelRunnerMixin 提供的 _set_active_loras 方法,避免依赖内部实现细节。但 yewentao256 未采纳,合并者 njhill 最终批准了当前方式,可能是因为 _set_active_loras 在 dummy run 场景下有额外副作用或不适用。
  2. jeejeelee 询问此 PR 是否完全启用 LoRA for MRV2:yewentao256 澄清这只是 CI 故障的快速修复,并非完整的 LoRA 支持。
  3. njhill 建议保留 FIXME:确认当前方案是临时措施,应保留 FIXME 指向未来的 LoRA warmup PR。

实现拆解

  1. 新增导入:在 vllm/v1/worker/gpu/model_runner.py 顶部导入 from vllm.lora.layers import LoRAMapping
  2. 在 dummy run 分支注入零 LoRA 映射:在 execute_model 方法的 else(dummy run)分支中,当 self.lora_config 存在时,通过 self.lora_manager._adapter_manager.set_adapter_mapping 设置一个全为 0 的 LoRAMapping。这样 Triton 内核在执行前检测到无有效 LoRA 适配器,会提前退出避免读取未初始化内存。
  3. 保留 FIXME 注释:添加注释说明这是临时方案,未来应被 LoRA warmup(PR#35536)替换。
  4. 无测试/配置变更:仅源码修改,测试通过即验证修复。
文件 模块 状态 重要度
vllm/v1/worker/gpu/model_runner.py 模型运行器 modified 6.62

关键符号

execute_model

关键源码片段

vllm/v1/worker/gpu/model_runner.py data-contract

核心修改文件:新增 LoRAMapping 导入,在 dummy run 分支注入零 LoRA 映射,防止内核读取未初始化元数据。

# vllm/v1/worker/gpu/model_runner.py
# 第 40 行新增导入
from vllm.lora.layers import LoRAMapping # 用于构建零 LoRA 映射# execute_model 方法中 dummy run 分支的关键片段(约第 1088-1100 行)
else:
    # ... 原有 dummy run 逻辑 ...
    if self.lora_config:
        # 注入一个全为 0 的 LoRA 映射,使 Triton 内核在 dummy run 时
        # 检测到无有效适配器从而提前退出,避免读取未初始化内存导致的 CUDA 断言错误。
        # FIXME: 待 LoRA warmup 机制合并后替换(参见 PR#35536)
        assert hasattr(self, "lora_manager")
        self.lora_manager._adapter_manager.set_adapter_mapping(
            LoRAMapping(
                index_mapping=(0,) * input_batch.num_tokens_after_padding,
                prompt_mapping=(0,) * input_batch.num_reqs,
                is_prefill=True,
            )
        )

评论区精华

使用 _set_active_loras 替代直接访问私有属性 设计

gemini-code-assist[bot] 建议改用 LoRAModelRunnerMixin._set_active_loras 方法,避免依赖内部实现细节,并可移除新增的 LoRAMapping 导入。

结论:未采纳。合并者 njhill 批准了当前方式,可能因为 _set_active_loras 在 dummy run 场景有额外副作用。 · 已解决

此 PR 是否完全启用 LoRA for MRV2 question

jeejeelee 询问此 PR 是否使 LoRA 功能在 MRV2 上可用。yewentao256 澄清这只是 CI 崩溃的快速修复,并非完整的 LoRA 启用。

结论:澄清:仅修复 dummy run 崩溃,不启用完整 LoRA 功能。 · 已解决

保留 FIXME 注释指示临时性 documentation

njhill 建议保留 FIXME 注释,明确此方案是临时措施,未来将由 LoRA warmup 替换。

结论:已采纳:添加了指向 PR#35536 的 FIXME 注释。 · 已解决

风险与影响

  1. 回归风险:低。变更仅在 dummy run 且 lora_config 非空的条件下执行,不影响正常推理路径。
  2. 对 LoRA 功能的风险:此修改只是注入零映射,不会激活真正的 LoRA 适配器,因此不会干扰后续 LoRA 功能。但若 lora_manager._adapter_manager 接口未来改变,可能需同步更新。
  3. 依赖私有 API:直接访问 _adapter_managerset_adapter_mapping 方法,这些是内部实现,可能随版本变化。

影响范围:仅作用于 V2 model runner(VLLM_USE_V2_MODEL_RUNNER=1)且启用 LoRA 的场景。修复了此前该场景下所有涉及 dummy run 的 LoRA 测试崩溃问题。影响程度:中,因为修复了阻止 CI 通过的 bug,但未引入新功能。

依赖私有 API 临时方案待替换

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论