Skip to content

feat(runners): add the B300 DSXE cluster and retire the B300 NV launcher / 添加 B300 DSXE 集群并下线 B300 NV 启动脚本 - #2826

Merged
adibarra merged 2 commits into
mainfrom
feat/add-b300-dsxe-cluster
Sep 4, 2026
Merged

feat(runners): add the B300 DSXE cluster and retire the B300 NV launcher / 添加 B300 DSXE 集群并下线 B300 NV 启动脚本#2826
adibarra merged 2 commits into
mainfrom
feat/add-b300-dsxe-cluster

Conversation

@Ankur-singh

@Ankur-singh Ankur-singh commented Sep 4, 2026

Copy link
Copy Markdown
Collaborator

Summary / 概述

Registers the B300 DSXE Slurm cluster and removes the launcher for the decommissioned B300 NV fleet.

runners.yaml lost the B300 runner labels when that fleet was retired, but runners/launch_b300-nv.sh and a number of references to it stayed behind. This adds the replacement cluster and finishes the removal.

注册 B300 DSXE Slurm 集群,并删除已下线的 B300 NV 集群的启动脚本。

该集群下线时,runners.yaml 中的 B300 runner 标签已被移除,但 runners/launch_b300-nv.sh 及若干对它的引用仍然保留。本 PR 新增替代集群并完成清理。

What changed / 改动内容

  • runners/launch_b300-dsxe.sh — new launcher for the DSXE cluster.
  • runners/launch_b300-nv.sh — removed.
  • configs/runners.yamlb300 SKU group, cluster:b300-dsxe labels (18 runners), and the cluster's hardware facts.
  • Reference updates — the test-process-result.yml path filter, plus comments and docs that named the removed launcher.
  • benchmark-tmpl.yml — dropped the SALLOC_EXCLUDE default, which listed nodes belonging to the retired fleet and can never match a node on this cluster.

  • runners/launch_b300-dsxe.sh — DSXE 集群的新启动脚本。
  • runners/launch_b300-nv.sh — 已删除。
  • configs/runners.yamlb300 SKU 分组、cluster:b300-dsxe 标签(18 个 runner)以及该集群的硬件信息。
  • 引用更新test-process-result.yml 的路径过滤器,以及提到已删除启动脚本的注释和文档。
  • benchmark-tmpl.yml — 移除 SALLOC_EXCLUDE 默认值,其中列出的节点属于已下线集群,在本集群上永远不会匹配。

Shared enroot import / 共用的 enroot 导入逻辑

The multi-node and single-node paths used to open-code the container import separately. They now share one helper, defined above the IS_MULTINODE branch so it is in scope for both.

Every leaf of a sweep imports the same image concurrently, so the helper:

  • serializes importers on a per-image flock, so only the first caller pulls and the rest reuse the result instead of failing on an existing -o target;
  • verifies the squash file and re-imports when it is missing or invalid;
  • bounds the Slurm step with --time, so a lost step fails the job rather than leaving the client waiting indefinitely;
  • probes the shared path before allocating, so a warm cache costs no Slurm allocation at all.

The import runs on a compute node rather than the submit host: enroot builds the squashfs over an overlay mount, which the shared filesystem cannot back.


多节点与单节点路径此前各自实现了一遍容器导入逻辑,现在共用同一个函数。该函数定义在 IS_MULTINODE 分支之前,因此两条路径都能调用。

同一次 sweep 的各个作业会并发导入同一镜像,因此该函数:

  • 使用按镜像的 flock 串行化导入,只有第一个调用方真正拉取镜像,其余调用方复用结果,而不会因为 -o 目标已存在而失败;
  • 校验 squash 文件,缺失或损坏时重新导入;
  • 使用 --time 限制 Slurm step,step 丢失时任务直接失败,而不会让客户端无限等待;
  • 在申请资源前先探测共享路径,因此缓存命中时完全不占用 Slurm 资源。

