-
Notifications
You must be signed in to change notification settings - Fork 59
WEEKLY_CHANGES_2026 05 29_zh
本文以示例对比的方式呈现核心接口与功能变更,细节请见各 PR。
1. Callable 注册返回不透明句柄 — #891
Worker.register 现在返回不透明的 CallableHandle(内含稳定的 SHA-256
摘要),不再是子级本地整数 id;直接把它传给 submit_* 即可。
- chip_cid = worker.register(chip_callable)
+ chip_handle = worker.register(chip_callable)
...
- orch.submit_next_level(chip_cid, args, cfg, worker=rank)
+ orch.submit_next_level(chip_handle, args, cfg, worker=rank)本质 / 意图: 旧的整数 cid 只在单个子 worker 内部有意义——它是一个 本地槽位下标,因此无法作为跨 worker 层级、与位置无关的稳定身份(两个子级 可能给不同 callable 分配同一个整数,而父级也没有任何内容稳定的东西来路由 submit)。改用内容寻址的 SHA-256 摘要后,身份跟随 callable 字节本身:同一 个 callable 在任何地方都哈希到同一个句柄,于是父级任务槽与 mailbox 帧改为 携带 32 字节摘要,而非子级本地槽位。这才使得「按身份做层级路由」「重复注册 的引用计数去重」「相同 callable 的内容去重」成为可能——这些都是本地槽位下标 无法表达的。
底层 ChipWorker.prepare_callable/run/unregister_callable 的整数槽 API
有意保留,供 L2 prepared-callable 测试直接使用。
2. 移除 --build 标志 — 测试只从 build/lib/ 加载二进制 — #910
按需重编的 --build 标志(及 PTO_UT_BUILD 环境变量)已移除。修改
runtime/platform C++ 后,需显式重建二进制再运行。
- python <ex>/test_*.py -p a2a3sim --build
+ pip install --no-build-isolation -e . # 增量刷新 build/lib/
+ python <ex>/test_*.py -p a2a3sim本质 / 意图: --build 是一条独立且会分叉的构建路径,在测试时重新编译,
导致「测试所跑的二进制」可能悄悄偏离「pip install 实际打包的二进制」(tested
≠ shipped)。收敛为「只从 build/lib/ 加载二进制」使构建单一来源、统一走安装期
CMake;而最关键的动机是为可选 sanitizer 构建(#915)让路——后者是一个干净的安装期 CMake define,而不是再往 runner 上
螺栓一个按测试重编的标志。编译机制本身不变,仅去掉了「测试时按需重编」这条路径。
--dump-tensor 由布尔变为等级,选择性 dump 通过编排 C++ 中的
Arg::dump(...) 标记驱动。删除了单独的 kernel_args_dump.json 输出与
enable_dump_tensor_selective() 开关——所有输出(张量及标量参数)统一
进入 tensor_dump.json + tensor_dump.bin。
// 编排 C++:标记需要抓取的内容
- // (原先选择性模式是设备侧的全局开关)
+ params_t3.dump(d, inter_ci); // 张量粒度:指定的张量
+ params_t4.dump(); // 任务粒度:该 Arg 上的所有张量参数- --dump-tensor # 仅开/关
+ --dump-tensor # 等级 1 = 局部:仅被 Arg::dump(...) 标记的任务
+ --dump-tensor 2 # 等级 2 = 全量:每个任务的张量 I/O本质 / 意图: 两层意图,其中一层是真正的正确性修复。(1) 统一 —— 标量参数
与张量原先落在两个不同的清单里;把标量并入同一个 BEFORE_DISPATCH 遍历、用
kind: "tensor" | "scalar" 字段区分后,单个 tensor_dump.json + .bin 即是
全貌,不再需要对账第二个 kernel_args_dump.json。(2) 把「局部 vs 全量」的判定
从设备侧搬到主机侧 —— 之前的选择性模式是在设备侧、随任务到达时由标记推断的,
这是有竞态的:在第一个 Arg::dump(...) 标记之前派发的任务会混入全量 dump,产生
不确定的 st-onboard-a2a3 计数(6 != 5)。现在等级在主机侧、任意任务派发之前
确定并写入 header(沿用 --enable-l2-swimlane 的等级传输方式),因此「局部 vs
全量」提前锁定,设备侧的全局开关被彻底移除——确定性来自构造本身,而非提交顺序
的运气。
1. L3 broadcast 与 all-to-all 分布式集合通信 — #888
两个新示例补齐了集合通信算子集,沿用 allgather / reduce-scatter 已有的
scratch-window + TNOTIFY/TWAIT 模式。
这两个集合通信是什么(每张卡 = 一个 "rank",各持有自己的分片):
- broadcast(广播) —— 一对多、同一份数据。一个指定的 root rank 持有 一块数据;操作完成后,每个 rank 都拿到它的一份完全相同的副本。常用于把 共享权重/配置从 rank 0 推送到整个通信组。
- all-to-all(全交换) —— 个性化交换 / 分布式转置。每个 rank 持有 N 个 数据块,每块分别发往一个 rank;操作完成后,rank i 收齐了来自每个 rank 的 第 i 块。与 allgather(所有人把同一份数据发给所有人)不同,all-to-all 是每个 rank 给每个其他 rank 发不同的数据——这是 MoE 专家分发(expert dispatch)、分片重排布的基础原语。
pytest examples/workers/l3/broadcast_distributed --platform a2a3sim
pytest examples/workers/l3/all_to_all_distributed --platform a2a3sim两者均在 a2a3sim / a2a3 / a5sim 上参数化 2 卡与 4 卡。
2. 高性能 Paged Attention a2a3 ST 测试 — #899
tensormap_and_ringbuffer runtime 下的新 SPMD Paged Attention 示例/测试。
这是什么: Paged(分页)Attention 把 KV cache 存成固定大小、不连续的
「页」(类似虚拟内存分页),而不是一整块连续缓冲,这样不同长度的序列能紧凑
排布、不浪费显存——attention kernel 按 query 去 gather 对应的页。SPMD 指所有
核跑同一份程序、处理不同的数据分片。本示例是接入 tensormap_and_ringbuffer
runtime 的高性能变体。
python test_spmd_paged_attention_highperf.py -p a2a3sim # 或设备上 -p a2a33. scope_stats DFX 采集器(每 scope 的 ring 占用峰值)— #858
可选诊断功能,采集每个 scope 的 ring task-window / heap / tensormap 占用
峰值,并在每个 scope_end 流式输出一条 NDJSON 记录。
它告诉你什么: 「scope」是一段有界的提交工作区域;采集器报告在这段区域内
runtime 的各个队列最满到什么程度——ring buffer(待处理任务槽位)、heap、
tensormap 各自的占用峰值(high-water mark)。这个峰值正是给这些缓冲定容量的
依据:定太小会撞上 back-pressure/停顿,定太大则浪费设备显存。每个 scope_end
输出一行 NDJSON,便于跨运行做占用对比。
python tests/st/<case>/test_<name>.py -p a2a3 -d 0 --enable-scope-stats
# → 生成 <output_prefix>/scope_stats.jsonl4. a5 onboard 支持 comm + 延迟完成 — #823
「comm」= 集合通信后端(HCCL —— allreduce/allgather/broadcast 等算子底层依赖的
跨设备传输层)。HCCL comm 后端与延迟完成 runtime 移植到 a5 onboard,comm 示例
现可在 a5 上运行。allreduce_distributed 与 test_platform_comm 新增 a5
平台标记。
pytest examples/workers/l3/allreduce_distributed --platform a5SDMA-on-a5 暂时排除(CANN-9.x 缺口);非 SDMA 的 comm 示例不受影响。
5. a5 支持 dep_gen 抓取+回放 — #886
「dep_gen」= 依赖图抓取。开启 --enable-dep-gen 后,runtime 记录任务之间谁依赖
谁(提交任务间的数据/顺序边)并生成 deps.json;这些边随后在 swimlane(泳道)
时间线(merged_swimlane_*.json)里渲染成箭头,于是你能看清哪些任务实际串行、
哪些并行执行。该功能在 a5 上原先是静默空操作,现在与 a2a3 行为一致。
python tests/st/<case>/test_<name>.py -p a5 -d 0 --enable-dep-gen| PR | 修复说明(用户可观察到的症状) |
|---|---|
| #920 | 开启 --dump-tensor 时,异常/超时退出的运行不再卡死主机直到外部看门狗将其 kill。 |
| #930 #935 | 分布式测试(如 L3 allreduce)不再因 peer-rank init 偏斜被计入 per-rank sync 预算而触发调度器超时误判,间歇报 sched_error_code=100 / 507018(失败率 50% → 约 3%)。 |
| #890 #882 | a2a3 onboard 套件不再间歇整体崩塌——一个用例失败后同设备后续每个 simpler_init 报 507899 / prepare_callable failed -1(配对 die 的 AICPU 故障 + finalize 在非 HCCL 路径跳过 device reset)。 |
| #958 | 含未解析 .text 重定位的 kernel .o 现在加载即报错并给出可操作提示,而非在设备上跳转到垃圾地址(静默错误输出或 507018 看门狗超时)。 |
| #893 | 少 vCPU 机器上并发运行多个 scene-test 用例时,a2a3sim / a5sim 不再挂死(rc=124)或误报 Core X deinit timed out(rc=-1)。 |
| #898 | CPU 超额订阅下连续派发 sync_start 任务,a2a3sim / a5sim 不再段错误(rc=-11)。 |
| #901 | 仿真 comm 示例(dual_domain_overlap、allreduce_distributed、ep_dispatch_combine、allgather_distributed)在负载下不再于拆除阶段间歇崩溃(rc=-6 / rc=139)。 |