RuntimeError: shape ‘[32, 64, 576]’ is invalid for input of size 1343488

用户在使用 vLLM v0.25.1 服务 GLM-5.2-NVFP4 模型(GlmMoeDsaForCausalLM 架构,NVFP4 量化,使用 FLASHMLA_SPARSE 解码后端)时,服务器在启动过程中的 CUDA 图内存分析阶段崩溃。该问题在 v0.25.1 版本中首次出现, v0.2

RuntimeError: shape '[32, 64, 576]' is invalid for input of size 1343488

RuntimeError: shape ‘[32, 64, 576]’ is invalid for input of size 1343488

快速结论:该错误发生在 vLLM v0.25.1 启动过程中,使用带有 MLA(多头潜在注意力)架构和 FLASHMLA_SPARSE 后端的模型(如 GLM-5.2)时。优先排查方法:使用 --enforce-eager 参数启动以跳过 CUDA 图内存分析阶段;升级到包含修复的 vLLM 主分支版本。

问题场景

用户在使用 vLLM v0.25.1 服务 GLM-5.2-NVFP4 模型(GlmMoeDsaForCausalLM 架构,NVFP4 量化,使用 FLASHMLA_SPARSE 解码后端)时,服务器在启动过程中的 CUDA 图内存分析阶段崩溃。该问题在 v0.25.1 版本中首次出现,v0.24.0 版本在相同模型和配置下可以正常启动。该问题也在不同量化路径(compressed-tensors)、不同TP配置(TP=4)和不同检查点下被独立复现,说明问题具有更广泛的辐射范围。

报错原文

RuntimeError: shape '[32, 64, 576]' is invalid for input of size 1343488

完整堆栈跟踪中的关键路径:

File "vllm/v1/worker/gpu_worker.py", line 483, in determine_available_memory
    cudagraph_memory_estimate = self.model_runner.profile_cudagraph_memory()
File "vllm/v1/worker/gpu_model_runner.py", line 6500, in profile_cudagraph_memory
    self._init_minimal_kv_cache_for_profiling()
...
File "vllm/attention/backends/attn_utils.py", line 251, in _reshape_attention_kv_cache
    kv_cache = kv_raw_tensor.view(dtype).view(permuted_kv_cache_shape)
RuntimeError: shape '[32, 64, 576]' is invalid for input of size 1343488

在另一个独立复现中报错为:

RuntimeError: shape '[96, 64, 576]' is invalid for input of size 4030464

原因分析

问题出在 v0.25.1 引入的 _init_minimal_kv_cache_for_profiling 路径。该路径在初始化和重塑 KV 缓存张量时,使用了基于 get_kv_cache_shape 返回的未填充尺寸(576),但实际的原始张量在分配时使用了填充后的每 token 大小(656)。

具体来说:576 = kv_lora_rank + qk_rope_head_dim = 512 + 64(常规 MLA 潜在维度),而 656 是填充后的每 token 页大小,由 fp8_ds_mla 格式引入。

原始的张量大小 1343488(或 4030464)除以期望形状的维度后得到 656(例如 1343488 / (32 * 64) = 656),但 reshape 操作期望的是 576,从而导致形状不匹配。

环境排查

  • vLLM 版本:确认使用 v0.25.1(或基于该版本的 Docker 镜像 vllm/vllm-openai:v0.25.1)。
  • 模型架构:确认是否为 MLA 架构模型(如 GlmMoeDsaForCausalLM)。
  • 注意力后端:检查日志中是否显示 Using FLASHMLA_SPARSE attention backend
  • KV 缓存格式:确认 Using fp8_ds_mla KV cache format 日志。
  • CUDA 图:检查是否启用了 CUDA 图(默认启用),排查命令是否包含 --enforce-eager
  • 推理参数:检查是否使用 --kv-cache-dtype fp8

解决步骤

  1. (可优先尝试)立即绕过:在启动命令中添加 --enforce-eager 参数。这会禁用 CUDA 图分析,从而跳过 profile_cudagraph_memory() 路径。注意:这会带来 MoE/CUDA 图形性能损失。
  2. 升级到修复版本:等待或自行构建包含 PR #48379 的 vLLM 版本。该 PR 在 main 分支上设置 MLA KV 缓存规范的 kv_quant_mode,确保重塑路径不再使用错误的 "auto" 分支。注意:#48379v0.25.1 tag 之后合并,因此当前最新 release(v0.25.1)仍未包含此修复。
  3. 检查后续加固:PR #48907 进一步加固了重塑路径,通过优先使用 spec.cache_dtype_str 作为布局真实来源,避免回退到 kv_quant_mode == NONE → "auto" 的启发式方法。建议跟踪该 PR 的合并状态。
  4. 确认参数:在排查期间,尝试不使用 --kv-offloading-size--enable-prefix-caching 等可能增加 KV 缓存复杂度的参数启动以确认问题是否仍然存在。

验证方法

在应用修复(升级到包含 #48379 的版本)或使用 --enforce-eager 后,重新启动 vLLM 服务。启动过程中不应再出现 RuntimeError: shape '[32, 64, 576]' is invalid for input of size 1343488 错误,并且应该能够成功完成初始化到达服务就绪状态。可以通过检查以下日志线索确认:

  • 日志中不应再出现 WorkerProc hit an exceptiondetermine_available_memory 中的错误堆栈。
  • 正常启动后应出现类似 Application startup complete 或服务器绑定到指定端口的消息。

参考来源

vllm-project/vllm #48896

相关修复 PR:#48379#48907

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 14969

发表回复

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