导入在计算节点而非提交节点上执行:enroot 需要在 overlay 挂载之上构建 squashfs,而共享文件系统无法支撑该挂载。

Known follow-up / 已知的后续工作

configs/nvidia-master.yaml still pins 13 configs to cluster:b300-nv. Full-sweep matrix generation therefore stays broken exactly as it is on main today — this PR does not introduce that failure, and it moves the error from an unresolvable b300 SKU group to the remaining cluster:b300-nv entries. Resolving them (repoint or remove) is a separate decision and a separate change.

configs/nvidia-master.yaml 中仍有 13 个配置指向 cluster:b300-nv,因此 full-sweep 矩阵生成与当前 main 分支一样仍然失败 —— 该问题并非本 PR 引入,本 PR 只是把错误从无法解析的 b300 SKU 分组前移到了剩余的 cluster:b300-nv 条目。如何处理这些条目(改指向或删除)是另一个决策,将在单独的改动中完成。

Validation / 验证

  • bash -n on the new launcher and every edited shell script; YAML parses for all edited workflows and runners.yaml.
  • utils/matrix_logic suite: 246 passed.
  • runners.yaml resolves: 18 entries in both label lists, hardware entry present.
  • Every path the launcher references resolves in-tree.
  • The import helper was exercised against stubbed srun/flock/enroot/unsquashfs: four concurrent callers produce exactly one pull and four successes; a warm cache allocates nothing; a corrupted squash file is re-imported; a failing import aborts the launcher.

A single-node smoke run is still worth doing before merge — that is the path whose execution context changed, and no local test covers a real enroot import.


  • 对新启动脚本及所有修改过的 shell 脚本执行 bash -n;所有修改过的工作流和 runners.yaml 均可正常解析。
  • utils/matrix_logic 测试套件:246 项通过。
  • runners.yaml 可正确解析:两个标签列表各 18 项,硬件条目齐全。
  • 启动脚本引用的每个路径在仓库中均存在。
  • 使用打桩的 srun/flock/enroot/unsquashfs 验证导入函数:四个并发调用只产生一次拉取且全部成功;缓存命中时不占用任何资源;损坏的 squash 文件会被重新导入;导入失败时启动脚本会中止。

合并前仍建议做一次单节点冒烟测试 —— 这条路径的执行环境发生了变化,且本地测试无法覆盖真实的 enroot import


Note

Medium Risk
Changes core CI launch paths for all B300 jobs (Slurm allocation, enroot import, model paths, and srt-slurm behavior); misconfiguration would fail or mis-schedule benchmarks rather than affecting app security.

Overview
Migrates B300 benchmarking from the retired NV fleet to the new DSXE Slurm cluster (dsxe-sa-b300-prd0), replacing runners/launch_b300-nv.sh with runners/launch_b300-dsxe.sh and wiring CI/docs to the new runner prefix.

configs/runners.yaml now lists 18 b300-dsxe_* runners under both the b300 SKU and cluster:b300-dsxe, with ~3.98M MiB host DRAM (up from the old NV hardware metadata). Workflows and docs (speedbench-al.yml, test-process-result.yml, agentic README, CONFIGS.md, RUNNER_SETUP.md) point at launch_b300-dsxe.sh and cluster:b300-dsxe. benchmark-tmpl.yml drops the default SALLOC_EXCLUDE for broken NV nodes.

The new launcher centralizes cluster facts (squash dir under the runner user, /scratch/models staging, alias-driven srtslurm.yaml for multinode) and unifies enroot import in import_squash_image (flock, compute-node srun, cache probe, time-bounded steps). Multinode path pins NVIDIA/srt-slurm v1.0.87 (or the power fork when dcgm-power is enabled) and always uses --no-preflight because weights are node-local. Single-node path mounts only the model root that holds MODEL_PATH and still supports optional SALLOC_EXCLUDE.

