Prhub

#33131 feat(cookbook): add DGX Spark support for Inkling-Small

原始 PR 作者 yvbbrjdr 合并时间 2026-08-01 08:25 文件变更 9 提交数 2 评论 1 代码增减 +100 / -19

执行摘要

为 Inkling-Small 增加 DGX Spark 多节点部署指南与配置

PR body 明确指出:Two Sparks over ConnectX-7 can run the NVFP4 checkpoint with TP=2, but the cookbook lacked a shared hardware catalog entry and a launch recipe for this platform。DGX Spark 是桌面级 Blackwell 平台,硬件目录没有对应条目,用户无法直接生成可复制的部署命令;作者声明 Accuracy/Speed 数据 N/A(docs/cookbook only),基准卡片以 stub 占位。

值得快速浏览:它展示了“部署文档如何产品化”的设计取舍,尤其是 multiNodeDockerFlags 与 multiNodeHints 的职责划分、以及 Mintlify 限制下双引擎重复实现的应对方式。若你在维护 cookbook 或文档站点的部署命令生成器,建议精读 _deployment.jsx 的 fabricFlagsOf 与 _playground.jsx 的 HW_MULTINODE_DOCKER_FLAGS,并留意两处同步的维护约定。

讨论亮点

本 PR 没有公开的 review 评论(仅有的 issue 评论是 gemini-code-assist 的停服通知),但第二个提交里承载了最有价值的设计决策。合并者 zijiexia 在 commit 4bca725 中说明:初版把 DGX Spark 的 ConnectX-7 标志放进 multiNodeHints,但该字段渲染为 # 注释并同时出现在 Python 输出上方,docker 标志出现在 Python 输出里不符合语义;因此改为新增 multiNodeDockerFlags 挂在硬件目录条目上,由 Deploy/Playground 引擎直接注入多节点 docker run 命令。这是一次“职责划分”的纠偏:平台不变的 docker 标志归属硬件条目,面向用户的提示语才放 multiNodeHints。

实现拆解

整个变更围绕文档站点的“部署命令生成引擎 + 模型配置数据”展开,按以下步骤落地:

  1. 共享硬件目录扩展(docs_new/src/snippets/_deployment.jsx):在 HARDWARE_CATALOG.blackwell 中新增 dgx-spark 条目(128 GB 统一内存),并把硬件条目 schema 扩展出 multiNodeDockerFlags 字段;新增 fabricFlagsOf(hwId) 解析函数,优先级为模型私有 config.hardware 优于共享目录,未声明时返回空数组。docker 模式下,多节点命令会在 --network host 之后注入该平台的 fabric 标志(--ulimit memlock=-1:-1、--cap-add IPC_LOCK、--device /dev/infiniband),单节点不注入。这是本 PR 的核心机制改动,让平台级 docker 标志成为硬件目录的固有属性。

  2. Inkling-Small 模型配置(docs_new/src/snippets/configs/thinkingmachines/inkling-small.jsx):supportedHardware 增加 dgx-spark;dockerImages 映射专用镜像 lmsysorg/sglang:dev-inkling-small-dgx-spark(arm64 CUDA 13、NCCL 2.30.7);新增 verified cell(hw: dgx-spark × strategy: balanced × quant: nvfp4 × nodes: multi-2),flags 组合为 --tp 2、--attention-backend triton、--fp4-gemm-backend marlin、--moe-runner-backend marlin、--disable-prefill-cuda-graph 等;env 中开启 SGLANG_ENABLE_UNIFIED_RADIX_TREE=1。同时更新 Playground gates:TP 旋钮新增值 2(限 DGX Spark)、FlashInfer TRT-LLM/AITER/Triton MoE 后端对 dgx-spark 隐藏(SM121 无 FP4 runner,回退 Marlin W4A16)、PD 拆分对 dgx-spark 隐藏(个人平台非数据中心拓扑)。

  3. Playground 引擎同步(docs_new/src/snippets/_playground.jsx):由于 Mintlify 会剥离模块级状态,Deployment 与 Playground 两个引擎无法共享同一常量表,因此在 renderCommandLines 内镜像 HW_MULTINODE_DOCKER_FLAGS 映射,多节点 docker 命令输出与 Deployment 引擎保持一致,注释明确要求两边同步修改。

  4. 配套数据与文档:inkling-small-benchmarks.jsx 增加 dgx-spark × multi-2 占位条目(sglang_version: dev-inkling-small-dgx-spark,精度 TBD);Inkling-Small.mdx 补充镜像拉取列表与部署要点(TP=2、Triton attention、Marlin、禁用 prefill CUDA graph、ConnectX-7 docker flags);.claude/skills 下 cookbook-add-model、cookbook-review-pr、cookbook-migrate-model 四个技能文档同步更新 multiNodeDockerFlags 的字段语义、硬件目录表与 review 检查规则。

  5. 测试配套:无新增自动化测试,PR 声明 docs/cookbook only;PR body 中 CI extra 通道标记失败,具体原因未在材料中说明。

