![[Bug]: [DeepSeek-V4-Flash][MTP] CUDA invalid argument during profile_run with DP4 + EP + MegaMoE on B_00](https://www.chat-gpts.plus/wp-content/uploads/2026/06/45099-8bfd8616.jpg)
[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_buffer 和 aux_stream_list 等张量/流未指定 device= 参数,导致它们错误地分配到了默认 CUDA 设备(逻辑设备 0),而非每个 DP worker 对应的正确 GPU。优先排查 vllm/models/deepseek_v4/nvidia/mtp.py 中 DeepSeekV4MultiTokenPredictor.__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_fn、hc_head_base和hc_head_scale同样通过torch.empty(...)创建且未指定设备。
所有 4 个 DP worker 在同一个代码行同时崩溃,这验证了这是一个系统性的初始化问题。
环境排查
- GPU 配置:确认
CUDA_VISIBLE_DEVICES设置,例如0,1,2,3(连续)还是0,5,6,7(非连续)。 - 数据并行大小:检查
--data-parallel-size参数的值。 - MTP 配置:确认是否启用了
--speculative-config且method为mtp。 - vLLM 版本:当前为 main 分支,检查
vllm/models/deepseek_v4/nvidia/mtp.py中__init__方法的实现。
解决步骤
- (可优先尝试)使用连续的 GPU ID 作为临时解决:将
CUDA_VISIBLE_DEVICES设置为连续的 GPU 编号,例如0,1,2,3。 - (可优先尝试)降低 DP 并行度:尝试使用
--data-parallel-size 2减少并行 worker 数量。 - (可优先尝试)禁用 MTP 推测解码:移除
--speculative-config参数。 - (推荐修复)为
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 的设备 ) - (推荐修复)为
aux_stream_list显式指定设备:修改aux_stream_list的创建方式:aux_stream_list = [ torch.cuda.Stream(device=torch.cuda.current_device()) for _ in range(3) ] # 显式指定当前 worker 的设备 - (推荐修复)为
hc_head_*参数显式指定设备:在DeepSeekV4MultiTokenPredictorLayer.__init__中,为hc_head_fn、hc_head_base和hc_head_scale的torch.empty(...)调用添加device=torch.cuda.current_device()参数。 - (调试用)使用 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 设备映射警告。