Not in this PR: configs/nvidia-master.yaml may still reference cluster:b300-nv, so full-sweep matrix generation can remain broken until those entries are repointed.

Reviewed by Cursor Bugbot for commit 2611e8f. Bugbot is set up for automated code reviews on this repo. Configure here.

Registers the B300 DSXE Slurm cluster: a launcher, its 18 runner labels, and
its hardware facts. Removes launch_b300-nv.sh, whose fleet is decommissioned
and whose runner labels were already dropped from runners.yaml.

Both the multi-node and single-node paths now share one enroot import helper
instead of open-coding the import twice. The helper is defined above the
IS_MULTINODE branch so it is in scope for both, and it:

  - serializes concurrent importers on a per-image flock, so only the first
    caller pulls and the rest reuse the result rather than failing on an
    existing -o target;
  - verifies the squash file and re-imports it when it is missing or invalid;
  - bounds the Slurm step with --time, so a lost step fails the job instead of
    leaving the client waiting indefinitely;
  - probes the shared path before allocating, so a warm cache costs no Slurm
    allocation at all.

The import runs on a compute node because enroot builds the squashfs over an
overlay mount, which the shared filesystem cannot back.

Also repoints the workflow path filter, comments and docs that named the
removed launcher, and drops the SALLOC_EXCLUDE default, which listed nodes
belonging to the retired fleet.

configs/nvidia-master.yaml still pins 13 configs to cluster:b300-nv, so
full-sweep matrix generation stays broken exactly as it is on main today.
Resolving those entries is left to a separate change.

注册 B300 DSXE Slurm 集群:新增启动脚本、18 个 runner 标签及其硬件信息。
删除 launch_b300-nv.sh,该集群已下线,其 runner 标签此前已从 runners.yaml 中移除。

多节点与单节点路径现在共用同一个 enroot 导入函数,不再各自实现一遍。该函数定义在
IS_MULTINODE 分支之前,因此两条路径都能调用,并且:

  - 使用按镜像的 flock 串行化并发导入,只有第一个调用方真正拉取镜像,其余调用方复用
    结果,而不会因为 -o 目标已存在而失败;
  - 校验 squash 文件,缺失或损坏时重新导入;
  - 使用 --time 限制 Slurm step,step 丢失时任务直接失败,而不会让客户端无限等待;
  - 在申请资源前先探测共享路径,因此缓存命中时完全不占用 Slurm 资源。

导入在计算节点上执行,因为 enroot 需要在 overlay 挂载之上构建 squashfs,而共享文件
系统无法支撑该挂载。

同时更新了引用已删除启动脚本的工作流路径过滤器、注释和文档,并移除 SALLOC_EXCLUDE
默认值,其中列出的节点属于已下线的集群。

configs/nvidia-master.yaml 中仍有 13 个配置指向 cluster:b300-nv,因此 full-sweep
矩阵生成与当前 main 分支一样仍然失败。这些条目留待单独的改动处理。
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

1 similar comment
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want higher recall? High effort reviews run extra passes and find more bugs. A team admin can switch effort levels in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 48e7728. Configure here.

rm -f \"$sqsh\"
enroot import -o \"$sqsh\" \"docker://$image_ref\"
unsquashfs -l \"$sqsh\" > /dev/null
" || { echo "Error: enroot import failed for $image_ref -> $sqsh" >&2; exit 1; }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Import lock timeout too short

Medium Severity

Concurrent first-time imports can abort waiters while the pull is still running. The srun step allows up to 120 minutes, but flock gives waiters only 3600 seconds. A sweep's leaves all call import_squash_image on the same image, so a 60–120 minute enroot pull makes those waiters fail even though the importer would finish inside the step limit.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 48e7728. Configure here.

