【免费下载链接】DeepSeek-v4-Flash-DSpark-2x-DGX-Spark
DeepSeek-v4-Flash 0731 recipe for 2x DGX Sparks
DeepSeek-v4-Flash-DSpark-2x-DGX-Spark 是一套让两台 NVIDIA DGX Spark(GB10,TP=2)跑满 DeepSeek V4 Flash Vision-Exp 的开源 recipe:vLLM 张量并行、DSpark 投机解码、1M token 上下文、原生图片输入。整个部署的行为几乎全部由一个文件控制——.env.dspark,里面包含 40+ 个关键开关:并发槽位、思考深度、NCCL/RoCE 网络、JIT 缓存、十几个 opt-in 热修复。这篇指南带你快速读懂这些开关、看懂并发基准数据,并绕开新手最容易踩的坑。
上图是默认配置(MAX_NUM_SEQS=6、NVFP4 DS-MLA KV)下的实测并发基准:并发升到 c=6 时,聚合吞吐约 158–190 tok/s,TTFT 稳定在 1.3–2.4 s——这正是.env.dspark里那组默认值想帮你守住的平衡点。
一分钟上手:复制、改值、重启
cp .env.dspark.example .env.dspark # 复制模板 # 编辑 .env.dspark,至少填好集群地址与网卡名 ./prepare-dspark-model-cache.sh --yes # 拉权重 ./stop-deepseek-v4-flash-dspark.sh # 改完开关后先停 ./start-deepseek-v4-flash-dspark.sh # 再启动模板文件.env.dspark.example自带逐行中文级注释;启动脚本每次都会把 head 节点的.env.dspark同步到 worker。官方开关矩阵见 README.md 的 “.env.dsparkswitches” 章节,Anemll 与 Stage-C 两套镜像的差异矩阵见 docs/ENVS.md。
⚠️ 铁律一:任何开关改动后都要
./stop-…+./start-…重建两个 rank 的容器。docker compose restart会复用容器的可写层,已经打进去的补丁和旧环境变量不会被还原,等于“改了没生效”。
8 组核心配置速查表
下面按功能分组列出.env.dspark.example中最常用的开关(共 50+ 项,下表覆盖 40+ 关键项)。⭐ 为新手必须理解的核心项。
1️⃣ 集群与节点寻址
| 变量 | 默认值 | 作用 |
|---|---|---|
⭐WORKER_HOST | — | worker 节点的 SSH 地址,必填 |
⭐MASTER_ADDR/MASTER_PORT | 25000 | head 节点 RoCE IP / 分布式端口 |
NODE_RANK | 0 | head 为 0;worker 节点写1并配HEADLESS=1 |
VLLM_HOST_IP/WORKER_VLLM_HOST_IP | — | 两节点各自的 RoCE IP,防止 ZeroMQ 绑错网卡 |
WORKER_DIR/WORKER_SCRIPT_DIR | 空 | worker 仓库路径与 head 不同时才需要 |
DSPARK_RESTART_POLICY | unless-stopped | 开机自恢复;systemd 下配SuccessExitStatus=3 |
DSPARK_STOP_GRACE | 10s | 停止宽限期,别设 180s(会挂死) |
2️⃣ NCCL / RoCE 网络
| 变量 | 默认值 | 作用 |
|---|---|---|
⭐NCCL_IB_HCA | — | RoCE HCA 选择器,两台机器的口名可能不同 |
WORKER_NCCL_IB_HCA等 4 个 | 继承 head | worker 口名与 head 不一致时单独指定 |
NCCL_SOCKET_IFNAME/TP_SOCKET_IFNAME/GLOO_SOCKET_IFNAME | — | 各条通道的绑定网卡 |
NCCL_CROSS_NIC | 1 | 跨 NIC 直通 |
NCCL_NET/NCCL_IB_DISABLE | IB / 0 | 强制走 InfiniBand 栈 |
NCCL_GIN_ENABLE | 未设(=开) | 设0走 CPU 发起的 comm-init,启动可从 ~2 分钟降到 ~13 s |
💡 GB10 的 QSFP 口会枚举成两块虚拟网卡(2× PCIe Gen5 x4)。实测在NCCL_IB_HCA里同时列出两个控制器(如rocep1s0f0,rocep1s0f1),端到端吞吐可提升约 7.6%(1311→1410 tok/s 单流场景)——这是网络组里性价比最高的一个调优点。
3️⃣ 权重与模型缓存
| 变量 | 默认值 | 作用 |
|---|---|---|
⭐ABLITERATED | 0 | 官方 Vision-Exp 权重;1叠加拒绝方向投影(需先同意 gated 条款) |
DSPARK_MODEL_OFFICIAL | deepseek-ai/…Vision-Exp | 官方权重仓库 id |
DSPARK_REVISION | 86f746b3… | 权重 commit 锁;置空则跟踪 main |
DSPARK_WORKER_HF_NFS | 0 | 1= worker 通过 NFSv4 挂 head 缓存,省一次 150+ GiB 下载 |
HF_CACHE/WORKER_HF_CACHE | — | 两节点的 HuggingFace 缓存目录 |
HF_HUB_OFFLINE/TRANSFORMERS_OFFLINE | 1 | 缓存齐全后离线运行 |
SERVED_MODEL_NAME | deepseek-v4-flash-vision-exp | 对外模型别名(可空格分隔多个) |
4️⃣ 服务形态与并发(性能主战场)
| 变量 | 默认值 | 作用 |
|---|---|---|
⭐MAX_MODEL_LEN | 1048576 | 单请求上下文上限(1M) |
⭐MAX_NUM_SEQS | 6 | 并发槽位。调高吞吐涨,但稀疏 MLA 卡顿风险随验证行数上升,无“通用安全值” |
MAX_NUM_BATCHED_TOKENS | 8192 | 每步 prefill token 预算;槽位调高时配套提到12288 |
LONG_PREFILL_TOKEN_THRESHOLD | 1024 | issue #27 分块上限,保证 decode 车道不被长 prefill 饿死 |
DSPARK_MAX_INFLIGHT_PREFILLS | 1 | 在途 partial prefill 数(1–3);2是官方 A/B 背书的折中档 |
⭐GPU_MEMORY_UTILIZATION_TEXT | 0.835 | KV 池大小;CUDA graph 捕获 OOM 时降到 ~0.78 |
⭐MTP_NUM_TOKENS | 6 | DSpark 投机深度 k;必须 ≥5 且被num_nextn_predict_layers=3整除 |
DRAFT_SAMPLE_METHOD | probabilistic | 草稿采样方式;官方 0731 卡配greedy |
DEFAULT_THINKING | low | 默认思考深度(off/low/high/max),请求级参数可覆盖 |
LIMIT_MM_PER_PROMPT | image=8 | 每请求最多图片数(仅 user 消息可用图) |
5️⃣ API 与推理控制
| 变量 | 默认值 | 作用 |
|---|---|---|
⭐VLLM_HOST/VLLM_PORT | 0.0.0.0/ 8888 | 监听地址与端口,./start-… --port可临时覆盖 |
VLLM_API_KEY/DSPARK_API_KEYS | 空 | 单 key / 多 key 鉴权,二者互斥,同时设会直接 exit 2 |
VLLM_ENABLE_RESPONSES_API_STORE | 0 | Responses API 有状态续写(store=true)开关 |
DSPARK_RESPONSES_STORE_MAX_ENTRIES | 256 | 上述存储的终态条目上限 |
DSPARK_SUPPRESS_STOPS_IN_REASONING | 1 | 客户端stop串等到 ` |
才生效,避免空 content | |VLLM_PREFIX_CACHE_RETENTION_INTERVAL|4096| issue #26:SWA 前缀缓存检查点间距(256 的倍数) | |DSPARK_ENABLE_DSPARK_SWA_PREFIX|0| 修复 prefix cache 命中后草稿 SWA 缓存为空导致的截断退化 |
6️⃣ 热修复与实验开关(默认全关,按需开启)
| 变量 | 作用(设为 1 时) |
|---|---|
DSPARK_ENABLE_ISSUE31_GPU_HOTFIX | 支持thinking_token_budget字段(默认发该字段会 HTTP 400) |
DSPARK_ENABLE_ISSUE141_SPARSE_MLA_CHUNK | 超大稀疏 MLA decode 调用切 ≤64 行,缓解 #141 随机卡顿(缓解而非根因修复) |
DSPARK_ENABLE_ISSUE136_XGRAMMAR_HOTFIX | XGrammar 终止与 post-reasoning 草稿校验回移链 |
DSPARK_ENABLE_ISSUE191_TOOLCALL_FAILCLOSED | tool_choice 命名/必填契约:违规重生成后仍失败则返回 500 而非错误 200 |
DSPARK_ENABLE_ISSUE138_RESPONSES_HISTORY_COMPAT | 放宽 Responses 全历史回放的校验 |
DSPARK_ENABLE_CODEX_AGENT_MESSAGE_COMPAT | 兼容 Codex 私有agent_message条目 |
DSPARK_ENABLE_DSPARK_BLOCK_K | 解除 k 整除规则,Vision-Exp 可用训练值 k=5 |
DSPARK_ENABLE_ROPE_SWA_FIX | 上游 vllm#54815:SWA 层用普通 RoPE 而非 YaRN |
DSPARK_ENABLE_DSML_RECOVERY | 外层 tool_calls 包裹损坏时回收裸<invoke>,不再泄漏进正文 |
DSPARK_ENABLE_SP_INDEXER | 长 prefill 序列并行 Lightning indexer,长上下文 TTFT 利器(阈值DSPARK_SP_INDEXER_MIN_KEYS,默认 8192) |
DSPARK_ENABLE_MXFP4_INDEXER_CACHE | MXFP4 indexer K 缓存,logits 读减半(需先开下一项) |
DSPARK_ENABLE_DEEPGEMM_SM121_ALIAS | 冷 JIT 缓存下补齐sm121_*头文件别名 |
DSPARK_ENABLE_C128A_PREFILL_CACHE | 跨层复用 C128A prefill 索引换算 |
DSPARK_ENABLE_ISSUE144_EFFORT_ALIGN | 对齐 effort 指令前缀,打通跨档位的缓存命中 |
DSPARK_ENABLE_ASSISTANT_FINAL_HOTFIX | 修复 messages 以 assistant 结尾时的“死状态”空转 |
DSPARK_ENABLE_REPLICATE_MARKOV/DSPARK_ENABLE_ADAPTIVE_CHUNK | 复制 Markov 头 / 自适应 prefill 分块(A/B 未达收益,默认关) |
7️⃣ 运行时缓存与 NCCL 透传
| 变量 | 默认值 | 作用 |
|---|---|---|
TRITON_CACHE_DIR | /cache/huggingface/triton-cache | Triton JIT 缓存持久化(issue #117:否则每次重启重新编译,可能拖垮 TP 对端超过 NCCL 看门狗) |
TILELANG_CACHE_DIR/B12X_CUTE_COMPILE_CACHE_DIR | HF 卷路径 | TileLang / CuTeDSL 编译缓存,同理 |
VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS | 1800 | sample_tokensRPC 超时(原生 300s,中途 JIT 会超时杀引擎) |
TORCH_FR_BUFFER_SIZE/TORCH_NCCL_DUMP_ON_TIMEOUT | 2000 / 1 | NCCL 飞行记录仪:超时自动 dump 证据 |
TORCH_FR_DUMP_TEMP_FILE/TORCH_NCCL_DEBUG_INFO_PIPE_FILE | HF 卷 / /tmp | dump 落盘路径与手动触发管道 |
NCCL_IB_MERGE_NICS/NCCL_GIN_ENABLE/NCCL_DMABUF_ENABLE等 5 个 | 未设 | 空值会被 entrypoint 归一化为“不存在”,不遮罩 NCCL 默认值 |
PYTORCH_CUDA_ALLOC_CONF | expandable_segments:True | 显存分配段扩展 |
CUTE_DSL_ARCH/TORCH_CUDA_ARCH_LIST | sm_121a/12.1a | GB10 编译目标,别用错架构 |
8️⃣ 启动器侧辅助项
| 变量 | 默认值 | 作用 |
|---|---|---|
DSPARK_BOOT_SHAPE_WARMUP | 1 | 启动后自动打 35 个精确 token 数请求,预热 Triton shape 桶,避免首请求中途 JIT |
DSPARK_WARMUP_REQ_TIMEOUT | 240 | 预热单请求超时(秒),首次启动编译慢就调大 |
WORKER2_HOST等 10 个 | 空 | 仅三节点 TP=3(./start-tp3.sh)使用,两节点启动完全忽略 |
TP3_MAX_NUM_SEQS | 空 | TP=3 槽位数,CLI--max-num-seqs优先 |
DSPARK_VLLM_IMAGE | Anemll 0.1.1 摘要锁 | 镜像 digest 锁,升级三步法写在注释里 |
调高 MAX_NUM_SEQS 前必读:并发与稳定性
.env.dspark.example里有一段很长的“STABILITY”注释,是本项目最值钱的血泪记录:
- 高吞吐数字是真实的:N=32 时 c=32 聚合约 325 tok/s(对照默认 N=6 的 c=6 约 160);
- 但 issue #141 的卡顿按突发(burst)随机发生,某台机器干净跑 3 轮,第 4 轮死锁在稀疏 MLA decode 里(约 700–900 秒墙钟后
RuntimeError("cancelled")); - 没有任何被测
MAX_NUM_SEQS被证实“普遍安全”,改它只改变发生概率,不是修复; - 更隐蔽的是轻度症状:短卡顿 → 批次取消 →静默截断(没有
finish_reason、没有抢占、没有任何指标告警)。调高并发后,除了看重启,更要盯“缺失的finish_reason”。
默认的 48 行验证规模(N=6, k=6 补齐)恰好低于观测到的 64/65 行边界,这是默认值保守的由来。单用户长上下文场景,建议直接留在 2 节点默认档;想要 16 槽 + ~200 tok/s 聚合,看 docs/TP3.md 的三节点方案。
新手最容易踩的 7 个坑
- 改了开关只
docker compose restart。容器可写层里的补丁和旧环境变量不会还原。正确姿势永远是./stop-deepseek-v4-flash-dspark.sh && ./start-deepseek-v4-flash-dspark.sh。 - 手填
GPU_MEMORY_UTILIZATION或DSPARK_MODEL。前者由启动脚本从GPU_MEMORY_UTILIZATION_TEXT导出,手填会打架;后者只应通过ABLITERATED间接切换。 - 在 Anemll 0.1.1 上开 Stage-C 的
VLLM_DSPARK_*变量。它们只注册在 Stage-C overlay 里(recipe/overlay/vllm/envs.py),在默认镜像里只会打出Unknown vLLM environment variable detected警告然后被忽略——看起来“没生效”,其实根本没生效。要启用需换成 Stage-C 镜像并合并 docker-compose.stage-c.override.yml。 DEFAULT_THINKING=max却只给 512 的max_tokens。max 档的实测推理可吃掉 ~12.5k tokens,答案会整个没着落(finish_reason: length、content 为空)。要么调大 token 预算、要么降档、要么启用 #31 热修复发thinking_token_budget。MTP_NUM_TOKENS设为 5。校验脚本 validate-dspark-config.sh 会拦住:Vision-Exp 要求 k≥5 且能被 3 整除,所以是 6、9……想跑 k=5 需同时开DSPARK_ENABLE_DSPARK_BLOCK_K=1。- 多 key 鉴权不加引号。启动脚本会
source这个文件,空格分隔的多 key 不加引号时第二个 key 会被当命令执行。另注意:设了任一 key 变量后,文件里必须带补丁 patches/hotfix-vllm-redact-api-key-log.sh,且文件建议chmod 600——key 会出现在容器 argv 和docker inspect里,轮换必须 stop/start。 - 两台机器的 RoCE 口名不同却只填 head。GB10 环网上 worker 的 facing port 常与 head 不同,记得用
WORKER_NCCL_IB_HCA等 4 个变量单独指定;GID 索引默认自动解析(NCCL_IB_GID_AUTO=1),手动 pin 反而可能在重启后失效。
启动失败的排查顺序
./validate-dspark-config.sh # 1. 先校验 .env.dspark(模型、k 值、捕获规模等) ./status-deepseek-v4-flash-dspark.sh # 2. 看双节点健康状态 ./logs-deepseek-v4-flash-dspark.sh # 3. 拉双节点日志 ./smoke-deepseek-v4-flash-dspark.sh # 4. 冒烟请求四个脚本都在仓库根目录,配合 docs/PATCHES.md 的热修复证据记录,基本能覆盖 90% 的启动问题。如果确认某个开关“改了没生效”,先问一句:我是不是只做了 restart 而不是 stop+start?
写在最后
.env.dspark的设计哲学很清楚:默认值就是被 A/B 过的安全档,注释就是实验记录。每个DSPARK_ENABLE_*开关背后都对应一份实测数据(如 docs/CLAUDE/ab-results-2026-09-03.md),开之前花两分钟读一下注释里的测量结论,比盲目试错快得多。先从默认档跑通 6 并发 ~160 tok/s 的基线,再按需逐个打开实验开关,是这条 2× DGX Spark 路线上最稳的调优节奏。
【免费下载链接】DeepSeek-v4-Flash-DSpark-2x-DGX-Spark
DeepSeek-v4-Flash 0731 recipe for 2x DGX Sparks
相关推荐
大麦自动抢票快速教程:一套配置跑通从开售到下单的全流程
大麦自动抢票快速教程:一套配置跑通从开售到下单的全流程 ticket purchase 是一个大麦自动抢票开源项目:网页端用 Selenium 驱动 Chrom
GUI 自动化RPA训练不踩坑!LLaMA-Factory关键指标监控全指南
训练不踩坑!LLaMA Factory关键指标监控全指南 你是否曾在模型训练时面对满屏日志却不知从何下手?训练曲线异常波动却找不到原因?本文将带你掌握LLaMA
人工智能大模型微调LoRA强化学习RLHF预训练模型评测Ory Kratos 安全配置 10 大关键点:Cookie、CSRF 与密钥管理避坑清单
Ory Kratos 安全配置 10 大关键点:Cookie、CSRF 与密钥管理避坑清单 Ory Kratos 是一个无头(Headless)的云原生认证与身
后端认证鉴权
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考