测试范围
对齐应沿着推理链逐步收窄。先固定输入和噪声,比较最终 action。结果若有偏差,就用原来的 payload 继续做逐层 dump;确认数值路径一致后,才进入延迟和环境成功率测试。实验设置
所有命令都从/phyai_workspace 启动,以固定路径和依赖。运行前先确认两个 checkpoint 和 tokenizer 已经保存在本地:
cuda:0。这里的 benchmark 和 compare 工具都沿用这个编号。
Action 对齐
Action 对齐先排除输入本身造成的差异。Live compare 从当前环境或--lerobot-root 加载 LeRobot,再把同一份输入、prompt token 和 denoising noise 交给 PhyAI 与 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:--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。

