本文编译自 https://rocm.blogs.amd.com/artificial-intelligence/DeepSeekR1_Perf/README.html
在本博客中,我们探讨了 DeepSeek-R1 如何在 AMD Instinct™ MI300X GPU 上实现竞争性能,以及与 H200 的性能比较和一个展示实际使用情况的简短演示应用程序。通过利用 MI300X,用户可以在单个节点上以令人印象深刻的效率部署 DeepSeek-R1 和 V3 模型。在短短两周内,使用 SGLang 进行的优化已将推理速度提高了 4 倍,确保了高效的扩展、更低的延迟和优化的吞吐量。MI300X 的高带宽内存 (HBM) 和计算能力支持执行复杂的 AI 工作负载,处理更长的序列和要求苛刻的推理任务。随着 AMD 和 SGLang 社区推动持续优化(包括融合的 MoE 内核、MLA 内核融合和推测解码),MI300X 将提供更强大的 AI 推理体验。
概览
-
DeepSeek-R1
因其深度推理能力而受到广泛关注,在语言建模性能基准测试中可与顶级闭源模型相媲美。
-
AMD Instinct MI300X GPU
可以在单个节点中为新的 DeepSeek-R1 和 V3 模型提供具有竞争力的性能。
-
与 MI300X 上最初使用时的性能相比,用户使用 SGLang 后性能提升了 4 倍
。未来几周内还将进行更多优化。
-
思维链 (CoT)
受益于 MI300X GPU 增加的内存带宽和容量优势,使其能够更快、更高效地访问大内存,从而有效地支持现实世界 AI 应用中更长的序列长度。
DeepSeek 模型部署挑战
虽然大规模部署的需求比以往任何时候都强烈,但实现最佳推理性能也带来了重大的技术挑战。Deepseek-R1 是一个大型模型,具有超过 640 GB 的参数。即使以 FP8 精度进行训练,也不可能将其放入 8 个 NVIDIA H100 GPU 的单个节点中。此外,多头潜在注意力 (MLA) 和混合专家 (MoE) 架构需要高度优化的内核,以确保高效扩展和利用自定义优化。最后,调整 FP8 GEMM 内核以支持分块量化对于最大化吞吐量和性能至关重要,因此调整这些内核对于有效执行至关重要。
在 MI300X 上利用 SGLang
SGLang 是一个高性能的开源 LLM 和 VLM 服务框架。它提供高效的运行时、广泛的模型支持和活跃的社区,并在整个行业中得到越来越多的采用。AMD 是 SGLang 的主要贡献者,并一直与社区密切合作,以在 AMD Instinct GPU 上实现和优化 LLM 推理。为了在 MI300X 上提供最佳的开箱即用体验,SGLang 发布了预构建的 docker 镜像和 docker 文件。这些资产可用于生产部署,并可作为根据用例特定要求定制自定义镜像的起点。
服务基准测试的关键要点
以下是 SGLang 在 Instinct MI300X 上进行基准测试的一些关键要点:
图 1:总吞吐量(tks)[
1
]
-
对于需要低延迟的聊天应用程序等在线推理用例,单个 Instinct MI300X 节点(8 个 GPU)上的 SGLang 服务基准测试表现出强大的性能,即使并发请求多达 32 个,也能将每个输出令牌的时间 (TPOT) 保持在 50 毫秒以下。对于离线工作负载,可以使用更大的并发设置来最大化吞吐量。
-
从图 2 中我们可以看到,对于最大并发数从 1 到 32 的范围,性能主要受内存限制,而对于最大并发数在 32 到 64 之间,性能则转为受计算限制。
图 2:Deepseek R1 总吞吐量 (tks) 与延迟 (ms) [
2
]
如何重现基准
下面您将找到 MI300X 和 H200 的说明。以下说明假定模型已下载。
在 MI300X 上
-
下载 Docker 容器:
docker pull rocm/sglang-staging:20250212
-
运行docker容器:
docker run -d -it --ipc=host --network=host --privileged --device=/dev/kfd --device=/dev/dri --device=/dev/mem --group-add render --security-opt seccomp=unconfined -v /home:/workspace rocm/sglang-staging:20250212
docker exec -it bash
-
运行服务基准测试:
HSA_NO_SCRATCH_RECLAIM=1 python3 -m sglang.launch_server --model/workspace/models/DeepSeek-R1/ --tp 8 --trust-remote-code
运行客户端请求
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
在 H200 上
-
下载 Docker 容器:
docker pull lmsysorg/sglang:v0.4.2.post3-cu125
-
运行docker容器: