【分享】N卡 fork - 给 sergqwer/strata-nvfp4 加上 DP 双卡预填充:2×3090 @350W 长 prompt prefill 4.7K–5.7K tok/s(附 GitHub 分支)
-
之前我分享过 nicejunjie/Strata-rdna3 的 DP 双卡预填充(STRATA_DP_PREFILL)在 CUDA 上的编译。这次我把这套 DP 移植到了 sergqwer 的 NVIDIA 分支 strata-nvfp4 0.1.44.1-nvfp4.2 上。sergqwer 的提示词处理本来就比较快,两者合在一起,是我在 2×3090 上测到最快的 Strata。
代码在这里(非官方):https://github.com/strata-dp/strata-nvfp4/tree/dp-prompt-path (分支 dp-prompt-path)
改了什么
- 基于 sergqwer/strata-nvfp4
v0.1.44.1-nvfp4.2。 - 移植了 nicejunjie 的 4 个 DP 提交(保留原作者):DP 主体、
STRATA_DP_MIN默认 8000、DP 计划拒绝的段落改用流水线 chunk、DP 计划的最后一个 chunk 检查。主体有 5 处冲突,我手动合并:prefill.cpp 用 nicejunjie 的 chunk 遍历;generate.cpp 保留 sergqwer 自己的流水线 chunk 大小,再加上 DP 的覆盖。 - 我自己补了一个小提交:chunk 循环的步长和最后一行的位置改成跟随
step_at(来自 nicejunjie 另一个没移植的提交,不补的话 DP 的 chunk 计划和循环会对不上)。 - 没有移植:
STRATA_DP_SHARE(我测过没有提升)、提前/延后回填(依赖他的张量并行代码)、张量并行相关的提交。
DP 预填充是什么
- 原版双卡是层切分:卡 0 跑 0–23 层,卡 1 跑 24–47 层,prompt 的每个 chunk 先过卡 0 再过卡 1。
- DP 模式下每张卡都放全部 dense 权重,两张卡轮流拿 chunk,各自跑完全部 48 层,每层的状态在两卡之间同步。
- 只对 ≥8,000 token 的 prompt 生效,decode 不受影响。
测试环境
- 2× RTX 3090 24 GB,各 PCIe 4.0 x16,P2P 开启(引擎日志两个方向都是
peer access on),两卡都限 350 W - 32 核 EPYC(AVX2,无 AVX-512),256 GB DDR4 八通道,Ubuntu 24.04,CUDA 13 镜像,
CUDA_ARCHITECTURES=86 - 模型:Swift 1.5 Qwen3.8-Flash-Next IQ4_XS(UkisAI GGUF),512K 上下文(YaRN ×2),int8 KV,
--kv-resident 32768,--pipeline-windows 2,--pcie-frac 0,--spec 4+ MTP - DP 设置:
STRATA_DP_PREFILL=1 STRATA_KV_HOST_DMA=1 STRATA_PREFILL_AUTO_MAX=16384,不用--trim-stage-weights - 所有引擎用同一份配置和同一个专家 profile,只换引擎
Prefill(tok/s,350 W,每个 prompt 加随机前缀避免缓存命中,max_tokens 1)
引擎 19K 43K 89K 123K 本分支(sergqwer + DP) 4,719 5,354 5,705 5,592 nicejunjie/Strata-rdna3 + DP(CUDA 编译) 4,493 5,046 5,481 5,418 上游 Niko1221/Strata main(10-28,引擎 0.1.53),无 DP2,567 3,885 4,611 4,737 - 比 nicejunjie 的 DP 分支快 3~6%。
- 比上游最新版快 18~84%,prompt 越短差距越大。
Decode(tok/s,350 W,greedy,关思考)
引擎 中文散文 中文聊天 英文技术 代码 本分支 118 130 127 209 nicejunjie + DP 121 125 118 199 上游 main127 131 126 188 DP 不改 decode 路径。上游最新版的中文散文 decode 更好一点,代码则是本分支最好。
单卡参考(1× 3090,350 W)
单卡时 DP 不会生效,本分支就等于 sergqwer 原版引擎:
19K 43K 89K 123K decode(散文 / 聊天 / 英文 / 代码) 1× 3090 2,414 2,966 2,921 2,864 110 / 113 / 109 / 163 单卡的 prefill 大约是双卡 DP 的一半,decode 慢 7~22%。
注意
- 只支持正好两张卡的层切分。 不能和
--batch、--peer-device、--trim-stage-weights一起用。 - 需要 KV streaming(配置里有
--kv-resident)。上下文 ≥ 65536 且内存够时 setup 会自动打开;WSL 下是关的,所以 DP 也开不了。 - 显存: DP 每张卡多放一份 dense 权重,所以每张卡缓存的专家比 nicejunjie 分支少约 300 个。我在一次图片请求后见过一条 "only 435 MiB of VRAM free" 的警告,没有出错,但长上下文加图片时要留意。
- P2P: 我的卡开了 P2P。GeForce 官方驱动一般没有 P2P,DP 照样能跑,只是卡间同步要经过内存中转,速度我没测。
- 350 W: 两张 3090 跑 350 W 时整机功耗接近 1 kW,电源要够。
- 这是非官方移植,基于 sergqwer 的 0.1.44.1-nvfp4.2,不是他最新的 0.2.0 版本。
- 这个分支 p2p/nvlink 帮助不大
感谢 nicejunjie 的 DP 实现,也感谢 sergqwer 的 NVIDIA 分支。
- 基于 sergqwer/strata-nvfp4
-
因为我没用iq3_s 所以就没测了
有兴趣的网友可以试试我自己用的时候都是在250w
Engine / setting Power 19K 43K 89K 123K **Port, DP ** 250 W 4,226 4,644 4,812 4,713 这已经是strata 刚出来的时候 我觉得可以用的 差不多两倍了
-
,
T terry 固定了此主题
-
,A applejuice 引用了 此主题
-
-
-
,系统 取消固定了此主题