Skip to main content

测试范围

对齐应沿着推理链逐步收窄。先固定输入和噪声,比较最终 action。结果若有偏差,就用原来的 payload 继续做逐层 dump;确认数值路径一致后,才进入延迟和环境成功率测试。
Action 对齐只比较确定性 payload 下的模型输出。LIBERO 成功率还会受到模拟器重置、预处理、环境 step 和 action 执行的影响,不能用其中一个替代另一个。

实验设置

所有命令都从 /phyai_workspace 启动,以固定路径和依赖。运行前先确认两个 checkpoint 和 tokenizer 已经保存在本地:
测量延迟前,先确认目标 GPU 空闲,并为所有对比运行绑定同一张卡:
绑定后,CUDA 会把这张卡重新编号为逻辑 cuda:0。这里的 benchmark 和 compare 工具都沿用这个编号。

Action 对齐

Action 对齐先排除输入本身造成的差异。Live compare 从当前环境或 --lerobot-root 加载 LeRobot,再把同一份输入、prompt token 和 denoising noise 交给 PhyAI 与 LeRobot,只让两套模型实现成为变量。
若当前环境已经能导入 LeRobot,可以省略 --lerobot-root。想把 tokenization 排除在对比之外,则使用 --language-inputs fixed。模型路径固定为 bfloat16 和 FlashInfer;--vision-dtype float32 只通过 PI0Args.vision_params_dtype 改变 PhyAI 的 vision tower。 记录这些 JSON 字段: LeRobot 的计时范围是 predict_action_chunk,不是 select_action。命中 action queue 时不会生成新的 action chunk,因此不应算作一次模型推理。Tokenization 也在计时开始前完成。

逐层诊断

如果最终 action 出现偏差,不要重新生成输入。--save-output 会把处理后的 batch、prompt tensor、共享噪声、参考 action、两侧输出及其差值写入同一个 .pt 文件。Dump 工具复用这份文件,在单进程中继续比较两个运行时:
输出包含这些阶段: 每个阶段都会报告余弦相似度、绝对误差、RMSE 和 tensor norm。首个低于 --threshold 的 cosine 值会被标为 FIRST DIVERGENCE
当 rank 相同的 tensor 长度不同时,[shape-clipped] 表示工具把它们裁到共同的最小 shape。通常是因为 LeRobot 保留 padding 后的语言长度,而 PhyAI dump 只保存有效 prefix。最终 action 和 denoising step tensor 仍应保持相同 shape。

Engine 延迟

数值路径对齐后,再用 CUDA graph replay 单独测量 PhyAI scheduler:
计时范围从 Engine.step 开始,到 action chunk 返回为止,其中包含 vision runner、language prefix runner、expert denoising loop 和 CUDA graph replay。Tokenization 与环境 step 留在计时范围之外。

LIBERO 评测

LIBERO 会把模拟器、预处理和 action 执行一并纳入结果。这里使用 LIBERO finetuned checkpoint;base checkpoint 仍只用于数值对齐。 LeRobot:
PhyAI:
不传 --task-ids 时,脚本会依次评测 suite 中的全部 task。libero_object 每个 task 运行 10 个 episode,总计 100 个。正式评测前可先加上 --task-ids "[0]" --n-episodes 1,确认整条链路能够跑通。

报告要求

报告结果时应保留完整的运行条件。数值对齐和延迟报告需要记录 GPU、visible device、checkpoint、输入模式、dtype、batch size、CUDA graph 状态、num_steps、warmup 次数、计时次数和 PhyAI vision dtype,并注明是否把预处理或 tokenization 算入计时。 LIBERO 报告还需写明 suite、episode 数量和视频设置。pc_success 沿用 LeRobot 的口径,取值范围是 0 到 100。

排查