sskj/envs/SM120_DSV4_DEPLOYMENT_GUIDE.md
Quantong Qiu 5d2f1b2d9a docs(envs): add envs README and track deployment guides
- Add envs/README.md explaining the directory purpose and usage rules.
- Update .gitignore to exclude only virtual env subdirectories under envs/,
  allowing deployment guide documents to be tracked.
- Track existing deployment docs:
  - SM120_DSV4_DEPLOYMENT_GUIDE.md
  - SM120_DSV4_DEPLOYMENT_ISSUES.md
  - VLLM_DSV4_SM120_FIX.md
2026-07-14 10:54:46 +00:00

6.7 KiB
Raw Blame History

SM120 (RTX 6000D) 部署 DeepSeek-V4-Flash 问题总结

环境信息

  • GPU: NVIDIA RTX 6000D (SM120, 48GB x 8)
  • 模型: DeepSeek-V4-Flash (FP8 量化)
  • 模型路径: /data/hf_models/DeepSeek-V4-Flash
  • sglang 版本: 0.5.15
  • vllm 版本: 0.11.0+cu128 (with SM120 patches)
  • flashinfer: 0.6.14
  • torch: 2.8.0+cu128

问题概述

sglang 和 vllm 在 SM120 上部署 DSV4 时,都遇到了算子不支持的问题。根本原因是:

  1. flashinfer 的某些算子尚未支持 SM120
  2. sgl_kernelflash_mla_sparse_fwd 只支持 SM90a 和 SM100f不支持 SM120

vllm 部署问题与修复

问题flashinfer API 参数名不匹配

vllm 使用 flashinfer 的 BatchDecodeWithPagedKVCacheWrapper 时,调用参数名与 flashinfer 0.6.14 实际接口不一致。

错误信息:

TypeError: compute_kv_indptr() got an unexpected keyword argument 'page_size'

根本原因: vllm 代码中使用的参数名是 page_size,但 flashinfer 0.6.14 实际需要的是 kv_layout 或其他参数。

修复方法

修改文件:/data/yy/sskj/envs/vllm/lib/python3.12/site-packages/vllm/attention/ops/flashinfer_sm120.py

page_size 参数改为 kv_layout:

# 修改前
indptr = flashinfer.compute_kv_indptr(
    num_pages,
    page_size=page_size,  # 错误
    ...
)

# 修改后
indptr = flashinfer.compute_kv_indptr(
    num_pages,
    kv_layout=page_size,  # 正确
    ...
)

vllm 部署命令

source /data/yy/sskj/envs/vllm/bin/activate
python -m vllm.entrypoints.openai.api_server \
  --model /data/hf_models/DeepSeek-V4-Flash \
  --tensor-parallel-size 8 \
  --trust-remote-code \
  --max-model-len 65536 \
  --gpu-memory-utilization 0.85 \
  --port 8000

状态: 已修复,可成功部署


sglang 部署问题与修复

问题1flashinfer 版本过低

sglang 0.5.15 默认安装的 flashinfer 0.6.12 缺少 SM120 支持。需要升级到 0.6.14。

修复:

cp /data/yy/sskj/envs/vllm/lib/python3.12/site-packages/flashinfer* \
   /data/yy/sskj/envs/sglang/lib/python3.12/site-packages/

问题2sgl_kernel flash_mla_sparse_fwd 不支持 SM120

sglang 的 DSV4 attention backend 在 prefill 阶段有两个路径:

  1. sparse prefill: 使用 sgl_kernel.flash_mla.flash_mla_sparse_fwd只支持 SM90a 和 SM100f
  2. 非 sparse prefill: 使用 flash_mla_with_kvcache_sm120支持 SM120

触发 sparse prefill 的条件 (deepseek_v4_backend.py:1405):

if forward_batch.forward_mode.is_extend_without_speculative() and (
    q.shape[0] > _LARGE_INDEXER_QUERY_THRESHOLD  # 11673
    or envs.SGLANG_OPT_FLASHMLA_SPARSE_PREFILL.get()
):
    return self._forward_prefill_sparse(...)

