DGX Spark 双机 RoCE 互联部署 DeepSeek V4 Flash 0731 实战全记录
项目背景
使用两台 NVIDIA DGX Spark (GB10, 288GB) 通过 RoCE v2 直连,以 TP=2 跨节点运行 DeepSeek V4 Flash 0731(NVFP4 量化,原生 1M token 上下文)。
Gitee 仓库(完整代码 + 一键脚本): alexlu0912/dgxspark_deepseekv4flash0731
硬件拓扑
DGX Spark #1 (Head) DGX Spark #2 (Worker)
GPU: 1x GB10 (288GB) GPU: 1x GB10 (288GB)
RoCE: 10.10.12.11 RoCE: 10.10.12.21
└── RoCE v2 (enp1s0f0np0, MTU 9000) ──┘
部署方案
核心组件
- 推理框架: vLLM(anemll 定制版
dspark-vllm-gx10:0.1.1,专为 GB10 SM121 编译) - 镜像来源:
ghcr.nju.edu.cn/anemll/dspark-vllm-gx10:0.1.1(南京大学 GHCR 镜像代理) - 网络: NCCL over RoCE v2(
NCCL_IB_HCA=rocep1s0f0,GID_INDEX=5) - 容器模式: Docker
--network host(NCCL RDMA 数据路径必须直通物理 HCA,bridge 模式会失败) - 模型权重: ~156GB,支持 HuggingFace / ModelScope 两种下载方式
关键参数说明
| 参数 | 值 | 说明 |
|---|---|---|
max-model-len |
1,048,576 | 1M 上下文 — DeepSeek V4 Flash 原生 YaRN,factor=16 |
gpu-memory-utilization |
0.78 | 安全上限,不是实际占用。实测只占用约 79GB/288GB (~27%) |
max-num-seqs |
6 | 最大并发数。有余量可调至 8-10 |
kv-cache-dtype |
nvfp4_ds_mla | 4-bit 量化 KV Cache,大幅提升上下文容量 |
speculative-config |
dspark (k=5) | DGX Spark 硬件推测解码 |
moe-backend |
flashinfer_b12x | GB10 专用 MoE 后端 |
一键准备脚本(prepare.sh)
项目提供交互式菜单引导完成全部环境准备:
- 拉取 Docker 镜像(~29GB)
- 从 ModelScope 下载模型权重(~156GB)
- 自动配置 RoCE 网络(IP + MTU 9000 + 禁用 NetworkManager)
- 支持一键全部执行 + 智能跳过已完成的步骤
启动脚本 start-head.sh / start-worker.sh 自动检测 RoCE 网卡 MTU 并选择正确的 NCCL_IB_GID_INDEX。
性能实测
TP=2 双节点,79GB 显存 / GPU(占用仅 27%):
| 场景 | 吞吐 | 首 Token 延迟 |
|---|---|---|
| 代码生成 (500 tokens) | ~61 tok/s | ~960ms |
| 长文本 (500 tokens) | ~45 tok/s | ~1s |
踩坑记录
部分关键问题:
1. NODE_RANK 冲突 — Head 和 Worker 都误设为 node-rank=0,NCCL 握手超时。Worker 必须 node-rank=1。
2. docker bridge 模式 RDMA 失败 — 容器桥接/NAT IP 导致 mlx5 HCA 绑定失败,--network host 是唯一可靠方式。
3. 每次重启 JIT 编译超慢 — 未挂载 HuggingFace 缓存目录,FlashInfer autotune 缓存丢失。解决:持久化挂载 host 目录。
4. RoCE IP 重启丢失 — NetworkManager 覆盖手动配置。解决:nmcli dev set enp1s0f0np0 managed no。
5. NCCL 初始化时序 — Worker 应先于 Head 启动。两边都就位后各自加载模型约 150 秒,约 18-20 分钟完成首冷启动。
更多(共 9 条)见仓库 troubleshooting.md。
开源地址
Gitee: alexlu0912/dgxspark_deepseekv4flash0731
包含:一键部署脚本、NCCL 参数详解(13 个环境变量)、性能 benchmark 数据(20 组)、9 条踩坑全记录、Docker 启动命令详解。
欢迎交流讨论!