理解 GPU 设备顺序:ds4 CUDA 张量并行的 home 与 partner 配对策略指南
【免费下载链接】ds4DeepSeek 4 Flash and PRO local inference engine for Metal, CUDA and ROCm项目地址: https://gitcode.com/GitHub_Trending/ds4/ds4
如果你想在一张 CUDA 服务器上把DeepSeek 4 Flash / PRO跑起来,ds4 就是你要的本地推理引擎——它同时支持 Metal、CUDA 和 ROCm,能把 4-bit 量化模型拆到多张 GPU 上做张量并行。但很多新手第一步就卡住了:--gpu-devices里设备到底该怎么排?为什么官方示例写成0,2,4,6,1,3,5,7而不是0,1,2,3?
这篇文章用一个简单的home(主卡)与 partner(配卡)配对模型,把这套 GPU 设备顺序讲清楚,让你不用读源码也能正确填参数。
为什么 GPU 设备顺序很重要?
先记住一句话:ds4 的张量并行只在"偶数张 GPU"上启用,且设备顺序直接决定哪张卡和哪张卡配对。
配对规则藏在 metal_graph_cuda_tp_partner_tier 里,逻辑只有三行:
if (g_n_gpus < 2 || (g_n_gpus & 1) != 0) return -1; // 少于 2 张或奇数张 → 不启用 const int half = g_n_gpus / 2; if (tier < 0 || tier >= half) return -1; // 只有前一半能当 home return tier + half; // partner = home + N/2翻译成大白话:
- GPU 总数必须是偶数(2、4、6、8…),奇数直接放弃张量并行。
- 前 N/2 张卡是 home,后 N/2 张卡是 partner。
- 第 i 个 home 永远配对第 i 个 partner(i 从 0 开始)。
home 与 partner:两种角色怎么分工?
可以把每张卡想成一个"工位":
| 角色 | 位置 | 职责 |
|---|---|---|
| home(主卡) | 设备顺序的前 N/2 张 | 一层 Transformer 的"主场",放这一层的 KV 缓存、注意力权重,并发起计算 |
| partner(配卡) | 设备顺序的后 N/2 张 | 和 home 做张量并行,分担专家计算与注意力 |
一个层属于哪张 home,由placement(放置数组)决定,代码在 head_tier 捕获处:
g->head_tier = placement ? placement[DS4_N_LAYER + 1] : 0;在解码阶段,当前正在跑的这张 home 卡就是active_tier,它的 partner 在 这里算出:
const int cuda_tp_home_tier = g->active_tier; // 当前 home const int cuda_tp_partner_tier = ...partner_tier(cuda_tp_home_tier); // 它的 partner一对一配对规则:第 i 个 home 配第 i 个 partner
官方示例最能说明问题。以测试用的 8 张 L40S 主机为例,物理上最靠近、P2P 带宽最好的卡是(0,1)、(2,3)、(4,5)、(6,7)。要让"最近的 P2P 卡"处在同一个配对位置,设备顺序就必须写成:
0, 2, 4, 6, 1, 3, 5, 7 └─home─┘ └─partner─┘按"前一半是 home、后一半是 partner"切分后,配对自动变成:
- home
0↔ partner1 - home
2↔ partner3 - home
4↔ partner5 - home
6↔ partner7
这正好命中物理上的(0,1)、(2,3)、(4,5)、(6,7)。这段说明来自 README 张量并行章节。
内存怎么分配:专家 50/50、词表行切分
配对不只是"一起算",还直接决定显存怎么摊:
- 路由专家(routed experts)50/50 切分:每个 home–partner 对各自存一半专家权重,避免整份大张量重复。
- 词表输出头(vocabulary head)按行切分:横跨参与的输出层卡,见 metal_graph_cuda_tp_output_tiers_for_head——它先放 home、再放 partner,保证输出张量被正确分片。
- 稠密注意力、路由器和共享专家:在每个配对内部各自复制一份,不跨对共享。
也就是说,大张量不复制,小张量才复制,这正是 8×48GB 显存能塞下模型的关键。
最快上手:一条命令跑 8 卡 L40S
配置设备顺序,本质就是用--gpu-devices按"先 home 后 partner"的次序列出卡号。下面这条命令就是官方在 8 卡 L40S 上使用的交互式 Agent 配置(完整上下文见 README):
MODEL=gguf/DeepSeek-V4-Flash-Q4KExperts-F16HC-F16Compressor-F16Indexer-Q8Attn-Q8Shared-Q8Out-chat-v2-imatrix.gguf ./ds4-agent --cuda --cuda-tensor-parallel \ --gpu-vram auto \ --gpu-devices 0,2,4,6,1,3,5,7 \ --model "$MODEL" \ --ctx 100000💡 提示:
--cuda-tensor-parallel才是开关,--gpu-devices只是"排座位"。两者都要对,张量并行才会真正生效。
常见问题速答
- 为什么我的卡没配对成功?检查 GPU 总数是不是偶数——奇数张时
metal_graph_cuda_tp_partner_tier直接返回-1,张量并行不会启用。 - 设备顺序填错会怎样?配对错位会让 home 和它"以为的"partner 不在同一对物理卡上,P2P 带宽下降、显存预算估算失准,甚至因
g_gpu_peer_ok校验失败而无法启动。 - 2 张卡怎么填?最简单:
0,1即可(home=0,partner=1)。 - 多机(Mac 互联)和单机 8 卡是一回事吗?不是。Mac 间走 RDMA、用
--role;本文讲的单机 CUDA 张量并行不走分布式管线,二者互不依赖(见 Tensor Parallelism 章节)。
小结
记住三句话就够了:
- 偶数卡才启用张量并行;
- 前半是 home、后半是 partner,第 i 对第 i;
- 把物理上最近的 P2P 卡放到同一个配对位置(如
0,2,4,6,1,3,5,7)。
掌握这套 home / partner 配对策略,你就能为任意偶数卡数正确写出--gpu-devices,让 ds4 把 DeepSeek 4 稳稳地拆到多张 GPU 上跑起来。
📚 延伸阅读:多卡放置与 VRAM 预算见 ds4_gpu_mgpu.h,8 卡 TP 启动脚本见 run-nvidia-tp-server.sh。
【免费下载链接】ds4DeepSeek 4 Flash and PRO local inference engine for Metal, CUDA and ROCm项目地址: https://gitcode.com/GitHub_Trending/ds4/ds4
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考