多卡 CUDA 张量并行:DwarfStar 如何在 8 张 L40S 上跑出 120 t/s
【免费下载链接】ds4DeepSeek 4 Flash and PRO local inference engine for Metal, CUDA and ROCm项目地址: https://gitcode.com/GitHub_Trending/ds4/ds4
DwarfStar 是一个专为 DeepSeek V4 Flash / PRO 打造的本地推理引擎,同时支持 Metal、CUDA 与 ROCm 三大后端。在 8 张 NVIDIA L40S 组成的服务器上启用多卡 CUDA 张量并行后,它可以同时服务多个会话,实现约120 t/s 的聚合生成速度和 2000 t/s 的 prefill 速度。这篇文章用最少的篇幅讲清楚:这个数字是怎么来的,以及你如何自己搭起来。
先分清概念:张量并行 ≠ 流水线并行
DwarfStar 里有两种多机/多卡模式,新手最容易混淆:
| 模式 | 切分单位 | 收益 | 代价 |
|---|---|---|---|
| 流水线并行(多机) | 把不同 transformer 层放到不同机器 | 跑更大的模型、prefill 提速 1.4~1.85 倍 | 生成是自回归的,每个 token 要跨机往返,反而更慢 |
| 张量并行(单机多卡) | 把同一个 token的每层计算(路由专家、注意力头)切到多张卡上并行 | 降低单 token 延迟,多会话聚合吞吐大幅提升 | 需要卡间 P2P/快速互连 |
8 张 L40S 跑的是后者:由一个开关--cuda-tensor-parallel统一启用,不需要--role、不需要 RDMA、不需要跨机部署,GPU 放置和显存预算沿用常规的--gpu-devices与--gpu-vram参数即可。
8 张卡是怎么配对的:4 个流水线阶段 × 2
张量并行的设备顺序有讲究。对于N张卡,DwarfStar 把前 N/2 个逻辑层位(tier)作为连续的"层流水线宿主",后 N/2 个是它们的张量并行搭档。官方建议的写法是"先列全部宿主,再列全部搭档,最靠近的 P2P 对放在相同位置"。
在实测的 L40S 机器上,物理 P2P 对是(0,1)、(2,3)、(4,5)、(6,7),因此设备列表写作:
--gpu-devices 0,2,4,6,1,3,5,7这样 8 张卡 =4 个流水线阶段,每阶段是一对 P2P 卡。内存布局上做了精细优化:
- 每一对卡存储路由专家的 50/50 切分——模型里体积最大的部分不在任何一张卡上重复;
- 词表输出头(vocabulary head)按行切分(row-shard)到参与的输出层上;
- 稠密注意力、路由器和共享专家权重在对内复制,体积小、复制成本低。
相关源码入口在 ds4_cuda.cu,CUDA 侧的矩阵乘内核位于 cuda/ 目录,多 GPU 放置逻辑见 ds4_gpu_mgpu.h。
120 t/s 的秘密:微批次分组解码
光把张量切开只解决了"单卡放不下/算不快",真正的聚合吞吐来自解码微批次(micro batching):
--batched-session 16让ds4-server预分配16 个常驻 KV 会话,多用户请求各占一个会话槽位;- 各会话的"就绪解码行"跨请求分组进同一个 batch,Q4_K 路由专家布局拥有原生的分组多会话解码内核,一次 kernel 启动处理 16 个会话的解码;
- 长 prefill 以2048 token 的小块轮转(该模式下不设显式值时的默认块大小),且生成进行中每 128 token 让出一次,保证一个长 prefill 不会堵住所有解码器。
这也是为什么官方推荐 8×48GB L40S 用q4-imatrix模型:它的Q4_K路由专家布局直接命中原生分组内核;Q2 模型走精确回退路径,聚合吞吐更低,但它是省显存的选择(4 卡即可运行)。2 张卡则显存不够,撑不起 Flash 模型。
快速上手:三步启动 8 卡服务器
./download_model.sh q4-imatrix make cuda CUDA_ARCH=sm_89 ./ds4-server --cuda --cuda-tensor-parallel \ --gpu-vram auto \ --gpu-devices 0,2,4,6,1,3,5,7 \ --model gguf/DeepSeek-V4-Flash-Q4KExperts-F16HC-F16Compressor-F16Indexer-Q8Attn-Q8Shared-Q8Out-chat-v2-imatrix.gguf \ --ctx 100000 \ --batched-session 16 \ --host 0.0.0.0更省事的写法是仓库自带的启动器 run-nvidia-tp-server.sh,支持start / restart / stop / status服务管理:
./run-nvidia-tp-server.sh start该模式会自动选择 2048 的 prefill 块,以便 16 个 100k 上下文会话的常驻 KV 缓存在显存里放得下;无需任何DS4_CUDA_*环境变量微调。
关键数字一览
| 指标 | 数值 | 说明 |
|---|---|---|
| 聚合生成速度 | ~120 t/s | 8×L40S,多会话微批次 |
| Prefill 速度 | ~2000 t/s | 同上 |
| 单会话解码 | 46.93 t/s | Flash q4,2048 token prefill 基准 |
| 16 路分组解码 | 126.0 t/s | 16-row decode oracle 记录值 |
| 发布门禁下限 | 110 t/s | 16 路分组解码的硬性底线 |
最后一行来自发布质量矩阵 QA_BEFORE_RELEASES.md:官方把 16 路分组解码的聚合速度设了 110 t/s 的硬性回归门禁,掉下去就阻断发版——这也是"120 t/s"可复现、可验证的底气。
适合谁、注意什么
- 把"过时"的 Ada 卡盘活:L40S 这类 Ada Lovelace 架构的卡已不被 vLLM 等框架支持新模型,DwarfStar 能让它们变成公司内部的多用户 LLM 服务器;
- 该模式目前要求DeepSeek V4 Flash + 偶数张卡;GLM 5.2 走普通的跨卡层放置;DGX Spark 是单卡目标,不要带
--cuda-tensor-parallel启动; - 显存不够时优先减小会话数或上下文,而不是关微批次;
- 多会话分组解码与预填充混跑的正确性由 tests/test_cuda_session_batch.c 和 tests/test_cuda_mixed_batch.c 这类模型级测试守护。
更多细节(设备配对规则、启动器默认值、GLM 差异)见 README.md 的 "Tensor Parallelism across CUDA GPUs" 一节,模型下载脚本为 download_model.sh。
【免费下载链接】ds4DeepSeek 4 Flash and PRO local inference engine for Metal, CUDA and ROCm项目地址: https://gitcode.com/GitHub_Trending/ds4/ds4
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考