warmup 阶段的 token 数超过 11673 阈值,导致触发 sparse prefill然后报错

RuntimeError: flash_mla_sparse_fwd only supports SM90a and SM100f

修复方法

修改文件:/data/yy/sskj/envs/sglang/lib/python3.12/site-packages/sglang/srt/layers/attention/deepseek_v4_backend.py

在 sparse prefill 条件判断中加入 not _is_sm120:

# 修改前 (第1405行)
if forward_batch.forward_mode.is_extend_without_speculative() and (
    q.shape[0] > _LARGE_INDEXER_QUERY_THRESHOLD
    or envs.SGLANG_OPT_FLASHMLA_SPARSE_PREFILL.get()
):

# 修改后
if forward_batch.forward_mode.is_extend_without_speculative() and not _is_sm120 and (
    q.shape[0] > _LARGE_INDEXER_QUERY_THRESHOLD
    or envs.SGLANG_OPT_FLASHMLA_SPARSE_PREFILL.get()
):

这样 SM120 上就会走下面的 flash_mla_with_kvcache_sm120 路径,而不是 flash_mla_sparse_fwd

sglang 部署命令

source /data/yy/sskj/envs/sglang/bin/activate
python -m sglang.launch_server \
  --model-path /data/hf_models/DeepSeek-V4-Flash \
  --tp 8 \
  --trust-remote-code \
  --mem-fraction-static 0.78 \
  --cuda-graph-backend-decode disabled \
  --host 0.0.0.0 \
  --port 30000

状态: 已修复,可成功部署


prefill 阶段算子选项分析

算子 来源 支持架构 说明
flash_mla_sparse_fwd sgl_kernel.flash_mla SM90a, SM100f sparse prefill性能更优不支持 SM120
flash_mla_with_kvcache sgl_kernel.flash_mla 非 SM120 GPU 标准 prefill
flash_mla_with_kvcache_sm120 sglang.srt.layers.attention.flash_mla_sm120 SM120 SM120 专用路径

结论: 对于 SM120prefill 阶段目前只有一个可用选项:flash_mla_with_kvcache_sm120

sparse prefill 的优化(flash_mla_sparse_fwd)目前不支持 SM120需要等待 sgl_kernel 更新。


是否会出现在 B300/B200 上

  • B200: SM100应该支持 flash_mla_sparse_fwd(支持 SM100f
  • B300: 需要确认具体的 SM 版本。如果是 SM120 或更高,可能会遇到同样的问题

建议在这些 GPU 上部署前先检查:

import torch
print(torch.cuda.get_device_capability())  # 查看 SM 版本

相关 GitHub Issue

vllm

sglang

建议关注以下 PR/Issue

  • flashinfer 官方 SM120 支持进度
  • sgl_kernel 官方 SM120 支持进度

长期解决方案

  1. 等待官方更新: 等待 flashinfer 和 sgl_kernel 官方支持 SM120
  2. 从源码编译: 从 sglang 源码编译 sgl_kernel添加 SM120 支持
  3. 使用 triton 算子: 如果 CUDA 算子不支持,可以尝试使用 triton 实现的替代算子

当前部署状态

框架 状态 修改文件
vllm 可部署 vllm/attention/ops/flashinfer_sm120.py
sglang 可部署 sglang/srt/layers/attention/deepseek_v4_backend.py

测试验证

vllm API 测试

curl -s -X POST http://127.0.0.1:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "DeepSeek-V4-Flash", "prompt": "Hello", "max_tokens": 10}'

sglang API 测试

curl -s -X POST http://127.0.0.1:30000/generate \
  -H "Content-Type: application/json" \
  -d '{"text": "Hello, how are you?", "sampling_params": {"max_new_tokens": 10}}'

备注

  • 以上修改都是临时 workaround建议跟踪上游官方修复
  • 如果升级 sglang 或 vllm 版本,可能需要重新应用这些修改
  • 性能方面SM120 上禁用 sparse prefill 可能会有轻微性能损失,但可以正常运行

文档生成时间: 2026-07-14