文件 模块 状态 重要度
docs_new/src/snippets/_deployment.jsx 部署引擎 modified 6.77
docs_new/src/snippets/configs/thinkingmachines/inkling-small.jsx 模型配置 modified 6.68
docs_new/src/snippets/_playground.jsx 交互面板 modified 4.91
docs_new/src/snippets/configs/thinkingmachines/inkling-small-benchmarks.jsx 基准数据 modified 4.09
docs_new/cookbook/autoregressive/ThinkingMachines/Inkling-Small.mdx 部署文档 modified 2.38
.claude/skills/cookbook-add-model/SKILL.md 技能文档 modified 2.23
.claude/skills/cookbook-add-model/references/authoring-reference.md 技能文档 modified 2.11
.claude/skills/cookbook-review-pr/SKILL.md 技能文档 modified 2.1
.claude/skills/cookbook-migrate-model/references/dimension-mapping.md 技能文档 modified 1.63

关键符号

fabricFlagsOf renderCommandLines

关键源码片段

docs_new/src/snippets/_deployment.jsx core-logic

共享部署命令生成引擎,新增 dgx-spark 硬件目录条目与 multiNodeDockerFlags 机制,fabricFlagsOf 在多节点 docker 命令中注入 ConnectX-7 RDMA 标志,是所有模型 cookbook 页共用的核心引擎。

// ---- 1. 硬件目录:DGX Spark 条目 ----
// GB10 Grace Blackwell,128 GB 统一内存(非独立 VRAM)。
// multiNodeDockerFlags 是该平台多节点互联所需的 docker run 标志:
// ConnectX-7 RDMA 需要 pinned memory(--ulimit memlock)与 IB 设备透传。
// 放在硬件条目上是因为它平台不变,任何模型选择 dgx-spark 都会自动携带。
const HARDWARE_CATALOG = {
  blackwell: [
    { id: 'b300', label: 'B300', vram: '288GB' },
    { id: 'gb300', label: 'GB300', vram: '288GB' },
    { id: 'b200', label: 'B200', vram: '192GB' },
    { id: 'gb200', label: 'GB200', vram: '192GB' },
    {
      id: 'dgx-spark', label: 'DGX Spark', vram: '128GB',
      multiNodeDockerFlags: [
        '--ulimit memlock=-1:-1', '--cap-add IPC_LOCK', '--device /dev/infiniband',
      ],
    },
  ],
  hopper: [/* ... */],
  amd: [/* ... */],
};// ---- 2. fabric 标志解析 ----
// config.hardware(模型私有)优先于共享 HARDWARE_CATALOG;
// 两者都没有则返回空数组,保证老硬件零影响。
const fabricFlagsOf = (hwId) => {
  const extra = (config.hardware || []).find((h) => h.id === hwId);
  if (extra) return extra.multiNodeDockerFlags || [];
  for (const list of Object.values(HARDWARE_CATALOG)) {
    const hit = list.find((h) => h.id === hwId);
    if (hit) return hit.multiNodeDockerFlags || [];
  }
  return [];
};// ---- 3. docker 命令组装(docker 模式) ----
const dockerLines = [
  ...gpuAccessLines,
  // 多节点需要 host 网络打通跨节点 rendezvous 端口与 NCCL/GLOO 流量;
  // 单节点只映射 serve 端口。
  multinode ? '  --network host' : `  -p ${servePort}:${servePort}`,
  // 仅多节点场景注入 fabric 标志,单节点不出现无意义的 --device /dev/infiniband。
  ...(multinode ? fabricFlagsOf(sel.hw).map((f) => '  ' + f) : []),
  '  -v ~/.cache/huggingface:/root/.cache/huggingface',
  ...(config.placeholders && config.placeholders.HF_TOKEN
    ? ['  --env "HF_TOKEN={{HF_TOKEN}}"'] : []),
  ...cellEnv.map((e) => '  --env ' + e),
  '  --ipc=host',
  `  ${image}`,
  '  sglang serve',
  ...flags.map((f) => '    ' + f),
];
docs_new/src/snippets/configs/thinkingmachines/inkling-small.jsx core-logic

Inkling-Small 部署配置主体:新增 DGX Spark 平台、专用镜像与 verified cell,并调整 Playground 各卡片的硬件 gate(TP/MoE/PD-disagg),是用户实际看到的部署配方来源。

