快速结论:该报错发生在 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_a 和 lora_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 版本,但现有证据表明这些并非直接触发因素。
解决步骤
- 回退版本(已验证可行):将 vLLM 回退到 v0.20.0。Issue 中确认在同一 H200 机器、torch 2.11.0+cu130、FlashInfer 0.6.8.post1 环境下,v0.20.0 可正常加载该适配器。
- 调整适配器覆盖范围(可优先尝试,尚未在 Issue 中直接验证):将 LoRA 适配器改为同时覆盖打包组的全部成员,即同时包含
in_proj_qkv和in_proj_z,避免触发None分支。 - 跟踪上游修复:关注 PR #47640 是否被合并。截至 v0.25.0 与 v0.27.1,该问题仍未修复;评论区表示等待有人审查此 PR 或被未来版本集成。
- 检查模型代码中对应打包映射:如果自行修改过
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 的版本后,也应回归测试部分覆盖与完整覆盖两种适配器场景。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![[Bug]: Structured-output scheduler can keep advancing a terminated xgrammar matcher](https://www.chat-gpts.plus/wp-content/uploads/2026/08/42619-81e0022e-768x403.jpg)
