[Bug]: [DeepSeek-V4-Flash][MTP] CUDA invalid argument during profile_run with DP4 + EP + MegaMoE on B_00

在 vllm serve 启动 DeepSeek-V4-Flash 模型时,使用 --speculative-config '{"method":"mtp","num_speculative_tokens":1}' 或 num_speculative_tokens=3 ,并配合 --data-par

[Bug]: [DeepSeek-V4-Flash][MTP] CUDA invalid argument during profile_run with DP4 + EP + MegaMoE on B_00

[Bug]: [DeepSeek-V4-Flash][MTP] CUDA invalid argument during profile_run with DP4 + EP + MegaMoE on B_00

快速结论:该报错发生在使用 DeepSeek-V4-Flash 模型启用 MTP 推测解码(speculative decoding)时,同时开启了 DP4(数据并行 4)、EP(专家并行)和 DeepGEMM MegaMoE 后端。核心原因是在 MTP 初始化过程中,topk_indices_bufferaux_stream_list 等张量/流未指定 device= 参数,导致它们错误地分配到了默认 CUDA 设备(逻辑设备 0),而非每个 DP worker 对应的正确 GPU。优先排查 vllm/models/deepseek_v4/nvidia/mtp.pyDeepSeekV4MultiTokenPredictor.__init__DeepSeekV4MultiTokenPredictorLayer.__init__ 中的设备分配逻辑。

问题场景

vllm serve 启动 DeepSeek-V4-Flash 模型时,使用 --speculative-config '{"method":"mtp","num_speculative_tokens":1}'num_speculative_tokens=3,并配合 --data-parallel-size 4--enable-expert-parallel--moe-backend deep_gemm_mega_moe。服务器在启动阶段的 profile_run(即 _dummy_run)过程中崩溃,尚未开始处理服务请求。

报错原文

torch.AcceleratorError: CUDA error: invalid argument
vllm/models/deepseek_v4/nvidia/mtp.py:155
    hidden_states = self.h_proj(previous_hidden_states) + self.e_proj(inputs_embeds).unsqueeze(-2)

控制台同时可能输出如下 NCCL 警告:

[rank0]:[W610 03:13:53.291418918 ProcessGroupNCCL.cpp:5188] Guessing device ID based on global rank. This can cause a hang if rank to GPU mapping is heterogeneous.

原因分析

该 CUDA 错误是异步报告的。真正的非法内存访问可能发生在报错行之前的某个更早的 CUDA kernel 中(例如 fused_mtp_input_rmsnorm Triton kernel)。根本原因在于 DeepSeekV4MultiTokenPredictor.__init__ 方法中的设备分配不明确:

  • topk_indices_buffer:通过 torch.empty(...) 创建,但未指定 device=,因此默认分配到了 CUDA 设备 0。当使用 CUDA_VISIBLE_DEVICES=0,5,6,7 时,逻辑设备 1/2/3 对应的物理 GPU 5/6/7 上的 worker 将使用错误的缓冲区。
  • aux_stream_list:通过 torch.cuda.Stream() 创建,同样未指定 device=,绑定到了创建时的当前设备。如果创建时机在 torch.cuda.set_device() 被正确调用之前,则流也会绑定到错误的 GPU。
  • hc_head_* 参数DeepSeekV4MultiTokenPredictorLayer.__init__ 中的 hc_head_fnhc_head_basehc_head_scale 同样通过 torch.empty(...) 创建且未指定设备。

所有 4 个 DP worker 在同一个代码行同时崩溃,这验证了这是一个系统性的初始化问题。

环境排查

  • GPU 配置:确认 CUDA_VISIBLE_DEVICES 设置,例如 0,1,2,3(连续)还是 0,5,6,7(非连续)。
  • 数据并行大小:检查 --data-parallel-size 参数的值。
  • MTP 配置:确认是否启用了 --speculative-configmethodmtp
  • vLLM 版本:当前为 main 分支,检查 vllm/models/deepseek_v4/nvidia/mtp.py__init__ 方法的实现。

解决步骤

  1. (可优先尝试)使用连续的 GPU ID 作为临时解决:将 CUDA_VISIBLE_DEVICES 设置为连续的 GPU 编号,例如 0,1,2,3
  2. (可优先尝试)降低 DP 并行度:尝试使用 --data-parallel-size 2 减少并行 worker 数量。
  3. (可优先尝试)禁用 MTP 推测解码:移除 --speculative-config 参数。
  4. (推荐修复)为 topk_indices_buffer 显式指定设备:在 DeepSeekV4MultiTokenPredictor.__init__ 中,将 self.topk_indices_buffer 的创建修改为:
    self.topk_indices_buffer = torch.empty(
        vllm_config.scheduler_config.max_num_batched_tokens,
        topk_tokens,
        dtype=torch.int32,
        device=torch.cuda.current_device(),  # 显式指定当前 worker 的设备
    )
    
  5. (推荐修复)为 aux_stream_list 显式指定设备:修改 aux_stream_list 的创建方式:
    aux_stream_list = [
        torch.cuda.Stream(device=torch.cuda.current_device()) for _ in range(3)
    ]  # 显式指定当前 worker 的设备
    
  6. (推荐修复)为 hc_head_* 参数显式指定设备:在 DeepSeekV4MultiTokenPredictorLayer.__init__ 中,为 hc_head_fnhc_head_basehc_head_scaletorch.empty(...) 调用添加 device=torch.cuda.current_device() 参数。
  7. (调试用)使用 CUDA_LAUNCH_BLOCKING=1 重新运行:强制同步 CUDA 执行,以便在准确的操作点获取堆栈追踪信息:
    CUDA_LAUNCH_BLOCKING=1 CUDA_VISIBLE_DEVICES=0,5,6,7 vllm serve /root/model/DeepSeek-V4-Flash ...

验证方法

确认问题已解决:在应用上述步骤后(尤其是步骤 1 或步骤 4-6),重新执行相同的 vllm serve 命令,服务器成功完成 profile_run 阶段并开始正常提供服务请求,不再出现 CUDA error: invalid argument 报错或 NCCL 设备映射警告。

参考来源

vllm-project/vllm #45099

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 9086

发表回复

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