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 --execute on the robot (unpacked README.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 about I + 0.87 s old (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 reject would 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 的行为:

  1. 只接受 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. 先检查可用空间(下载加解包约需 2 × 6.3 GB + 2 GB),再下载 rev2 到新的 download-r2(不读取、不复用第一版的 download/)。tar 只完整读一次来计算 SHA,这个 SHA 必须同时等于脚本内固定的 rev2 SHA 和 checksums.sha256 里的值;成员检查一次完成(全部在 deploy/ 下,只有普通文件和目录,没有绝对路径或 ..)。
  3. 解包到临时目录 $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 会列出其路径、大小和删除命令。
  4. 若旧的 deploy/ 正被使用则拒绝。这个检查做两次:下载前一次(此时拒绝则什么都没改);解包校验之后、改名之前再做一次(此时拒绝,旧包不受影响,本次的临时副本在退出时删除,download-r2/ 保留供下次复用)。检查范围:任何用户的命令行里出现该路径;本用户进程的工作目录、映射文件或打开的文件在 deploy/ 里;deploy.py 私有启动器的运行目录(~/.local/state/allocations、$CART78_RUN_BASE 以及包内 config/*/deploy.json 的 runtime_base 下,c.json 的 target 位于 deploy/ 的 r-*)被某个进程用作工作目录或出现在命令行里。另外,只要有可执行文件为 g1_deploy* 的控制器在运行,也拒绝。
  5. 把旧的 deploy/ 改名为 deploy.prev-rev1-<UTC>(rev2 重装时为 deploy.prev-rev2-<UTC>)保留,不删除;然后放入新版,写入 .installed_from_tar_sha256。
  6. 不自动搬运任何东西。脚本在运行 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 操作:

  1. 运行 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>/,不会覆盖随包证据。
  2. 运行 controller --check。
  3. 做 replay profiling:用原始录制中保留的 episode(原始编号 8、9、11、12、25、27、28、29、33、36、37、38、41、49、50;其余原始编号是丢弃的录制,client 会直接拒绝;replay 必须显式给 --episode)。
  4. 三道现场关卡(编号与解包后 README 第 5 节一致),全部通过、并且上面的已知阻塞已决定之后,才能执行:
    1. 控制器 --execute(未 arm)后,client live dry-run 核验运行中控制器的身份与增益(三个 v1.0 SHA,motor_kp_scale == motor_kd_scale == ""),控制器输出里没有 Motor Kp/Kd scales 行。
    2. /deployment-info 显示 ready=true、latency_ok=true、fault=null,且推理耗时最大值 < 350 ms(d=12)。recent_inference_ms 只含最近 32 次推理,所以还要看 dry-run events.jsonl 里全部 profile 事件的 latency_ms。唯一文档化的回退是 --rtc-delay 13(门槛 < 383 ms)。
    3. 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(rev e71bbad2),原始 51 条中保留录制时标记为 saved 的 15 条,共 6,503 帧,30 Hz,ego 视角 640×360。转换使用上游 Psi0 4f3720d 的 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/断流回退的硬件行为、扔垃圾成功率。
Downloads last month

-

Downloads are not tracked for this model. How to track
Video Preview
loading

Dataset used to train ChenyuanC/psi0-trashbin-5k