@adibarra
adibarra merged commit ee8f457 into main Sep 4, 2026
5 checks passed
@adibarra
adibarra deleted the feat/add-b300-dsxe-cluster branch September 4, 2026 21:06

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This automated review ran and did not find any bugs, but I'd still like a human to look given the scope of this change.

What was reviewed: the new 515-line runners/launch_b300-dsxe.sh replacing the deleted launch_b300-nv.sh, the new cluster:b300-dsxe runner label/hardware entries in configs/runners.yaml, and the workflow/README/CONFIGS.md references updated to match. I checked whether the cluster:b300-nv label existed in runners.yaml before this PR (it did not — configs/nvidia-master.yaml's ~13 runner: cluster:b300-nv entries were already dangling pre-PR, so this isn't a regression introduced here) and confirmed .github/workflows/test-process-result.yml's path trigger was updated to the new script name.

Extended reasoning...

Overview

This PR retires runners/launch_b300-nv.sh (590 lines, deleted) and introduces runners/launch_b300-dsxe.sh (515 lines, new) for a renamed B300 cluster, adds a new cluster:b300-dsxe label/hardware block to configs/runners.yaml, and touches three GitHub workflow files, two benchmark shell scripts, and two docs files to reference the new launcher/cluster name.

Security risks

None identified. The changes are CI/build infrastructure (runner selection, Slurm launch scripts, docs) with no new handling of secrets, auth, or untrusted input beyond what already existed in the retired script.

Level of scrutiny

I verified one specific concern myself: whether the new cluster:b300-dsxe label in runners.yaml was actually a rename that orphaned configs/nvidia-master.yaml entries pointing at cluster:b300-nv. Diffing against the pre-PR runners.yaml shows cluster:b300-nv was never defined there — nvidia-master.yaml's ~13 references to it were already dangling before this PR, so that particular drift is pre-existing rather than introduced by this change. Several other candidates flagged by the bug-hunting sub-agents (dropped default_time_limit in the generated srtslurm.yaml, a hardcoded srt-slurm version tag replacing per-model pins, and unconditional --no-preflight on multi-node jobs) were investigated and ultimately not reported as confirmed bugs, but they represent real behavioral/design differences from the retired script that a human familiar with the B300 fleet's operational history should confirm are intentional.

Other factors

This is a large, security-review-appropriate-for-infra change (full launcher rewrite plus cluster rename across configs and workflows) with real operational consequences if a launch parameter regressed silently, so even with zero confirmed bugs I think a human pass adds value here.

This review covers commit 48e7728, which is no longer the latest commit on this pull request; later commits are not covered by it.

functionstackx added a commit that referenced this pull request Sep 5, 2026
Extend the TP8 x DCP8 Mooncake sweep with concurrency 10, 12 and 14. They
land in the recipe's conc 9-16 band and draft with DSpark level 3 at the
committed golden AL 3.00. Repoint the runner from the retired
cluster:b300-nv (#2826) to cluster:b300-dsxe so the sweep can schedule.

为 kimik3-fp4-b300-vllm-agentic-dspark 的 TP8 x DCP8 Mooncake 扫描新增并发
10、12、14。这些点落在 recipe 现有的 conc 9-16 区间,以 DSpark level 3 和已提交的
golden AL 3.00 起草。同时将 runner 从已在 #2826 退役的 cluster:b300-nv 改为
cluster:b300-dsxe,使扫描可以调度。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
functionstackx added a commit that referenced this pull request Sep 8, 2026
…d in #2826

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
hshrivastava-droid added a commit that referenced this pull request Sep 10, 2026
launch_b300-nv.sh was retired on main (#2826) in favor of the B300 DSXE
cluster, so PR #2654's runner move to cluster:b300-dsxe needs the GLM-5.2
AgentX special-casing carried over: the pinned NVIDIA/srt-slurm#313 fork
checkout (scoped to just the glm5.2/b300-fp4 recipes), and the UCX_TLS-unset
wrapper around srtctl apply for dynamo-sglang.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

2 participants