ScienceDiscovery
English GitHub

Ascend NPU 宿主 Broker 设计说明

本文只记录 Ascend NPU Broker 的问题背景、设计边界与文档入口。具体部署参数、工具契约、Runner 安全边界分别维护在仓库已有专题文档中,避免把运维说明和工具清单重复写在一份设计文档里。

1. 背景

在已验证的 Ascend 910B3 主机上,宿主 MindSpore 可以正常访问 NPU;同一探针进入 Runner 的 bubblewrap namespace 后会失败,典型错误为:

Container ID verify failed (session ct_id=0; device ct_id=...)

那次测量是在宿主整个 /dev 都可见的情况下做的,这个报错是驱动在那种情况下的正常反应,而不是设备直通的限制:进入 mount namespace 后驱动按调用者 /dev 里可见的卡枚举,且是 all-or-nothing,只要有一张卡被别的租户占着,整次调用就对所有卡失败。

因此选中的芯片最终还是交进了沙箱——新建 /dev、只放选中的芯片、从 0 重新编号——这台机器上沙箱内的 npu-smi info 与 MindSpore 都能跑。launch 怎么拼、芯片是否可用怎么判定,见沙箱执行 §3.2。

下面的 Broker 是另一条按需开启的路径,保留给不属于普通 Agent 执行的白名单宿主作业。

1.1 沙箱内的 NPU 与状态读取

Broker 之外,Runner 现在也能把选中的 Ascend 芯片交给 bubblewrap 沙箱(新建 /dev + 逐设备 --dev-bind,沙箱内从 0 重新编号)。这条路径要回答两个问题:机器上有哪些计算芯片,以及每颗芯片对应哪个 /dev/davinciN。

读取顺序是先驱动、后命令行:

设备身份一律用 chip logic id,不用卡号:一卡一芯的硬件(910B)上两者相等,一卡两 die 的硬件(910C)上不相等,用卡号会绑错 die。用户勾选的粒度因此是芯片(die),勾选集合按 logic id 升序在沙箱内从 0 重新编号,与运行时 rank 一一对应。

支持范围是 Ascend 910 系列;其他芯片(包括 310 开发板)会被列出但不可勾选,理由里会写明芯片名。

2. 设计边界

3. 文档落点

需要查什么 应看哪里
如何启用 / 关闭 Broker,以及 .env 参数含义 配置参考
Agent 能看到什么 NPU 工具、参数怎么填 内置工具清单
选中的芯片如何进沙箱、可用性如何判定 沙箱执行
Broker 为什么是沙箱外的例外,以及有哪些安全校验 沙箱执行
Broker 在整体进程模型里的位置 整体运行时架构
默认 workload 白名单 services/runner/workloads/npu-workloads.default.json

4. 扩展原则

Broker 的可扩展性来自“注册新的 workload manifest”,不是开放任意命令。新增模型时应增加或部署新的白名单条目,并保持:

直接把 NPU 设备透传进 bwrap 只能作为未来优化:必须在目标部署上通过真实 Ascend 算子探针后才可启用;探针失败时继续回退到 Broker。

5. 已知限制

6. 测试入口

Runner 侧针对 NPU Broker 的测试命令:

pnpm --filter @sciencediscovery/runner build
node --test --test-name-pattern "NPU Broker" services/runner/dist/server.test.js

覆盖重点包括默认关闭、显式启用、HMAC submit、workload 白名单、workspace 路径逃逸拒绝、${repo:...} realpath 边界、Protenix workload 执行、Protenix 入口拒绝 AF3 intent 配置、产物收集与 Runner 重启后的 interrupted 状态。