Files
dex_workbench/L20_IMITATION.md
chenlin f5d84e26f6 feat(tracking): 汇总 v0.1.3 回放与 ACT 准备进度
新增专家轨迹诊断、原视频估计相机入口和状态参考ACT数据门禁/训练链路;更新版本与进度文档。

验证:120项CPU/USD回归和4步synthetic CPU smoke通过;1333帧默认GUI历史回放PASS。原视频相机完整回放超时124,策略GPU E2E未执行,完整pre-commit工具缺失。

兼容性:HDF5、Cartpole、USD和控制阈值保持不变。本提交为实验进度快照,不宣称完整发布验收通过;数据、视频和权重不纳入。
2026-09-15 16:29:17 +08:00

223 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# L20 状态输入 ACT:训练准备与运行
**v0.1.3 更新**:最新汇总见 [`PROGRESS_v0.1.3.md`](PROGRESS_v0.1.3.md)。本轮120项回归及新的4步CPU smoke通过。
已收到1333帧同源轨迹和估计相机;这不构成新的独立采集组或实测尺度审查。
默认展示相机参考回放已有PASS,原视频相机完整运行超时;ACT策略GPU E2E仍NOT_RUN。
下文环境安装、118项测试和“未升级/未提交”等描述是初次ACT准备阶段的历史记录,不是v0.1.3提交状态。
## 当前交付范围
路线A:**腕手参考轨迹模仿 → 仿真评估 → 后续PPO refinement**。
当前提供可执行的状态输入ACT-style CVAE Transformer、数据门禁、离线训练/保存/加载/留出评估,
以及已有Isaac Lab受限回放入口的可选闭环策略分支。
- **PASS**:本机CPU依赖、editable安装、synthetic短训练→保存→加载→离线预测链路及回归测试。
- **BLOCKED**:真实专家训练,目前只有单条示例,且独立坐标/尺度审查未闭合;不能自动批准。
- **NOT_RUN**:新策略分支的GPU仿真E2E、真实专家训练/质量评测、GUI策略回放。
历史75/80倍参考回放PASS不等于新策略回放PASS。
- 没有创建L20 Gym/RL任务、奖励、物体场景、PPO、视觉模型或硬件驱动;Cartpole任务及checkpoint保留。
本页的“训练可运行”指离线参考模仿,不是抓取训练就绪或Sim2Real验收。
## 1. 本机环境
继续使用已有Isaac Sim Python**不更换它的PyTorch/CUDA**。
本次实测:Python3.12.13、PyTorch2.10.0+cu128、numpy2.5.1、h5py3.16.0
Isaac Sim6.0.1-rc.7Isaac Lab可发现。本轮没有初始化CUDA训练或启动Kit。
从仓库根目录运行:
```bash
# 本机默认使用 ~/isaacsim/python.sh;不同安装位置由调用者显式设置。
# export ISAACSIM_PYTHON=/path/to/isaacsim/python.sh
bash scripts/imitation.sh doctor
# 本机已实际执行:仅安装项目,不访问索引、不安装/升级依赖。
~/isaacsim/python.sh -m pip install --no-index --no-deps --no-build-isolation -e source/dex_workbench
```
`setup.py`已收录`dex_workbench_imitation`包及`imitation`可选依赖。
本机旧installed metadata为0.1.0,本次重新安装后与源码0.1.2一致;**未修改源码版本号**。
不要在Isaac Python里盲目执行`pip install --upgrade torch`或复制另一机器的CUDA wheel。
新节点须先安装兼容的Isaac Sim/Lab和已核验依赖,再执行上述本地安装与doctor。
右手USD目前仅本地存在,存储/再分发许可尚未闭合;离线训练只消费HDF5与清单,
新节点仿真评估另需合法取得同哈希资产并重建prepared层,不保证干净克隆直接可回放。
可选 `doctor --cuda`仅检查CUDA可用性,不是GPU容量或仿真验收。
包装脚本设置本仓库`PYTHONPATH`,不改变调用者cwd;输入/输出相对路径仍相对于调用目录。
不要求激活系统Python或下载额外模型,也不会自动搜索“最新checkpoint”或自动开始训练。
## 2. HDF5补齐后还需要哪些输入
沿用 [`l20_tracking_v1`](HDF5_REQUIREMENTS.md),不新增伪造观测/力矩字段,不改变现有回放契约。
训练前需要三个实际文件及同版模型清单:
1. **HDF5**:经过同版模型绑定,全部使用一侧L20与同一校准;各episode全有效,单位/时间/顺序/限位/联动正确。
不能直接把原始交付的暂定资产哈希替换成当前清单哈希。
2. **划分文件**:参照 `configs/imitation/splits.example.json`,在仓库外填写实际episode与采集来源。
3. **数据审查文件**:参照 `configs/imitation/data_review.example.json`,在独立复核后由负责人填写。
### 划分与来源
- 至少 **两个独立采集组**才可进行训练+验证,建议另有独立test组;这只是最小接口门槛,不是数据充足标准。
- 每个episode必须且只能属于train/validation/test中的一个。不能随机按帧划分。
- 同一原始录制的切片、慢放、重采样或重复导出,必须使用同一`episode_groups`值且落在同一分区。
- 自动拒绝跨分区同group及几何数组逐值重复的轨迹(忽略时间,捕获改名/慢放副本)。
不能自动识别所有重采样、裁剪或旋转等价副本;仍需负责人核对真实采集来源。
- `episode_groups`不是自动生成的独立性证据,示例中的占位名称必须替换。
- HDF5中所有episode必须明确划分,不静默忽略文件里的额外轨迹。
### 审查文件不是绕过门禁的开关
填写**实际HDF5文件SHA256**和资产包SHA,记录`reviewer``evidence`,明确:
- `coordinate_and_scale_reviewed`:坐标变换、SLAM尺度与同步已经独立复核;
- `reference_state_targets_accepted`:同意把未来参考状态作为这一实验的目标代理,而非宣称实测动作;
- `capture_groups_reviewed`:数据来源与跨分区泄漏已人工审核。
示例默认false/空值,**刻意不能通过训练门禁**。程序只检查声明与文件绑定,不能替代人的真实审查。
当前已收到估计相机SE3,但尺度与独立数据审查仍未闭合,不能把标记自动改为true来启动。
### 速度和时间
- 配置控制频率30Hz;保留数据物理时间,按线性位置/关节插值及shortest-arc SLERP重采样。
- episode末时刻须落在控制频率网格上;只处理浮点舍入,不静默裁去尾帧或改变时长。
- 保留既有参考上限:腕平移0.05m/s、腕旋转0.5rad/s、所有状态关节0.5rad/s。
默认实验工作半径0.8m,与先前扩范围回放一致。
- **训练准备不自动慢放、缩放、平滑、重居中或跨无效帧插值**。超限时明确失败,由数据方另出可追溯版本。
- 单文件读取上限2GiB,重采样总帧数默认500000;大数据须明确分片/扩展,不自动放大资源预算。
## 3. 观测/动作契约:`l20_goal_reference_act_v1`
这是**状态参考模仿基线**,不是完整Canonical Skill Space或全项目DexSchema实现。
共享几何使用相对episode初始根link的腕部位姿;构型特有的关节顺序、主从映射与限幅封装在Adapter中。
不把21状态关节或16个目标硬编码为所有手型接口,也不把模型独立目标数当作硬件电机数。
| 项目 | 定义 |
| --- | --- |
| 当前状态 | 初始根坐标系中的当前腕位置3维、旋转6D(旋转矩阵前两列)、清单全部J个状态关节 |
| 条件目标 | 同坐标系下的episode终点腕位姿、终点M个模型独立关节姿态 |
| 时间条件 | 归一化phase及episode时长(秒);用于指定此参考的时间参数,不是奖励 |
| 观测维数 | `20 + J + M`(当前已核验右手为57 |
| 输出 | 未来chunk的腕位置/旋转6D与M个独立`q_target`代理,维数`9 + M`(当前右手25 |
| 训练输入来源 | HDF5的参考状态;没有声称这是执行后传感器观测 |
| 仿真输入来源 | 实际当前root-link pose/q,加预先给定终点目标、phase和时长;不喂未来中间参考帧 |
当前状态→未来状态目标不是已测量的动作因果对。训练中teacher-forced参考状态与部署时受扰状态存在分布差异;
多条路径也可能共享相同起终点。这是需要真实仿真评估和后续示教/残差策略研究的风险,不因loss降低而消失。
不向网络输入完整未来参考轨迹来假装闭环成功。
### 模型与loss
- 状态输入ACT-style CVAE:训练时Transformer posterior编码观测及未padding的未来动作块,
得到高斯latentdecoder根据观测+latent与chunk queries预测未来目标。
- masked normalized L1 + KLpadding既不参与reconstruction loss,也被posterior attention mask排除。
- 推理固定latent=0,不使用训练posterior的未来目标;无dropoutCPU推理确定。
- 不是官方ACT仓库/权重兼容实现;没有视觉ResNet或Diffusion分支。
- normalization仅由训练分区的非padding帧拟合,验证/test数据不参与统计。
- best checkpoint仅按validation选择;test不参与优化或checkpoint选择。
默认 `configs/imitation/l20_right_act.json`:chunk16、每次执行前4个目标再规划、30Hz目标频率,
Transformer宽128/2层/4heads/latent32、batch32、seed42、最多1000更新且600秒。
这是**有界起始配置,不是已调优或保证收敛的超参**。600秒是训练/验证循环的内部预算,
不包含此前的数据预检;命令另设外部进程超时。预算耗尽记FAIL/未完成,不伪装成完成训练。
## 4. 数据到位后的命令
下面变量由调用者指向审核后的文件;`OUT`必须是新的仓库外目录。
当前示例数据不会通过这些正式训练门禁,这属于预期BLOCKED,不是安装失败。
```bash
MANIFEST=assets/robots/dex_hand/linkerhand_g20_right/tracking_manifest.json
CONFIG=configs/imitation/l20_right_act.json
# DATA=/approved/path/demonstrations.hdf5
# SPLITS=/approved/path/splits.json
# REVIEW=/approved/path/data_review.json
# OUT=/external/artifacts/l20-act-run-001
# 先只做CPU数据预检;父目录须存在,输出JSON必须为新文件。
bash scripts/imitation.sh preflight --hdf5 "$DATA" --manifest "$MANIFEST" \
--config "$CONFIG" --splits "$SPLITS" --data-review "$REVIEW" --output "$OUT-preflight.json"
# 审核数据与资源预算后再由用户启动;不传--execute会拒绝。
# CUDA是显式选择;不可用时报错,不静默换CPU,也不安装替代CUDA依赖。
timeout --kill-after=15s 660s bash scripts/imitation.sh train --hdf5 "$DATA" --manifest "$MANIFEST" \
--config "$CONFIG" --splits "$SPLITS" --data-review "$REVIEW" \
--device cuda --execute --output "$OUT"
# 按完整test分区做离线预测评测(CPU);这不是仿真rollout或任务成功率。
bash scripts/imitation.sh evaluate --checkpoint "$OUT/best.pt" --hdf5 "$DATA" \
--manifest "$MANIFEST" --split test --output "$OUT-test.json"
```
`train`默认device为CPU;不要省略CUDA选择后误以为已用GPU。修改`max_updates/max_seconds`等资源预算应先确认。
训练输出为`run.json`、逐更新`metrics.jsonl``best.pt``last.pt``result.json`
受控异常输出`failure.json`,不写成功result;进程硬超时/中断可能只留下部分制品,缺少result不能算PASS。
已有目录拒绝使用,不自动覆盖历史实验。
同一新run内best/last通过临时文件原子发布;记录配置、数据/Adapter、split/review、源模块哈希与依赖版本。
checkpoint使用tensor-only加载,绑定contract、资产/Adapter及normalization。
本版本支持**推理加载,不提供优化器resume**;不要把另一次新训练冒充恢复同一优化状态。
同一checkpoint的评估必须使用同一HDF5哈希;新评测数据需要显式评估接口扩展,不靠改metadata冒充原评测集。
## 5. 仿真策略评估入口(已实现,GPU E2E为NOT_RUN
新增可选 `scripts/tracking/track_l20.py --policy-checkpoint`,默认不传时保留参考目标回放逻辑。
PASS日志增加`control_source``policy_checkpoint_sha256`字段;不改变HDF5 schema。
只接受训练数据中明确属于validation/test的episode,拒绝train episode;要求完整回合回放。
运行前仍检查source/prepared USD、PhysX后端、参考速度/范围及所有旧门禁。
策略在控制步读取实际状态,执行chunk前4个目标后重规划;每个240Hz物理步均经过Adapter
- 将6D旋转恢复为合法旋转;退化/非有限输出明确失败,不能静默给单位姿态。
- 限制起点相对工作半径、目标平移/转动速度;关节按主从约束交集限位。
- 独立关节限速还考虑mimic倍率,确保派生状态关节目标也满足参考速度上限。
- 只发master `q_target`及既有根部wrench PD;从动关节由物理耦合响应,不独立驱动。
- 两轮分别清空policy chunk、时间计数及限幅器状态;只有原有reset路径写物理状态。
- 保留原有动态误差/限位/速度/mimic/非零运动及reset、位姿/速度重复性检查。
策略未训练好时应该FAIL,不用参考轨迹替代网络输出来通过。
确认无其他GPU/Kit作业,并**另行批准单次仿真预算后**才运行:
```bash
export PYTHONPATH="$PWD/source/dex_workbench${PYTHONPATH:+:$PYTHONPATH}"
# EPISODE必须属于validation/testSTEPS必须等于该回合秒数*240,且100<=STEPS<=32000。
# TIMEOUT_S须覆盖已批准预算;外部终止宽限15秒,不自动重试。
timeout --kill-after=15s "$TIMEOUT_S" ~/isaacsim/python.sh scripts/tracking/track_l20.py \
assets/robots/dex_hand/linkerhand_g20_right/tracking.usda --manifest "$MANIFEST" \
--hdf5 "$DATA" --episode "$EPISODE" --steps "$STEPS" --full-episode \
--workspace-radius 0.8 --policy-checkpoint "$OUT/best.pt" --execute-experimental --headless
```
策略与运行时控制参数必须与checkpoint绑定值一致;不允许临时扩大范围或阈值来通过。
日志使用独立标记`bounded_reference_act_rollout`,记录checkpoint SHA、推理次数和目标限幅步数。
目标限幅计数**不是**真实wrench/力矩饱和统计。
完整轨迹、非零运动和误差门禁仍可能限制部分静止/局部手指episode的仿真验收;
这些数据可以用于离线训练,不得为了满足诊断而添加伪运动。
## 6. 本次测试证据与剩余工作
本机证据位于 `../dex_workbench-evidence/l20-act-setup-M9Y0OX/`,不随代码分发。
```bash
# 已执行:只生成明确synthetic的三条不同解析轨迹,4次小CPU更新;不启动Kit。
bash scripts/imitation.sh smoke --manifest assets/robots/dex_hand/linkerhand_g20_right/tracking_manifest.json \
--output "$NEW_EXTERNAL_SMOKE_DIRECTORY"
PYTHONPATH=source/dex_workbench ~/isaacsim/python.sh -m unittest discover \
-s source/dex_workbench/tests -p 'test_*.py' -v
```
- 依赖/安装PASS:项目editable安装成功,无依赖下载/升级;CPU doctor及`doctor --cuda`可用性探测成功。
另在仓库外、清除PYTHONPATH后验证安装包可导入;CUDA可用不代表本轮执行过GPU训练或仿真。
- CPU smoke PASS:真实反向传播4次、有限loss、保存非空checkpoint、tensor-only重新加载;
重新加载预测最大差0;独立test分区离线预测有限。仅为管线验证,不宣称收敛。
- 全部118项回归PASS,无跳过(包含20项新增模仿学习测试);覆盖坐标/半周旋转、coupling/rate限幅、
数据划分/分组/重复轨迹、训练统计隔离、padding mask、CVAE梯度、checkpoint身份、预算失败、
拒绝覆盖、held-out策略时钟/reset,以及旧tracking回归。
- 新仿真策略分支E2E、当前修改后的默认参考回放GPU回归、真实数据训练为NOT_RUN;
没有沿用上一轮已消耗的600秒GPU授权。完整pre-commit工具仍缺失,不宣称全量发布门禁通过。
- 后续:补齐数据审查与独立episode → 批准小规模真实训练预算 → 新checkpoint仿真闭环验收;
之后才设计PPO refinement或视觉/物体任务。尚无任务成功率、Sim2Real或SkillBundle交付声明。
- 本轮新增包/配置/文档,扩展可选策略入口;原始数据、USD、控制增益与物理阈值未改,
不升级包版本或改变Cartpole任务。未暂存、提交、推送。