本文编译自
https://rocm.blogs.amd.com/artificial-intelligence/DeepSeekR1-Part2/README.html
我们之前
关于这个主题的博客文章
讨论了 DeepSeek-R1 如何在 AMD Instinct™ MI300X GPU 上实现具有竞争力的性能。我们还提供了与 Nvidia H200 GPU 的性能比较和一个简短的演示应用程序来说明实际使用情况。在本博客中,我们将深入探讨如何使用 SGLang 框架、关键内核优化(如 ROCm™ 的 AI Tensor Engine)和超参数调整来帮助实现性能提升。
概览
-
通过使用最新的 SGLang 框架,与 Nvidia H200 相比,MI300X 实现了
- 在相同延迟下吞吐量提高 2 到 5 倍
[
1
]
- 在相同并发性下吞吐量提高 75% 且延迟降低 60%
[
1
]
。
-
针对 ROCm软件 (AITER)内核
的 AI Tensor Engine
经过优化,可提供 +2X
GEMM
[
2
]
、+3X
MoE
[
3
]
、+17x
MLA 解码
[
4
]
、+14X
MHA 预填充
[
5
]
-
SGLang
服务
超参数调优
,得益于 MI300X 更大的内存容量,提升了大并发下的吞吐量
DeepSeek-R1 服务基准测试的关键要点
MI300X GPU 通过使用各种优化技术,在总吞吐量与端到端延迟方面全面展示了使用 SGLang 的卓越性能。下图 1 显示,使用 SGLang 框架和关键优化技术,MI300X 在延迟相似的情况下实现了比 NVIDIA H200 高达 5 倍的吞吐量。
图 1. DeepSeek R1 总吞吐量 (tks) 与延迟 (ms)
[
1
]
如图 2 所示,H200 GPU 可以在单个节点中处理多达 16 个并发请求,令牌间延迟 (ITL) 低于 50 毫秒。我们使用 SGLang 0.4.4.post1 和 flashinfer MLA 库对 Nvidia H200 GPU 上的 SGLang 性能进行了基准测试。由 8 个 GPU 组成的单个 MI300X 节点可以处理多达 128 个并发请求,同时将令牌间延迟 (ITL) 保持在 50 毫秒以下,这表明 MI300X 具有更高的用户容量来完成响应,而不会影响用户体验。
注意:将分块预填充大小参数设置为 131,072 可启用输入序列的单批处理,但这可能会导致非常大的输入序列出现内存不足 (OOM) 错误。减少分块预填充大小可实现分批预填充缓存计算,从而更好地利用模型的总上下文长度预算。然而,这会增加解码延迟,因为必须以较小的批次处理输入并在解码期间检索。鼓励读者针对其特定用例优化此参数。
图 2. DeepSeek R1 在 50 毫秒内实现更高的并发性 Token 间延迟限制
[
1
]
关键优化
优化技术使开发人员能够显著提高在 GPU 上运行的应用程序的性能,充分利用并行处理的潜力并消除内存瓶颈。AMD AI Tensor Engine for ROCm (AITER) 是一个集中式存储库,其中充满了高性能 AI 运算符,旨在加速各种 AI 工作负载。
-
ROCm 人工智能张量引擎 (AITER)
AITER 是一个全新的高性能开源 AI 算子库。它提供 Python 和 C++ API,可轻松集成到 SGlang、vLLM 和其他自定义框架中。AITER 优化了以下 DeepSeek V3/R1 内核,以在 MI300X GPU 上实现显著提升,以便用户使用该库体验到显著的性能提升。- AITER 块级 GEMM(最高提升 2 倍)- AITER 块级融合 MoE(最高提升 3 倍)- AITER MLA 用于解码(最高提升 17 倍)- AITER MHA 用于预填充(最高提升 14 倍)
-
超参数调整
当运行具有大量线程(例如 128 个或更多)的程序时,系统会因预填充吞吐量缓慢而面临瓶颈。我们发现使用更高的
chunked_prefill_size
值 可以加速预填充阶段,但代价是消耗更多的 VRAM,如图 3 所示。
图 3. DeepSeek R1 在 SGLang 上进行超参数调整后总吞吐量 (tks) 更高
[
1
]
如何重现基准
现在让我们在您的系统上重现相同的性能提升,并将相同的技术应用到您的应用程序中,以在 MI300X GPU 上获得最佳性能。
以下说明假设用户已经下载了模型。
注意:用于复制 MI300X 基准的图像是上游预演版本。此版本中的优化和性能增强预计将包含在即将发布的
lmsysorg
上游生产版本中。
带有 SGLang 的 AMD Instinct MI300X GPU
-
设置相关环境变量并启动 AMD SGLang 容器。
docker pull rocm/sgl-dev:upstream_20250312_v1
export
MODEL_DIR= saved_path>
docker run -it \
--ipc=host \
--network=host \
--privileged \
--shm-size 32G \
--cap-add=CAP_SYS_ADMIN \
--device=/dev/kfd \
--device=/dev/dri \
--group-add video \
--group-add render \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
--security-opt apparmor=unconfined \
-v $MODEL_DIR:/model \ rocm/sgl-dev:upstream_20250312_v1
2. 启动 SGLang 服务器。
python3 -m sglang.launch_server \
--model \model \
--tp 8 \
--trust-remote-code \
--chunked-prefill-size 131072 \
--enable-torch-compile \
--torch-compile-max-bs 256 &
3. 针对用户定义的并发值和所需参数运行 SGLang 基准服务脚本。
# Run after “The server is fired up and ready to roll!”
concurrency_values=(128 64 32 16 8 4 2 1)
for concurrency in "${concurrency_values[@]}"; do
python3 -m sglang.bench_serving \
--dataset-name random \
--random-range-ratio 1 \
--num-prompt 500 \
--random-input 3200 \
--random-output 800 \ --max-concurrency "${concurrency}"done
注意:使用 torch 编译标志将导致服务器启动时间更长
带有 SGLang 的 NVIDIA H200 GPU
-
设置相关环境变量并启动NVIDIA SGLang容器。
docker pull lmsysorg/sglang:v0.4.4.post1-cu125
export MODEL_DIR= saved_path>
docker run -it \
--ipc=host \
--network=host \
--privileged \
--shm-size 32G \
--gpus all \
-v $MODEL_DIR:/model \