Skip to content

Work: BFM-Zero→UniLab (MuJoCo) migration fidelity — v6 fixes v4 low-precision + v5 motion regression #690

Description

@LeeLeno

问题(Problem)

将 BFM-Zero(IsaacSim,双卡)迁移到 UniLab(MuJoCo,单卡)做 motion tracking,目标是在 MuJoCo 下复现参考级跟踪质量。目前迁移已能训练但保真未达标:

  • v4(commit 0796a92f):可实现低精度跟踪(动作基本对、精度待提升)。
  • v5(commit 412f70dd):部分动态动作明显退化(fall / jump / fight 类"站着不动 / 跟错目标")。
  • v6:正在跑,旨在同时解决 v4 的精度不足与 v5 的动作退化

迁移目标

  • 迁移效果:MuJoCo 下跟踪 EMD 对齐参考。主指标 eval/humanoidverse_tracking_eval/emd(= state[:23] OT == 参考 obs_state_emd,参考 golden ≈ 0.74,目标 < 0.75)。
  • 训练时长:参考 @19m steps 达 EMD 0.9,< 0.75 约需 50–100M steps。按下方单卡吞吐,50–100M ≈ 50–100h(5090 单卡)。实际0.8以内即可。
  • 可支持设备:单卡即可训练(不依赖原仓库的双卡)。

吞吐 / 显存现状

环境 显存 吞吐
UniLab @ 5090 单卡 ~27 G ~1M steps/h
UniLab @ 6000 Ada 单卡 ~27 G ~0.5M steps/h
原仓库 BFM-Zero @ 5090 双卡 共 42 G ~2M steps/h

当前状态(结合 tensorboard 曲线 + 排查)

口径提示:v4 曲线为 eval_n_motions=16 + 旧 eval rollout(数值虚高),v5(5090)为 eval_n_motions=862 + 修正 rollout;两者 tensorboard 绝对值不可直接比。下方"当前代码全 862 重评"才是同口径对照。

v4(低精度跟踪 OK)

  • tensorboard emd(state[:23],16 条 / 旧 rollout):谷 ≈ 2.77 @18.5M → 2.95(旧 rollout 抬高)。
  • 现象:能跟踪,精度不足;无明显乱做动作。

v5(部分动作退化)

  • tensorboard(5090,862 条):emd1.00 @18M → 回升 1.08 @43Memd_dof291.85 @29m → 1.97触底回升,而参考单调降到 0.86。
  • 同设备对照:fidelity_v5_6000Ada(同 tatp、新代码)曲线压在 5090 上,emd 1.19 @9.6M 仍降 → 退化是代码驱动、可复现,非跨设备波动。

当前代码全 862 重评(同口径对照)

  • 聚合 emd 打平:v4 1.038 / v5_5090 1.048;差异全在尾巴——5090 max 3.90 vs v4 2.74,emd>2.5 的动作 10 vs 4,退化最狠 7/12 是动态动作(fallAndGetUp / jumps / fight)。
  • 失败动作是稀有 / 非典型动作(z 与全局均值近正交),即少数难动作被淹没、欠学。

根因(对照参考仓库生效链路)

  1. 专家速度平滑分辨率错(v5 专属):先重采样 30→50Hz 再 gaussian σ=2(~40ms 窗),参考在原生 30fps 算再插值(~67ms)。离线 RMS 偏差 lin 12% / ang 23% / dof 14%,dance/fall 最大 → 判别器 / backward 学偏 → 动态动作退化。
  2. 缺 EMD 优先级重采样(v4/v5 都缺):参考每次 eval 后按 per-motion EMD 上采样难动作(专家 buffer + 在线 RSI 双路);UniLab 移植了 buffer 机制但从未接线,复位均匀随机 → 稀有动作欠学、eval 触底回升。
  3. eval 指标命名反转:UniLab emd(state[:23])== 参考 obs_state_emd;UniLab emd_dof29 == 参考 emd 列。绝对值差(~1.0 vs 参考 0.74)来自 MuJoCo vs IsaacGym rollout(sim2sim 本质,非 bug)。

交付物(Deliverable)

  • v6:在 MuJoCo 单卡训出不再出现动作退化、且精度不低于 v4 的 tracking 权重。
  • 已合入的修复(A/B):
    • A 专家速度按原生 fps 计算再插值(对齐参考顺序);
    • B 接线 EMD 优先级重采样(专家 buffer + 在线 RSI 双路),启动即校验 eval_n_motions == 专家动作数
  • 默认配置更新:eval_n_motions 16→862,prioritization=true

重训命令(v6)

uv run train --algo bfm --task g1_bfm --sim mujoco \
  +training.log_dir=logs/bfm/fidelity_v6 \
  algo.num_env_steps=100000000 \
  algo.eval_n_motions=862 \
  algo.eval_every_steps=1000000

完成定义(Definition of done)

  • eval/humanoidverse_tracking_eval/emd(state[:23])单调下降、不再触底回升
  • per-motion 尾巴(max / p99)较 v5 明显收窄;动态动作不再"站着不动"
  • 最终 emd ≤ v4 水平(862 条 ≈ 1.04),并向参考 0.74 靠拢(受训练步数 + sim2sim gap 约束)。
  • 日志每次 eval 后出现 [bfm] prioritization updated: p in [..,..](p 有分布)。

验证计划(Validation plan)

  • 训练中盯 emd / emd_dof29 曲线趋势 + per-motion 尾巴。
  • 收敛后用当前代码对 v6 与 v4 做同口径全 862 重评对比。
  • 侧写脚本已在 scripts/_diag_permotion_eval.py(per-motion + 尾巴/z)、_diag_vel_smoothing.py_verify_A.py_verify_B.py

依赖 / 阻塞(Dependencies / blockers)

  • 参考仓库:/home/robot/ws/lxf/BFM-Zero(生效链路对照 + golden 0.74/0.86)。
  • UniLab 单卡 eval 为串行(862 条 ~数十分钟/次,复用已有 eval、不额外加成本);如需提速可后续做并行 eval(不影响正确性)。

Metadata

Metadata

Assignees

Labels

area:g1G1 robot tasks and infrastructure

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions