Psi0 trashbin_v1_0:5k 部署交付包(SONIC v1.0)— 第二版 / revision 2
发布状态(2026-09-25,第二版):5k 的 A100 GPU 验证已通过(Slurm 277762)。第一版审查的问题已修复;其中两条源码溯源说明(#6/#7)只做了文档说明,未重新导出。真机
--execute前仍需通过解包后README.md第 5 节的三道现场关卡:(1) 运行中控制器的身份与增益,(2) RTX5090 时延,(3) dry-run 裁剪统计。已知阻塞(待决定):每个会话第一个 chunk 的源观察龄约为
首次推理耗时 + 0.87 s,超过 client 默认的 1000 ms 上限。所以在 GPU 上 replay/live dry-run 预计会在约 1 s 时 fault(fail-safe,不发 pose)。详见解包后README.md第 5 节开头与evidence/source_age_first_chunk.json。Release status (revision 2): the 5k A100 validation passed (job 277762). The rev1 review findings are fixed, except the two source-provenance notes (#6/#7), which are documented only: fixing them would need a re-export. Three on-site gates remain before
--executeon the robot (unpackedREADME.md, section 5): (1) running controller identity and gains, (2) RTX 5090 latency, (3) dry-run clip statistics. Known blocker, pending a decision: a session's first chunk is up to aboutI + 0.87 sold (I= first inference time), which exceeds the client's default 1000 ms source-age limit, so replay and live dry-runs on a GPU are expected to fault about 1 s in. Robot runs must use--hand-limit-policy clip --max-hand-clip-rad 0.12.仓库可见性 / access: see repo settings(本卡片不对可见性做任何声明;不要把 token 写进共享脚本)。
此仓库保存 trashbin_v1_0(指令 Throw the trash bag into the bin.)的 Psi0 微调 checkpoint 5000。训练运行为 trashbin-psi0-sonic-2gpu-277260:Slurm 277260 → 277284,2×A100,全局 batch 128,计划训练 40k updates。仓库还包含训练时实际导入的源码快照、归一化、Qwen tokenizer/processor、训练指令的 CLIP 向量、client 和 controller 补丁。5k 是中间 checkpoint,不是最终模型。 rev2 没有改动模型 bundle(bundle manifest 仍为 a4f6a489…),只更新了脚本、文档与证据。
A100 验证结果(Slurm 277762,1× A100-SXM4-40GB,d = 12 帧 = 400 ms 预算)
训练评估参考(训练 step 5000,即 W&B _step 5997;续训后 W&B 步数偏移 +997;训练 batch):latent_sonic L1 0.010045,hand_joints L1 0.006146。开环测试用 prepared episodes 0/4/9/14(原始 8/25/36/50)。
| flow 步数 | token L1(×参考) | hand L1(×参考) | WebSocket 服务 p95 / 最大 | 右手越界值 / 默认 reject 会拒绝的 tick / 最大超出 |
|---|---|---|---|---|
| 4 | 0.01086(1.08×) | 0.00671(1.09×) | 314 / 321 ms | 518(3.2%)/ 18.9% / 0.101 rad |
| 3(默认) | 0.01211(1.21×) | 0.00849(1.38×) | 264 / 306 ms | 940(5.9%)/ 27.7% / 0.059 rad(plain 无 RTC 推理 0.111 rad) |
| 2 | 0.01721(1.71×) | 0.01342(2.18×) | 未测 | 894(5.6%)/ 28.2% / 0.222 rad(plain 0.234 rad) |
- 验收(全部通过):3 步 L1 不超过参考的 1.5 倍(1.21× / 1.38×);每个 WebSocket 用例
latency_gate_passed;训练真值 0 越界;左手从不越界;3 步最大超出低于 clip 停止阈值 0.12 rad。 - 最大超出按两条路径分别统计。RTC 重规划为 0.059 rad。plain(无 RTC)推理为 0.111 rad,这是离线测试 38 个独立 plain chunk 中的最坏值;每个会话的第一个 chunk 和 dry-run 超时后的 chunk 都走 plain 路径,所以离 0.12 rad 停止阈值只差 0.009 rad。
- 越界比例按 1,140 个 tick × 14 个手部值计算,越界值全部在右手(占右手值的 11.8%),位置是与 Dex3 限位重合的 thumb2 上界和 index/middle 下界。
- English: at the default 3 flow steps the open-loop L1 is 1.21× (token) / 1.38× (hand) the training-eval reference and the service p95 is 264 ms (max 306 ms). Predicted right-hand targets slightly exceed the Dex3 limits on 27.7% of ticks: max 0.059 rad on replans, and 0.111 rad worst case over 38 plain (no-RTC) chunks, which is the path every session's first chunk takes. so the fail-closed default
rejectwould stop the robot; clip mode with the 0.12 rad stop threshold is mandatory. Ground-truth targets never exceed the limits; the left hand never does.
机器人上必须用 clip,停止阈值 0.12 rad
先做 live dry-run(不发布 pose),它也是关卡 1 与关卡 3 的依据:
./deploy_checkpoint.sh 5000 client --duration-seconds 30 --hand-limit-policy clip --max-hand-clip-rad 0.12
只有三道现场关卡全部通过、上面的已知阻塞已由 Chen 决定之后,才按解包后 README.md 第 5 节「执行」运行带 --execute 的命令(同样必须带 --hand-limit-policy clip --max-hand-clip-rad 0.12)。本卡片不给出可直接复制的 execute 命令。
- CLI 默认仍是 fail-closed 的
reject,但 trashbin 用它会在第一个越界 tick 停机,所以必须显式传--hand-limit-policy clip。 clip把越界值投影到 Dex3 限位并记录;任何值超出限位 0.12 rad 以上时,client 不投影而是 fault:停止续租、发 stop,控制器回到暂停 reference、保持手部目标、不关闭电机力矩。- go/no-go(先做 live dry-run):
summary.json里exit_code 0、max_hand_clip_delta_rad < 0.12、hand_clipped_action_fraction ≤ 0.55。
名义 PD 增益 guard(rev2 新增)
这个模型的 motion token 是用 SONIC v1.0 采集的,采集时是名义 PD 增益(原始 meta/info.json 的 script_config:motor_kp_scale ""、motor_kd_scale "";pick-place 是 4=1.5,10=1.5)。rev2 的 client 在 live dry-run 和 execute 下都读取运行中控制器的 robot_config,要求:
- 三个 v1.0 资产 SHA(encoder/decoder/observation config);
motor_kp_scale == ""且motor_kd_scale == "",缺键也拒绝。
否则报 controller PD gain scale is not nominal (trashbin was recorded with nominal gains) 并停止,不发任何观察或动作。server verify_bundle 也钉死了三个 v1.0 SHA。controller --check 只检查配置字符串与资产文件 SHA;运行时的值由 client guard 在控制器 --execute(未 arm)后核验。
与 pick-and-place / moving_dining_cart 包的关键区别(不能混用)
| 本包 trashbin 5k | pick-and-place 6k | moving_dining_cart 4k/5k | |
|---|---|---|---|
| SONIC | v1.0 policy/release/*,名义 PD 增益(无 kp/kd 缩放) |
v1.1 policy/sonic_v1_1/*,电机 4/10 增益 ×1.5 |
v1.1,×1.5 |
| 模型 | Qwen3-VL 全量微调、12 层 action expert、CLIP 指令向量、240×320 | 同左 | 冻结 VLM、6 层、180×320 |
| 手序(模型内) | Dex3 actuated,client 不重排 | actuated | URDF,client 重排 |
| 手 | 只动右手(左手目标恒为 0),若干维正好贴 Dex3 限位 | — | — |
| RTC | 训练未用 RTC;重规划用上游 test-time guidance | 同左 | 训练时 RTC |
| 默认推理 | 3 flow 步,冻结前缀 12 帧(A100 已验证;RTX5090 需在控制器运行时确认) | 3 步 / 12 帧 | 6 步 / 7 帧 |
| 手部边界策略 | 必须 clip + 0.12 rad 停止阈值 |
— | — |
| 端口 | 8015 | 8014 | 8014 |
| 指令 | 只接受 Throw the trash bag into the bin.(不区分大小写) |
pick-place 指令 | 任意 |
SONIC v1.0 资产(gear_sonic_deploy/policy/release/) |
SHA256 |
|---|---|
model_decoder.onnx |
c7241a123eaa36b5d64bad19540efde93cac1ad443bd4572fd12ca99898118ed |
model_encoder.onnx |
013ab0287236aa2721e13f1e936d699db982302d0de0bfcdae76d5c3245362d3 |
observation_config.yaml |
466d05947c78af6c76388adfb86e3a2a77b2a1d921a64883ed3d085ebf58de1b |
ws012744 上的 guarded controller(~/.local/state/r-c8f39e2a)按 v1.1 构建和验证过;补丁与资产版本无关,可以复用,但必须用上面的 v1.0 资产与空的 kp/kd scale 启动。WS 的只读调查已确认采集 checkout 里三个 v1.0 文件的 SHA 正确。若 r-c8f39e2a 里缺少或不符,就把采集 checkout 中的这三个文件复制到新的私有目录(例如 ~/.local/state/trashbin-sonic-v1_0/policy/release/),再让 config/5000/controller.json 的 decoder/encoder/observation_config 指向副本(run.py 强制 SHA)。不要直接指向采集 checkout:SONIC 会在 ONNX 同目录写入或覆盖 TensorRT 引擎缓存。详见解包后 README.md 第 3 节。
在 ws012744 上安装或升级
ws012744 从集群无法直连,只能在 WS 上从本仓库下载(需要有访问权限的 HF 登录)。安装位置是与 cart 包 ~/ccy/Psi0/third_party/deploy(SONIC v1.1 + 1.5× 增益,其 deploy_checkpoint.sh 也接受 5000)并列而不嵌套的 ~/ccy/Psi0/third_party/deploy_trashbin_5k/deploy;脚本拒绝装进 cart 的 deploy/ 里,不运行 git,不启动任何 server/controller/机器人进程。
已装第一版(rev1)的 WS — 升级:
cd ~/ccy/Psi0/third_party/deploy_trashbin_5k
.venv-hf/bin/hf download ChenyuanC/psi0-trashbin-5k fetch_on_ws012744.sh --local-dir . # 取 rev2 的脚本
bash fetch_on_ws012744.sh survey # 只读:已装版本、SONIC v1.0 资产 SHA
bash fetch_on_ws012744.sh update
update 的行为:
- 只接受 trashbin 5k 包:
$root/deploy必须有bundles/ckpt_5000/bundle.json,其中 format 为psi0-trashbin78-deployment-v1、checkpoint 为6771ddce…、SONIC 为 1.0。脚本拒绝改名 cart 包或其他包,也拒绝$root/deploy就是 cart 目录、包含 cart 目录或是符号链接的情况。若已经装好同一个 rev2(依据deploy/.installed_from_tar_sha256),则只重新运行init/verify,不做别的;update --force才会重装。 - 先检查可用空间(下载加解包约需 2 × 6.3 GB + 2 GB),再下载 rev2 到新的
download-r2(不读取、不复用第一版的download/)。tar 只完整读一次来计算 SHA,这个 SHA 必须同时等于脚本内固定的 rev2 SHA 和checksums.sha256里的值;成员检查一次完成(全部在deploy/下,只有普通文件和目录,没有绝对路径或..)。 - 解包到临时目录
$root/.unpack-r2-XXXXXX(约 6 GB)。tar失败,或解包后的文件集合/大小与 tar 清单不一致,或RELEASE_MANIFEST.json里任一文件的 SHA256 不符,或不是 rev2,或 checkpoint SHA 不对,都会删除这个临时副本并停止,已安装的包不受影响。只要这个临时副本没有被放到deploy/(校验失败、步骤 4 的第二次拒绝、deploy.prev-*重名、任何报错、Ctrl-C/SIGTERM),脚本退出时都会删除它,并打印removed this run's unpromoted staging copy <路径>;download-r2/保留,下次运行重新计算 SHA 后直接复用,不再下载。被kill -9或断电中断而残留的旧临时目录不会被自动删除,survey/update会列出其路径、大小和删除命令。 - 若旧的
deploy/正被使用则拒绝。这个检查做两次:下载前一次(此时拒绝则什么都没改);解包校验之后、改名之前再做一次(此时拒绝,旧包不受影响,本次的临时副本在退出时删除,download-r2/保留供下次复用)。检查范围:任何用户的命令行里出现该路径;本用户进程的工作目录、映射文件或打开的文件在deploy/里;deploy.py私有启动器的运行目录(~/.local/state/allocations、$CART78_RUN_BASE以及包内config/*/deploy.json的runtime_base下,c.json的 target 位于deploy/的r-*)被某个进程用作工作目录或出现在命令行里。另外,只要有可执行文件为g1_deploy*的控制器在运行,也拒绝。 - 把旧的
deploy/改名为deploy.prev-rev1-<UTC>(rev2 重装时为deploy.prev-rev2-<UTC>)保留,不删除;然后放入新版,写入.installed_from_tar_sha256。 - 不自动搬运任何东西。脚本在运行
init/verify之前就会打印搬运说明:如何把旧的.python、.cache、.venv-server、.venv-client移回原路径(uv 创建的 venv 依赖.python),以及如何用diff对比config/5000/controller.json和deploy.json;也可以用setup_env.sh重建环境。
新机器 — 安装:
mkdir -p ~/ccy/Psi0/third_party/deploy_trashbin_5k && cd ~/ccy/Psi0/third_party/deploy_trashbin_5k
python3 -m venv .venv-hf && .venv-hf/bin/python -m pip install -U huggingface_hub
.venv-hf/bin/hf auth login
.venv-hf/bin/hf download ChenyuanC/psi0-trashbin-5k fetch_on_ws012744.sh --local-dir .
bash fetch_on_ws012744.sh survey
bash fetch_on_ws012744.sh # 下载、校验、解包到 …/deploy_trashbin_5k/deploy,然后 init/verify
可以用 PSI0_TB_ROOT=/其他/新目录 改变安装位置,用 PSI0_TB_HF_REVISION=<commit> 固定 HF 版本。trashbin 的所有命令都必须在 …/deploy_trashbin_5k/deploy 里运行(先 pwd)。
登录检查(rev2):hf auth whoami 在没有 token 时也返回 0(只打印 Not logged in),所以脚本改为直接检查已存 token 并用它调用 whoami;没有 token 或 token 被拒都会在下载前停止。脚本还会做一次匿名元数据查询(不带 token、不下载):如果匿名也能读取本仓库,会打印 WARNING … is PUBLIC。看到这条请告诉 Chen 去仓库设置里改回 private;安装本身继续,因为 tar 的完整性由脚本内固定的 SHA 保证,与仓库可见性无关。
Login check (rev2): hf auth whoami exits 0 even without a token, so the script checks the stored token and calls whoami with it, stopping before any download if either fails. It also makes one anonymous metadata request (no token, no download); if that succeeds it prints WARNING … is PUBLIC. Report that to Chen. The install still continues, because the pinned tar SHA, not repo visibility, is what guarantees integrity.
之后按解包后的 README.md 操作:
- 运行
setup_env.sh server、setup_env.sh client --with-tests、deploy_checkpoint.sh 5000 server --import-check和deploy_checkpoint.sh 5000 test。test的结果写到logs/test-runs/<UTC>/,不会覆盖随包证据。 - 运行
controller --check。 - 做 replay profiling:用原始录制中保留的 episode(原始编号 8、9、11、12、25、27、28、29、33、36、37、38、41、49、50;其余原始编号是丢弃的录制,client 会直接拒绝;replay 必须显式给
--episode)。 - 三道现场关卡(编号与解包后 README 第 5 节一致),全部通过、并且上面的已知阻塞已决定之后,才能执行:
- 控制器
--execute(未 arm)后,client live dry-run 核验运行中控制器的身份与增益(三个 v1.0 SHA,motor_kp_scale == motor_kd_scale == ""),控制器输出里没有Motor Kp/Kd scales行。 /deployment-info显示ready=true、latency_ok=true、fault=null,且推理耗时最大值 < 350 ms(d=12)。recent_inference_ms只含最近 32 次推理,所以还要看 dry-runevents.jsonl里全部profile事件的latency_ms。唯一文档化的回退是--rtc-delay 13(门槛 < 383 ms)。- dry-run 的
summary.json(logs/5000/client/<UUID>/)满足exit_code 0、max_hand_clip_delta_rad < 0.12、hand_clipped_action_fraction ≤ 0.55。
- 控制器
client 不会自动 arm。250 ms 收包 lease 失效时,会回到暂停 reference 并保持手目标,不关闭电机力矩。
文件与校验
| 文件 | 内容 |
|---|---|
deploy_5k.tar |
脚本、说明、测试证据及完整推理 bundle,解包到 deploy/ |
deploy_scripts_5k.zip |
轻量脚本、说明和证据,不含模型权重 |
checksums.sha256 |
两个归档的 SHA256(大小与 SHA 以此文件和 upload_manifest.json 为准) |
upload_manifest.json |
交付身份、大小、SHA 及验证范围 |
fetch_on_ws012744.sh |
在 ws012744 上 survey / install / update(update --force 重装);只做 no-GPU 检查 |
| 身份 | SHA256 |
|---|---|
| checkpoint 5000 模型文件 | 6771ddce1b84c22798e5274c7013e7e58be22ea096d0106d1322636cf15191df |
bundle manifest(bundle.json,rev1 与 rev2 相同) |
a4f6a489025c37594c49e92bd30a68d7fccef3443be75f4f8461a77db7680223 |
| 契约 / 归一化 | 48ecdb53b2c8da3360888ded1dea65ebe7e95b7d0071a6305a5f9db70a23df78 / 02252292dcaa1efe3706a448a439e3386a85a047224a4dc2cd869247705d15f0 |
没有打包 optimizer、scheduler、数据集、Python 环境、TLS 凭据、机器私钥、SONIC ONNX 或 TensorRT。
训练说明(诚实交代)
- 数据集为
ChenyuanC/trashbin_v1_0(reve71bbad2),原始 51 条中保留录制时标记为 saved 的 15 条,共 6,503 帧,30 Hz,ego 视角 640×360。转换使用上游 Psi04f3720d的raw_sonic_to_psi_lerobot.py。 - 训练配方为上游
finetune-real-sonic-psi0.sh,超参数不变。A100 适配:DeepSpeed ZeRO-2(2 GPU × 16 × 累积 4 = 128),每 1000 步保存 checkpoint。 - 非有限梯度的更新会被跳过(与上游 DDP 行为一致)。ckpt_5000 的训练谱系中共跳过 19 次。
- 没有独立验证集:W&B 的 eval 和 A100 开环精度都用的是训练示范。step 5000 的 eval/loss 为 0.8807,同一 run 的 step 7000 为 0.4604,训练仍在继续。
- 在 2 GPU 训练前段,节点 gpu-23 故障,训练从 ckpt_2000 续训。续训后 W&B 的 step 编号约偏移 +997。
- 尚未测量:RTX5090 与 SONIC 共用 GPU 时的时延、暂停 reference/断流回退的硬件行为、扔垃圾成功率。