ValueError: Call to add_lora method failed: ‘NoneType’ object has no attribute ‘shape’

该报错发生在 vLLM 0.21.0 及以上版本中,当 LoRA 适配器只针对 GatedDeltaNet 打包投影组(如 `in_proj_qkv`)的部分成员进行微调、而未覆盖组内其他成员(如 `in_proj_z`)时触发。优先排查 LoRA 适配器是否完整覆盖了打包组的所有 slice,或等

快速结论:该报错发生在 vLLM 0.21.0 及以上版本中,当 LoRA 适配器只针对 GatedDeltaNet 打包投影组(如 `in_proj_qkv`)的部分成员进行微调、而未覆盖组内其他成员(如 `in_proj_z`)时触发。优先排查 LoRA 适配器是否完整覆盖了打包组的所有 slice,或等待上游修复。

适用环境:vLLM 0.24.0(最新版 main 分支同样复现);Qwen/Qwen3.6-27B(走 Qwen3.5 共享代码路径 Qwen3_5ForConditionalGeneration);Ubuntu 24.04.4 LTS;Python 3.12.3;PyTorch 2.11.0+cu130;CUDA 13.0(runtime 13.0.88),驱动 570.124.06;NVIDIA H200(SM 9.0);FlashInfer 0.6.12;transformers 5.13.0。已知 v0.20.0 可正常加载该 LoRA 适配器。

最快修复方案:暂无确认的一步修复方案。Issue 中已验证的规避手段是回退到 vLLM v0.20.0(同一 H200 机器、torch 2.11.0+cu130、FlashInfer 0.6.8.post1 环境下可正常加载该适配器),或确保 LoRA 适配器覆盖打包组内的全部成员(同时包含 `in_proj_qkv` 和 `in_proj_z`)。

注意事项:该问题自 vLLM v0.21.0(首个包含 PR #37912、commit `48698b1b9` 的版本)开始引入,截至 v0.24.0 与当前 main 分支均未修复。评论区确认 v0.25.0 与 v0.27.1 仍未修复。提交的修复 PR #47640 尚未被合并,等待上游集成。

问题场景

在 vLLM 中以 --enable-lora 启动服务并加载仅覆盖 GatedDeltaNet 打包投影组部分成员的 LoRA 适配器时触发。具体触发命令:

vllm serve Qwen/Qwen3.6-27B --reasoning-parser qwen3 --enable-lora \
  --lora-modules my_lora=<adapter targeting q_proj,k_proj,v_proj,in_proj_qkv> \
  --mm-processor-kwargs '{"max_pixels": 262144}' --enforce-eager

报错发生在适配器激活阶段,而非模型加载阶段。适配器微调了 in_proj_qkv 但未微调 in_proj_z,导致打包组内部分成员缺失。

报错原文

ValueError: Call to add_lora method failed: 'NoneType' object has no attribute 'shape'

# 底层完整堆栈(vLLM 0.24.0 关键帧):
File ".../vllm/lora/layers/column_parallel_linear.py", line 280, in expand_packed_lora
    b_rows, cu_rows, covered = b_i.shape[0], 0, 0
AttributeError: 'NoneType' object has no attribute 'shape'

原因分析

根本原因位于 vLLM 模型定义中的 packed_modules_mapping。Qwen3.5 将 GatedDeltaNet 输入投影声明为一个 2 成员组,映射到 4 个 slice 的融合 MergedColumnParallelLinear

# vllm/model_executor/models/qwen3_5.py
"in_proj_qkvz": ["in_proj_qkv", "in_proj_z"],  # in_proj_qkv -> slices (0,1,2), in_proj_z -> slice 3
"in_proj_ba":   ["in_proj_b", "in_proj_a"],

当适配器提供的组成员少于 slice 数量时,set_lora 会路由到 expand_packed_lora。该方法对 lora_alora_b 中的每个条目无条件解引用:

for a_i, b_i in zip(lora_a, lora_b):
    b_rows, cu_rows, covered = b_i.shape[0], 0, 0  # b_i 为 None 时崩溃

如果组内某个成员(此处为 in_proj_z)未包含在适配器中,其条目即为 None,访问 b_i.shape[0] 便抛出 AttributeError。打包 LoRA 管线的其余部分(如兄弟方法 slice_lora_b 以及 set_lora 中的下游堆叠循环)都已对 None 做了防护,唯独 expand_packed_lora 缺少此保护。None 条目本应表示“该 slice 未被适配”,但当前实现未处理此情况。

环境排查

  • 确认 vLLM 版本是否为 0.21.0 及以上(该版本首次引入 PR #379124,commit 48698b1b9),这是问题出现的分界点。
  • 确认 LoRA 适配器微调的层是否只覆盖了打包组的部分成员(例如仅 in_proj_qkv 而未覆盖 in_proj_z)。
  • 确认模型是否为 Qwen3.5/Qwen3.6 系列且走 GatedDeltaNet 路径(Qwen3_5ForConditionalGeneration)。
  • 可尝试在 vLLM v0.20.0 环境下加载同一适配器,作为对照验证是否是版本回归。
  • 关注 CUDA、PyTorch 与 FlashInfer 版本,但现有证据表明这些并非直接触发因素。

解决步骤

  1. 回退版本(已验证可行):将 vLLM 回退到 v0.20.0。Issue 中确认在同一 H200 机器、torch 2.11.0+cu130、FlashInfer 0.6.8.post1 环境下,v0.20.0 可正常加载该适配器。
  2. 调整适配器覆盖范围(可优先尝试,尚未在 Issue 中直接验证):将 LoRA 适配器改为同时覆盖打包组的全部成员,即同时包含 in_proj_qkvin_proj_z,避免触发 None 分支。
  3. 跟踪上游修复:关注 PR #47640 是否被合并。截至 v0.25.0 与 v0.27.1,该问题仍未修复;评论区表示等待有人审查此 PR 或被未来版本集成。
  4. 检查模型代码中对应打包映射:如果自行修改过 qwen3_5.py 中的 packed_modules_mapping,请确认映射关系与适配器实际覆盖的层一致。

验证方法

重新执行触发命令(vllm serve Qwen/Qwen3.6-27B --enable-lora ...),确认不再出现 ValueError: Call to add_lora method failed,且 API 服务能正常响应推理请求。若回退到 v0.20.0 后问题消失,即可确认是版本回归而非适配器本身的问题。升级到包含 PR #47640 的版本后,也应回归测试部分覆盖与完整覆盖两种适配器场景。

参考来源

vllm-project/vllm #47639

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19182

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注