DeepSeek V3.2 使用指南#
DeepSeek-V3.2-Exp 通过持续训练,为 DeepSeek-V3.1-Terminus 配备了 DeepSeek 稀疏注意力 (DSA)。通过 DSA(一种由闪电式索引器支持的细粒度稀疏注意力机制),DeepSeek-V3.2 在长上下文场景中实现了效率提升。
如需报告问题或跟踪即将推出的功能,请参考此路线图。
安装#
Docker#
# H200/B200
docker pull lmsysorg/sglang:latest
# MI350/MI355
docker pull lmsysorg/sglang:dsv32-rocm
# NPUs
docker pull lmsysorg/sglang:dsv32-a2
docker pull lmsysorg/sglang:dsv32-a3
从源代码构建#
# 安装 SGLang
git clone https://github.com/sgl-project/sglang
cd sglang
pip3 install pip --upgrade
pip3 install -e "python"
使用 SGLang 启动 DeepSeek V3.2#
要在 8xH200/B200 GPU 上服务 DeepSeek-V3.2-Exp:
# 使用 TP + DP 启动
python -m sglang.launch_server --model deepseek-ai/DeepSeek-V3.2-Exp --tp 8 --dp 8 --enable-dp-attention
# 使用 EP + DP 启动
python -m sglang.launch_server --model deepseek-ai/DeepSeek-V3.2-Exp --tp 8 --ep 8 --dp 8 --enable-dp-attention
配置提示#
DP Attention:对于 DeepSeek V3.2 模型,内核针对
dp_size=8的用例进行了定制,因此默认启用 DP attention 以获得更好的稳定性和性能。纯 TP 启动的功能仍在开发中。短序列 MHA 预填充(自适应):对于短预填充序列(默认阈值:2048 tokens),NSA 后端会自动使用标准 MHA(无需额外标志)。在 H200 (SM90) 上,此路径使用 FlashAttention 可变长度内核;在 B200 (SM100) 上使用 TRT-LLM 不规则 MHA。MHA 使用
MHA_ONE_SHOT以获得最佳性能。MHA_ONE_SHOT在单个内核调用中计算所有 tokens(包括缓存的 prefix 和新扩展的 tokens)的多头注意力,避免了分块 KV 缓存处理的开销。对于总序列长度在块容量限制内的短序列,这实现了最佳吞吐量。注意力内核选择:DeepSeek V3.2 模型的注意力后端自动设置为
nsa注意力后端。在此后端中,实现了用于稀疏预填充/解码的不同内核,可以通过--nsa-prefill-backend和--nsa-decode-backend服务器参数指定。NSA 预填充/解码注意力内核的选择包括:flashmla_sparse:来自flash_mla库的flash_mla_sparse_fwd内核。可以在 Hopper 和 Blackwell GPU 上运行。它需要 bf16 q、kv 输入。flashmla_kv:来自flash_mla库的flash_mla_with_kvcache内核。可以在 Hopper 和 Blackwell GPU 上运行。它需要 bf16 q、fp8 k_cache 输入。fa3:来自flash_attn库的flash_attn_with_kvcache内核。只能在 Hopper GPU 上运行。它需要 bf16 q、kv 输入。tilelang:可以在 GPU、HPU 和 NPU 上运行的tilelang实现。alter:AMD HPUs 上的 Alter 内核。只能作为解码内核使用。
基于 性能基准测试,H200 和 B200 的默认配置设置如下:
H200:
flashmla_sparse预填充注意力(短序列预填充通过 FlashAttention varlen 使用 MHA),fa3解码注意力,bf16kv 缓存数据类型。B200:
flashmla_auto预填充注意力(短序列预填充通过 TRT-LLM 不规则使用 MHA),flashmla_kv解码注意力,fp8_e4m3kv 缓存数据类型。flashmla_auto启用基于 KV 缓存数据类型、硬件和启发式方法的自动选择,选择flashmla_sparse或flashmla_kv内核进行预填充。当启用 FP8 KV 缓存且total_kv_tokens < total_q_tokens * 512时,它使用flashmla_sparse内核;否则,它会回退到flashmla_kv内核。如果flashmla_sparse或flashmla_kv内核的性能发生显著变化,可能需要调整启发式方法。
多token预测#
SGLang 基于 EAGLE 投机解码 为 DeepSeek V3.2 实现了多token预测 (MTP)。通过这种优化,在小批量大小下可以显著提高解码速度。请查看此 PR 获取更多信息。
使用示例:
python -m sglang.launch_server --model deepseek-ai/DeepSeek-V3.2-Exp --tp 8 --dp 8 --enable-dp-attention --speculative-algorithm EAGLE --speculative-num-steps 3 --speculative-eagle-topk 1 --speculative-num-draft-tokens 4
对于给定的批量大小,可以使用 bench_speculative.py 脚本搜索
--speculative-num-steps、--speculative-eagle-topk和--speculative-num-draft-tokens的最佳配置。最小配置为--speculative-num-steps 1 --speculative-eagle-topk 1 --speculative-num-draft-tokens 2,对于更大的批量大小可以实现加速。--max-running-requests的默认值设置为48用于 MTP。对于更大的批量大小,此值应增加到默认值以上。
函数调用和推理解析器#
PD 分离#
预填充命令:
python -m sglang.launch_server \
--model-path deepseek-ai/DeepSeek-V3.2-Exp \
--disaggregation-mode prefill \
--host $LOCAL_IP \
--port $PORT \
--tp 8 \
--dp 8 \
--enable-dp-attention \
--dist-init-addr ${HOST}:${DIST_PORT} \
--trust-remote-code \
--disaggregation-bootstrap-port 8998 \
--mem-fraction-static 0.9 \
解码命令:
python -m sglang.launch_server \
--model-path deepseek-ai/DeepSeek-V3.2-Exp \
--disaggregation-mode decode \
--host $LOCAL_IP \
--port $PORT \
--tp 8 \
--dp 8 \
--enable-dp-attention \
--dist-init-addr ${HOST}:${DIST_PORT} \
--trust-remote-code \
--mem-fraction-static 0.9 \
路由器命令:
python -m sglang_router.launch_router --pd-disaggregation \
--prefill $PREFILL_ADDR 8998 \
--decode $DECODE_ADDR \
--host 127.0.0.1 \
--port 8000 \
如果您需要更高级的部署方法或生产就绪的部署方法,例如基于 RBG 或 LWS 的部署,请参考 references/multi_node_deployment/rbg_pd/deepseekv32_pd.md。此外,您还可以在上述文档中找到基于 DeepEP 的 EP 并行的启动命令。
基准测试结果#
使用 gsm8k 进行准确度测试#
可以使用 gsm8k 数据集进行简单的准确度基准测试:
python3 benchmark/gsm8k/bench_sglang.py --num-shots 8 --num-questions 1319 --parallel 1319
结果为 0.956,符合我们的预期:
Accuracy: 0.956
Invalid: 0.000
Latency: 25.109 s
Output throughput: 5226.235 token/s
要测试长上下文准确度,使用 --num-shots 20 运行 gsm8k。结果与 8 shots 非常接近:
Accuracy: 0.956
Invalid: 0.000
Latency: 29.545 s
Output throughput: 4418.617 token/s
使用 gpqa-diamond 进行准确度测试#
可以在 GPQA-diamond 数据集上进行长上下文准确度基准测试,使用长输出 tokens 并启用思考模式:
python3 -m sglang.test.run_eval --port 30000 --eval-name gpqa --num-examples 198 --max-tokens 120000 --repeat 8 --thinking-mode deepseek-v3
8 次运行的平均准确度为 0.797,与官方技术报告中的 79.9 数字相符。
Repeat: 8, mean: 0.797
Scores: ['0.808', '0.798', '0.808', '0.798', '0.783', '0.788', '0.803', '0.793']
使用 aime 2025 进行准确度测试#
在 docker 或您自己的虚拟环境中安装 NeMo-Skills 来准备环境:
pip install git+https://github.com/NVIDIA/NeMo-Skills.git --ignore-installed blinker
通过将 jinja chat_template 中的
{% set thinking = false %}
替换为
{% set thinking = true %}
并将其保存到 chat_template_thinking.jinja。
使用修改后的 chat-template 文件启动 SGLang 服务器:
python -m sglang.launch_server --model deepseek-ai/DeepSeek-V3.2-Exp --tp 8 --dp 8 --enable-dp-attention --chat-template chat_template_thinking.jinja
运行以下脚本评估 AIME 2025:
#! /bin/bash
export NEMO_SKILLS_DISABLE_UNCOMMITTED_CHANGES_CHECK=1
ns prepare_data aime25
PORT=30000
BACKEND=sglang
MODEL="deepseek-ai/DeepSeek-V3.2-Exp"
MODEL_NAME="dsv32-fp8"
echo "Starting AIME25 evaluation with model $MODEL on port $PORT using backend $BACKEND..."
ns eval \
--benchmarks=aime25:4 \
--server_type=$BACKEND \
--model=$MODEL \
--server_address=http://localhost:${PORT}/v1 \
--output_dir=nemo_skills_aime25_${MODEL_NAME}_output_${BACKEND}_$(date +%Y%m%d_%H%M%S) \
++max_concurrent_requests=512 \
++server.api_key=dummy \
++inference.tokens_to_generate=64000
测试结果:
evaluation_mode |
num_entries |
avg_tokens |
gen_seconds |
symbolic_correct |
no_answer |
|---|---|---|---|---|---|
pass@1[avg-of-4] |
30 |
14410 |
1758 |
85.83% ± 4.19% |
0.00% |
majority@4 |
30 |
14410 |
1758 |
90.00% |
0.00% |
pass@4 |
30 |
14410 |
1758 |
93.33% |
0.00% |
请注意,问题#3 的 id 为 aime25-2 的结果被 nemo-skills 标记为错误,但实际上是正确的,因为 nemo-skills 无法将预测答案 016 与预期答案 16 匹配。如果我们在结果中加 1/30 = 3.33%,则 pass@1[avg-of-4] 结果与参考值 89.3 匹配。
DSA 长序列上下文并行优化(实验性)#
可以在 GPQA-diamond 数据集上进行长上下文准确度基准测试,使用长输出 tokens 并启用思考模式:
使用示例:
# 使用 EP + DP 启动
python -m sglang.launch_server --model deepseek-ai/DeepSeek-V3.2-Exp --tp 8 --ep 8 --dp 2 --enable-dp-attention --enable-nsa-prefill-context-parallel --max-running-requests 32
并行上下文提示#
CP_size 重用 atten_tp_size,等于 TP_size / DP_size。
目前仍不支持某些功能。
多批量预填充:目前预填充过程中仅支持单请求处理。
分离:P/D 分离。
跨机器支持:目前仅在单台机器上测试(TP=8,EP=8)。
其他参数:目前仅支持 moe_dense_tp_size=1,kv_cache_dtype = "bf16",moe_a2a_backend = "deepep"。
DP_size:
CP_size重用atten_tp_size,等于TP_size/DP_size。为了让 cp 函数正常工作,TP_size必须能被DP_size整除,且 TP_size / DP_size > 1(确保 CP_size > 1)。详细设计参考:https://github.com/sgl-project/sglang/pull/12065