RuntimeError: src_cache and dst must have the same dtype`.

该报错通常发生在使用 vLLM 部署 DeepSeek-V3.2 并启用 FlashMLA 稀疏注意力后端时,密集 MHA 分路(来自 #47327)未正确适配稀疏后端的索引转换和缓存布局,导致越界写入或 dtype 不匹配。

快速结论:该报错通常发生在使用 vLLM 部署 DeepSeek-V3.2 并启用 FlashMLA 稀疏注意力后端时,密集 MHA 分路(来自 #47327)未正确适配稀疏后端的索引转换和缓存布局,导致越界写入或 dtype 不匹配。

适用环境:vLLM(版本包含 #47327 但未包含修复 #48642);模型:deepseek-ai/DeepSeek-V3.2;设置:`–tensor-parallel-size 8`,`–kv-cache-dtype fp8_ds_mla` 或 `auto`(bf16 缓存);触发条件:同时存在解码和新短提示(总序列长度 ≤ index_topk=2048),或多轮对话/前缀缓存命中。

最快修复方案:升级 vLLM 到包含合并 PR #48642 的版本(该 PR 直接修复了索引切片和 fp8_ds_mla 上下文聚集问题)。

注意事项:如果无法升级,暂无已验证的临时替代方案;禁用 FlashMLA 稀疏后端可能避开该问题,但 Issue 中未测试,需自行评估。

问题场景

用户使用 vLLM 启动推理服务时,加载 deepseek-ai/DeepSeek-V3.2 模型,并指定了 --kv-cache-dtype fp8_ds_mla(或 auto)和 --tensor-parallel-size 8。在产生并发请求时,遇到以下两种场景之一:

  • Bug 1: 调度步骤中同时包含至少一个运行中的解码请求和一个新的短提示(总序列长度 ≤ 2048),触发密集 MHA 分路。此时 forward_mqa 只收到解码 token,而索引转换内核写入了未正确切片的缓冲区,导致非确定性内存损坏或 CUDA error: an illegal memory access
  • Bug 2: 多轮对话或前缀缓存命中时,预填充携带已计算上下文(序列长度 ≤ 2048),密集 MHA 路径尝试聚集缓存中的 fp8_ds_mla KV,但聚集操作不理解该缓存布局(656B 格式:量化 fp8 + per-128-tile scales + inline fp32 scales + RoPE),导致静默错误或 RuntimeError: src_cache and dst must have the same dtype(当启用 DCP 时)。

报错原文

Bug 1 典型表现:CUDA error: an illegal memory access(伴随非确定性崩溃)
Bug 2 典型表现(启用 DCP):RuntimeError: src_cache and dst must have the same dtype

原因分析

这两个 bug 均源于 PR #47327 引入的密集 MHA 分路(dense-MHA split)对 FlashMLA 稀疏后端未做适配:

  • 原因 1 – 索引转换越界: FlashMLASparseImpl.forward_mqatopk_indices 正确切片为 num_mqa_tokens,但 attn_metadata.req_id_per_token 仍使用全局批大小传递给 triton_convert_req_index_to_global_index。该转化内核按 req_id.shape[0] 分配输出缓冲区,而实际写入行数超出 MQA 子集范围,造成越界写入。其他稀疏后端(FlashInfer、FlashAttn)已做了正确切片,FlashMLA 未同步更新。
  • 原因 2 – fp8_ds_mla 缓存聚集错误: 密集 MHA 路径 forward_mha 通过通用 gather 操作读取 fp8_ds_mla 缓存,但该缓存的存储格式(512B fp8 每 128-tile 量化 + 4×fp32 内联 scales + 64×bf16 RoPE)不被 gather 理解。在 DCP 下 _context_parallel_compute_prefill_context 尝试使用 ops.cp_gather_cache,要求 src/dst dtype 一致,而缓存为 uint8、工作空间为 bf16,触发 RuntimeError。

环境排查

celebrityanime
celebrityanime
文章: 15458

发表回复

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