// DGX Spark(GB10 / SM121)+ NVFP4 —— 2× Spark 通过 ConnectX-7 互联。
// 每节点 1 张 GPU,所以 TP=2 跨 2 节点;该平台无 FP4 专用 runner,
// MoE 回退 Marlin W4A16,attention 用 Triton 后端,并禁用 prefill CUDA graph。
{
  match: { hw: 'dgx-spark', variant: 'default', quant: 'nvfp4', strategy: 'balanced', nodes: 'multi-2' },
  verified: true,
  env: [
    'SGLANG_ENABLE_UNIFIED_RADIX_TREE=1',
  ],
  flags: [
    '--trust-remote-code',
    '--model-path {{MODEL_NAME}}',
    '--tp 2', // 2 节点 × 1 GPU
    '--quantization modelopt_fp4',
    '--attention-backend triton', // SM121 无 TRT-LLM FP4 路径
    '--page-size 128',
    '--fp4-gemm-backend marlin',
    '--moe-runner-backend marlin',
    '--mamba-radix-cache-strategy extra_buffer',
    '--mem-fraction-static 0.85', // 统一内存 128 GB,预留余量
    '--swa-full-tokens-ratio 0.1', // SWA 与 Mamba/sconv 池占比
    '--mamba-full-memory-ratio 0.1',
    '--enable-multimodal', // 兼容图片 / 音频输入
    '--disable-prefill-cuda-graph', // 该平台禁用 prefill CUDA graph
    '--reasoning-parser inkling',
    '--tool-call-parser inkling',
    '--host {{HOST_IP}}',
    '--port {{PORT}}',
  ],
},
docs_new/src/snippets/_playground.jsx core-logic

交互式部署面板的渲染引擎,与 _deployment.jsx 行为需保持一致;因 Mintlify 剥离模块状态无法共享常量,镜像了一份 DGX Spark fabric 标志表,是双引擎同步风险的所在。

// Mintlify 会剥掉模块级状态,Deployment 与 Playground 两个引擎
// 无法共享 _deployment.jsx 里的 HARDWARE_CATALOG,因此这里镜像一份
// 多节点 fabric 标志表;修改引擎时必须两边同步。
const HW_MULTINODE_DOCKER_FLAGS = {
  'dgx-spark': [
    '--ulimit memlock=-1:-1', '--cap-add IPC_LOCK', '--device /dev/infiniband',
  ],
};
const fabricFlags = HW_MULTINODE_DOCKER_FLAGS[sel.hw] || [];const dockerLines = [
  'docker run --gpus all',
  '  --shm-size 32g',
  (multinode || pdMode) ? '  --network host' : `  -p ${servePort}:${servePort}`,
  // 多节点 docker 命令注入 fabric 标志,与 Deployment 引擎输出保持一致。
  ...(multinode ? fabricFlags.map((x) => '  ' + x) : []),
  '  -v ~/.cache/huggingface:/root/.cache/huggingface',
  '  --env "HF_TOKEN={{HF_TOKEN}}"',
  ...cellEnv.map((e) => '  --env ' + e),
  '  --ipc=host',
  `  ${image}`,
  '  sglang serve',
  ...f.map((x) => '    ' + x),
];

评论区精华

multiNodeDockerFlags 与 multiNodeHints 的职责划分 设计

初版把 DGX Spark 的 ConnectX-7 标志放在多节点提示(multiNodeHints)中,但该字段渲染为 # 注释并同时出现在 Python 输出上方,docker 标志出现在 Python 输出里不合语义。合并者 zijiexia 提交第二个 commit,把标志改为挂在硬件条目的 multiNodeDockerFlags,由 Deploy/Playground 引擎直接注入多节点 docker run 命令。

结论:平台不变的 docker 标志归属于硬件条目 multiNodeDockerFlags,引擎发射进命令本身;multiNodeHints 只保留面向用户的提示语。 · 已解决

风险与影响

  • 共享引擎全局影响:_deployment.jsx 的 HARDWARE_CATALOG 与 fabricFlagsOf 对所有模型 cookbook 页面生效。得益于未声明 multiNodeDockerFlags 的硬件返回空数组,向后兼容,但属于共享代码路径变更,需回归验证其他模型的 docker 命令输出。
  • 双引擎重复实现:Deployment 与 Playground 各自维护一份 fabric 标志表(一处读硬件目录、一处写死映射),未来新增需 fabric 标志的平台时若只改一边,两处命令输出会不一致,属于持续维护风险。
  • 镜像可用性:专用镜像 lmsysorg/sglang:dev-inkling-small-dgx-spark 是否已发布、NCCL 2.30.7 组合是否验证过,材料未证实;cookbook 页面若推给用户而镜像缺失会造成部署失败。
  • 基准数据缺失:benchmarks 仅 stub,无精度数据,页面可能显示空白或 TBD,用户无法评估该平台上的质量表现。
  • CI extra 未通过:PR body 显示 extra run 失败,原因未说明,合入前应确认与本次改动无关。

影响范围以文档站点为主:所有模型 cookbook 页面共用 _deployment.jsx / _playground.jsx 引擎,因此本次改动对整个站点部署面板有潜在影响(但为兼容性变更);对使用 DGX Spark 部署 Inkling-Small 的用户,提供了一条可直接复制的 TP=2 多节点命令与专用镜像;对团队而言,cookbook 技能(.claude/skills)的硬件目录表和 review 规则同步更新,降低了后续维护出错概率。不影响运行时推理、调度、CUDA 内核等核心路径。

共享引擎全局影响 双引擎需手工同步 基准数据缺失 CI extra 未通过

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论