RuntimeError: The size of tensor a (3072) must match the size of tensor b (2880)

该报错通常出现在 vLLM 以 MXFP4 量化加载 gpt-oss-120b、并启用 --enable-expert-parallel 的启动阶段:modular MoE 的 finalize 环节写入了 padded 输出缓冲,而专家实际结果宽度是未补齐的,于是触发 RuntimeError:

快速结论:该报错通常出现在 vLLM 以 MXFP4 量化加载 gpt-oss-120b、并启用 --enable-expert-parallel 的启动阶段:modular MoE 的 finalize 环节写入了 padded 输出缓冲,而专家实际结果宽度是未补齐的,于是触发 RuntimeError: The size of tensor a (3072) must match the size of tensor b (2880)。优先排查 vLLM 版本是否已包含修复该缓冲区尺寸逻辑的变更。

适用环境:Issue 中确认的环境为:vLLM 0.26.1rc1.dev602+g65b7662d3,Python 3.12,CUDA 13.0,PyTorch 2.x(CUDA 13.0 wheel,具体 build 字符串未打印),NCCL 2.30.7 与 2.29.7 两种容器均复现,FlashInfer 0.6.18.dev20260811(cu130 nightly),8×NVIDIA B200(sm100)单节点,模型 openai/gpt-oss-120b MXFP4(hidden_size = 2880)。

最快修复方案:升级到包含 vLLM PR #61979 的构建。该 PR 将 modular MoE 路径的输出缓冲区尺寸调整为匹配专家的逻辑输出宽度,消除 padded/unpadded 维度不一致。

注意事项:Issue 报告者与维护者仅在“基于当前 main 的构建”上验证了 GPT-OSS-120B MXFP4、BF16、TP1/DP8+EP 配置的启动、图捕获与 serving 通过;未提供回填到旧版本分支的修复版本号。若你使用的版本无法升级,升级前请确认该 pre-release 构建未被用于生产。调高 NCCL 版本并不规避此问题:NCCL 2.30.7 下仍会选中 MoEPrepareAndFinalizeNaiveDPEPModular 并同样崩溃。

问题场景

用户在单节点 8×B200 上通过 vllm serve 启动 openai/gpt-oss-120b(MXFP4 检查点),使用 --tensor-parallel-size 1 --data-parallel-size 8 --enable-expert-parallel --max-model-len 4096,既未覆盖 MoE backend 也未覆盖 activation,vLLM 自动选中 FLASHINFER_TRTLLM_MXFP4_BF16 MoE backend,并解析为 MoEPrepareAndFinalizeNaiveDPEPModular。崩溃发生在 V1 启动的内存 profiling 阶段,服务尚未就绪。同一构建在不加 --enable-expert-parallel 时可正常服务该模型。

报错原文

RuntimeError: The size of tensor a (3072) must match the size of tensor b (2880)

原因分析

最可能的原因是 modular MoE 的 prepare/finalize 链路(modular_kernel.py 中 FusedMoEPrepareAndFinalize 相关调用点)把输出缓冲区按 padded 宽度(3072)分配,而专家实际产出的结果是未补齐宽度(2880),二者在 finalize 拷贝时发生维度不匹配。触发条件包括:hidden_size 不是 256 的整数倍(gpt-oss-120b 为 2880)、使用 FLASHINFER_TRTLLM_MXFP4_BF16 后端、以及选用会写入调用方提供缓冲区的 modular prepare_finalize(此处为 MoEPrepareAndFinalizeNaiveDPEPModular)。Issue 提到相关符号为 has_unpadded_output 与 hidden_dim_unpadded;PR #44452 重构了同一调用点但未涉及 MXFP4 padding,因此与本问题不是同一缺陷。

环境排查

  • 确认 vLLM 版本(报告为 0.26.1rc1.dev602+g65b7662d3),并核对该版本是否已合入 PR #61979。
  • 确认启动日志中选中的 MoE backend,是否为 FLASHINFER_TRTLLM_MXFP4_BF16。
  • 确认启动日志中的 prepare/finalize 实现,是否为 MoEPrepareAndFinalizeNaiveDPEPModular。
  • 确认模型 hidden_size(gpt-oss-120b 为 2880,非 256 的整数倍)。
  • 确认启动参数组合:--tensor-parallel-size、--data-parallel-size、--enable-expert-parallel 是否与复现配置一致。
  • 对照 NCCL 版本(2.30.7 与 2.29.7 均复现),排除 DeepEP 不可用提示作为唯一诱因的可能。
  • 确认 GPU 型号与架构(B200 / sm100)、Python(3.12)、CUDA(13.0)、PyTorch 与 FlashInfer nightly 版本。

解决步骤

  1. 记录当前 vLLM 构建版本,确认其不包含 PR #61979 的 modular MoE 输出缓冲区尺寸修正。
  2. 将 vLLM 升级到包含 PR #61979 的构建。
  3. 保持原复现参数不变,重新启动:vllm serve openai/gpt-oss-120b --tensor-parallel-size 1 --data-parallel-size 8 --enable-expert-parallel --max-model-len 4096。
  4. 若启动日志仍显示 MoEPrepareAndFinalizeNaiveDPEPModular,这是默认 flags 下的正常解析结果,不作为未修复的判断依据;以是否仍抛出该 RuntimeError 为准。

验证方法

升级后重新执行上述启动命令:服务可完成启动的内存 profiling 与图捕获阶段并进入就绪状态,且不再出现 RuntimeError: The size of tensor a (3072) must match the size of tensor b (2880)。Issue 中维护者在相同 MXFP4、BF16、TP1/DP8+EP 配置上验证了启动、图捕获与 serving 均通过,且 GSM8K 验证负载正常;可在本地以一次短请求或等价的小规模推理负载确认服务可用。

参考来源

vllm-project/vllm #52051

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 34550

发表回复

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