diff --git a/四足机器狗训练到实机部署全流程指南.md b/四足机器狗训练到实机部署全流程指南.md index 358944c..a2687b1 100644 --- a/四足机器狗训练到实机部署全流程指南.md +++ b/四足机器狗训练到实机部署全流程指南.md @@ -2,30 +2,39 @@ > 本教程基于西安交通大学 RoboGauge 团队的研究成果 [Toward Reliable Sim-to-Real Predictability for MoE-based Robust Quadrupedal Locomotion](https://robogauge.github.io/static/files/arxiv.pdf) 及其[项目主页](https://robogauge.github.io/complete/),将原始 Go2 训练任务适配为 Unitree Go1,并串联 IsaacLab 训练、RoboGauge 评估、MuJoCo sim2sim、ONNX 导出、RDK X5/S100 BPU 量化和 sim2real。 > -> 本文依据当前本地仓库代码和本次 Go1 训练记录整理。IsaacLab 训练、模型导出以及 RoboGauge 单模型评估命令已在训练机上验证;全新环境安装、BPU 量化和实机命令仍需在目标设备上逐条复核。不要整段复制后无人值守运行。 +> 本文依据当前本地仓库代码和本次 Go1 训练记录整理。已验证 1 轮 IsaacLab 训练、ONNX 接口与推理、MuJoCo 采样、RoboGauge 单任务评估,以及使用 ONNX 推理采样数据完成 X5/S100 PTQ 编译的链路。板端数值、延迟和硬件命令仍需在对应设备上逐条复核。不要整段复制后无人值守运行。 ## 1. 教程范围与版本约定 ### 1.1 仓库 -| 用途 | 仓库或目录 | -| --- | --- | -| IsaacLab 训练与自带 MuJoCo 部署 | `go2_rl_robotlab` 的 `go1` 分支 | -| 自动化 sim2sim 评估 | `RoboGauge` 的 `go1` 分支 | -| 独立 MuJoCo、ONNX、X5/S100 BPU 部署 | `go1_pro_deploy/deploy_45dim_rl_gym` | +| 用途 | 镜像内目录 | 本次验证版本 | +| --- | --- | --- | +| IsaacLab 源码 | `/opt/IsaacLab` | `v2.3.2` | +| IsaacLab 训练与自带 MuJoCo 部署 | `/opt/go2_rl_robotlab` 的 `go1` 分支 | `f40874bc90c72264dbf46989d90e15a9715c1393` | +| 自动化 sim2sim 评估 | `/opt/RoboGauge` 的 `go1` 分支 | `66d0eb9010dabc501c52a8b9e5ffb2149dbcb82b` | +| 独立 MuJoCo、ONNX、X5/S100 BPU 部署 | `/opt/go1_pro_deploy/deploy_45dim_rl_gym` | `22a13d6659c59e2793b08c767ab69d8fcc0a406b` | | 官方公开 SDK | [unitree_legged_sdk](https://github.com/unitreerobotics/unitree_legged_sdk) | | 私有 Go1 PRO SDK | 仅在内部部署机使用,本文不公开协议、密钥和专有接口 | +本文有两条使用路径: + +- **路径 A,直接使用交付镜像**:不要重新 clone 或重新安装,使用 `/opt` 下的固定目录和解释器。 +- **路径 B,没有镜像**:按 3.4 节拉取仓库并安装,但仓库、虚拟环境、日志和产物仍全部放在 `/opt`。 + +除第 11 至 14 节明确标注的 X5/S100 板端命令外,文中的 `/root/...` 不适用于训练镜像。训练镜像不得把环境或项目放到用户 home 目录。 + 本次训练在约 33540 轮手动停止,最后一个完整保存的检查点是 `model_33500.pt`。综合当前单 seed RoboGauge 结果,本文仍用 **26000 轮检查点**作为平地与三级楼梯之间较均衡的部署基线;33500 是最新候选,而不是无条件替代 26000。示例发布名称如下: ```text 训练检查点: model_26000.pt -浮点模型: policy_robotlab_26000.onnx +TorchScript: policy_robotlab_26000_post_command_curriculum.pt +浮点模型: policy_robotlab_26000_post_command_curriculum.onnx X5 模型: policy_robotlab_26000_int16_gemm.bin S100 模型: policy_robotlab_26000_s100_int16_gemm.hbm ``` -训练目录中的导出文件会保留课程阶段,例如 `policy_robotlab_26000_post_command_curriculum.onnx`;确定发布版本后可再复制为上面的短名称。26000 只是当前均衡基线,不表示轮数越大一定越好。若任务以上楼梯为主,应同时保留 15000 和 26000;若以平地高速或下楼梯为主,可继续比较 33500。最终模型仍应根据多 seed RoboGauge、MuJoCo 回放和真机日志共同选择。 +训练目录中的导出文件会保留课程阶段。量化脚本使用 `--name policy_robotlab_26000` 时会生成上面的 X5/S100 短名称;TorchScript/ONNX 是否另存为不带课程后缀的别名必须在发布记录中明确。26000 只是当前均衡基线,不表示轮数越大一定越好。若任务以上楼梯为主,应同时保留 15000 和 26000;若以平地高速或下楼梯为主,可继续比较 33500。最终模型仍应根据多 seed RoboGauge、MuJoCo 回放和真机日志共同选择。 ### 1.2 全流程 @@ -38,7 +47,7 @@ Go1 模型与任务适配 -> RoboGauge 自动评估 -> 独立 MuJoCo sim2sim -> ONNX 实机只读和悬空测试 - -> 用真实日志制作 BPU 校准集 + -> 用 ONNX 推理生成 PTQ 校验基准 -> X5/S100 量化与离线对齐 -> BPU 悬空对照 -> 低速地面测试 @@ -68,58 +77,230 @@ Go1 模型与任务适配 RoboGauge 当前关注的指标包括关节软限位、线/角速度误差、电机功耗、姿态稳定性、力矩平滑度、摩擦裕度和 ZMP 裕度。归一化后均按“越大越好”解释,但任何综合分数都不能替代分项检查。 -## 3. 训练环境 +## 3. 两种环境准备方式 ### 3.1 硬件与软件前提 - NVIDIA GPU 和匹配的驱动。 - Linux 训练环境;图形界面训练不是必须。 - Python 3.11。 -- IsaacLab/Isaac Sim 2.3.2 对应依赖。 +- IsaacLab `2.3.2.post1` 和 Isaac Sim `5.1.0.0`。 - 足够的磁盘空间保存检查点、TensorBoard 日志和导出模型。 -### 3.2 RoboGo 镜像 +### 3.2 路径 A:直接使用交付镜像 -此处由维护者补充平台镜像信息: +以下信息在当前工作区无法从文件和 Docker 本地缓存推断,属于交付前必须填写的镜像元数据: ```text -TODO(维护者填写) +交付阻断项(维护者填写) RoboGo 镜像名称: 镜像拉取命令: 容器启动参数: 训练数据持久化目录: ``` -若镜像已包含 IsaacLab、项目仓库和依赖,可跳过下一节的手工安装,但仍需核对代码分支和版本。 +量化工具链不依赖交付镜像本身的 CUDA 环境,已单独归档到 `/opt`: -### 3.3 手工安装 +```text +/opt/envs/go2_rl_robotlab/docker-toolchain/images/openexplorer_ai_toolchain_ubuntu_20_x5_cpu_v1.2.8.tar +/opt/envs/go2_rl_robotlab/docker-toolchain/images/ai_toolchain_ubuntu_22_s100_s600_cpu_v3.7.0.tar +``` + +归档内只有 Docker CLI 和工具链镜像,不包含也不应在交付镜像内自行启动 `dockerd`。量化时应连接宿主 Docker daemon,先执行 `docker load -i <归档>`,再运行第 11 节脚本。本次已实际加载并验证两个归档。 + +如果交付镜像本身运行在 Docker 中,需要由宿主在创建容器时挂载 Docker socket: ```bash -conda create -n go2_rl_robotlab python=3.11 -y -conda activate go2_rl_robotlab +# 以下在宿主执行,放入实际的 docker run 参数中 +docker run ... \ + -v /var/run/docker.sock:/var/run/docker.sock \ + +``` + +进入容器后验收 CLI 和 daemon: + +```bash +sudo /opt/envs/go2_rl_robotlab/docker-toolchain/bin/docker info +sudo /opt/envs/go2_rl_robotlab/docker-toolchain/bin/docker image inspect openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.8 +sudo /opt/envs/go2_rl_robotlab/docker-toolchain/bin/docker image inspect registry.d-robotics.cc/deliver/ai_toolchain_ubuntu_22_s100_s600_cpu:v3.7.0 +``` + +本次验证 daemon 的 `DockerRootDir` 是宿主 `/var/lib/docker`。交付所需的 CLI、配置和可重新加载的镜像归档都在 `/opt/envs/go2_rl_robotlab/docker-toolchain`;`docker load` 之后的展开层属于宿主 daemon 缓存,不会被保存进 RoboGo 交付镜像。如果专用量化主机要求 Docker 展开层也位于 `/opt`,应由主机管理员在首次 `docker load` 之前设置 daemon,不要在共享 Docker 主机上盲目更改: + +```json +{ + "data-root": "/opt/envs/go2_rl_robotlab/docker-toolchain/docker-data" +} +``` + +上述内容应合并到宿主 `/etc/docker/daemon.json`,然后由管理员重启 Docker 并用 `docker info --format '{{.DockerRootDir}}'` 验收。修改数据根目录会影响该 daemon 管理的所有镜像和容器,不是普通容器内步骤。 + +镜像内目录必须固定如下: + +```text +/opt/IsaacLab +/opt/go2_rl_robotlab +/opt/RoboGauge +/opt/go1_pro_deploy +/opt/envs/go2_rl_robotlab +/opt/envs/robogauge +``` + +直接使用镜像时跳过 3.4 节。首次进入容器先执行验收,不要看到 `/opt/IsaacLab` 存在就默认版本正确: + +```bash +export OMNI_KIT_ACCEPT_EULA=YES +export MPLCONFIGDIR=/tmp/robogauge-matplotlib + +test -d /opt/IsaacLab +test -d /opt/go2_rl_robotlab +test -d /opt/RoboGauge +test -d /opt/go1_pro_deploy +test -x /opt/envs/go2_rl_robotlab/bin/python +test -x /opt/envs/robogauge/bin/python +nvidia-smi + +git --git-dir=/opt/IsaacLab/.git --work-tree=/opt/IsaacLab describe --tags --always +/opt/envs/go2_rl_robotlab/bin/python -c "import isaaclab, torch; import importlib.metadata as m; print('isaaclab', m.version('isaaclab')); print('isaacsim', m.version('isaacsim')); print('torch', torch.__version__)" +``` + +预期为 IsaacLab `v2.3.2`/`2.3.2.post1`、Isaac Sim `5.1.0.0`、PyTorch `2.7.0`。IsaacLab `v2.2.0` 搭配 Isaac Sim `5.0.0` 与当前 `go1` 分支不兼容,不能作为交付镜像发布。本次检查发现原始 `/opt/IsaacLab` 正是该不兼容组合;镜像维护者必须在发布层将 `/opt/IsaacLab` 替换为 `v2.3.2`,不能只在另一个临时目录安装新版后继续交付旧路径。 + +Pip 版 Isaac Sim 首次启动必须接受 EULA。建议把下面变量写入镜像运行环境,而不是只写在某个用户的 shell 历史中: + +```bash +export OMNI_KIT_ACCEPT_EULA=YES +``` + +下列目录会在训练或评估时写入,镜像构建阶段必须由 root 预建并授予实际容器用户写权限: + +```text +/opt/go2_rl_robotlab/logs +/opt/go2_rl_robotlab/outputs +/opt/RoboGauge/logs +/opt/RoboGauge/outputs +/opt/go1_pro_deploy/logs +/opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/cache +/opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/data +/opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/logs +/opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/data/Kit/Isaac-Sim/5.1/user.config.json +``` + +Dockerfile 中应使用交付镜像的实际运行 UID/GID(下面的 `APP_UID/APP_GID` 只是占位符): + +```dockerfile +RUN install -d -m 0775 /opt/go2_rl_robotlab/logs /opt/go2_rl_robotlab/outputs \ + /opt/RoboGauge/logs /opt/RoboGauge/outputs \ + /opt/go1_pro_deploy/logs \ + /opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/cache \ + /opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/data \ + /opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/logs \ + && chown -R ${APP_UID}:${APP_GID} /opt/go2_rl_robotlab/logs /opt/go2_rl_robotlab/outputs \ + /opt/RoboGauge/logs /opt/RoboGauge/outputs \ + /opt/go1_pro_deploy/logs \ + /opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/cache \ + /opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/data \ + /opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/logs +``` + +运行用户验收: + +```bash +test -w /opt/go2_rl_robotlab/logs +test -w /opt/go2_rl_robotlab/outputs +test -w /opt/RoboGauge/logs +test -w /opt/RoboGauge/outputs +test -w /opt/go1_pro_deploy/logs +test -w /opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/cache +test -w /opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/data +test -w /opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/logs +test -w /opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim/kit/data/Kit/Isaac-Sim/5.1/user.config.json +``` + +旧 `/opt/IsaacSim` 清理后,RoboGauge 环境的 `bin/python3` 不得继续指向旧路径;应指向 `/opt/envs/go2_rl_robotlab/python-runtime`,并把 `/opt/RoboGauge` 和 RoboGauge 自己的 `site-packages` 放入 `PYTHONPATH`。否则第 9 节会在导入前直接报 `No such file or directory`。 + +本流程以 `/opt/envs/go2_rl_robotlab/lib/python3.11/site-packages/isaacsim` 中的 pip 版 Isaac Sim `5.1.0.0` 为准。旧的独立 `/opt/IsaacSim` `5.0.0` 已从运行环境移除;不要重新挂载它的 `PYTHONPATH` 或 `python.sh`。 + +若仓库由镜像构建用户创建、运行用户不同,普通 `git status` 可能报 `dubious ownership`。镜像应优先统一目录属主;只读检查也可使用 `git --git-dir=/opt//.git --work-tree=/opt/ ...`,不要为省事把所有系统目录加入 Git safe.directory。 + +### 3.3 镜像训练链路自检 + +正式训练前先跑 1 轮。以下命令已在目标镜像运行环境中以 16 个环境验证,完成 384 个 transition,用时约 5.23 秒;发布镜像仍必须先通过 3.2 节的版本和写权限验收: + +```bash +cd /opt/go2_rl_robotlab +OMNI_KIT_ACCEPT_EULA=YES /opt/envs/go2_rl_robotlab/bin/python scripts/rsl_rl/train.py \ + --task=RobotLab-Go1-v0 \ + --num_envs=16 \ + --max_iterations=1 \ + --run_name=image_direct_1iter \ + --logger=tensorboard \ + --headless +``` + +确认新目录中至少有 `model_0.pt`、`train.log`、TensorBoard event、`params/env.yaml` 和 `params/agent.yaml`: + +```bash +find /opt/go2_rl_robotlab/logs/rsl_rl/go1_moe_cts -path '*image_direct_1iter*' -type f -print +``` + +本次自检 checkpoint 的 SHA-256 为 `14589a131b09680bbbd10427ad6d5f90dd4cf3a0cc57b6f516c4de2ef1b0cbe3`。该文件仅证明训练链路可运行,不是可部署策略。 + +### 3.4 路径 B:没有镜像时从零安装 + +以下命令假设主机已安装 NVIDIA 驱动、Docker(量化时需要)和 Conda;Conda/Miniforge 本身也应安装在 `/opt`。即使没有镜像,也统一把项目与 Conda prefix 放到 `/opt`: + +```bash +sudo install -d -o "$USER" -g "$(id -gn)" /opt/envs /opt/IsaacLab +sudo install -d -o "$USER" -g "$(id -gn)" /opt/go2_rl_robotlab /opt/RoboGauge /opt/go1_pro_deploy + +conda create --prefix /opt/envs/go2_rl_robotlab python=3.11 -y +conda activate /opt/envs/go2_rl_robotlab python -m pip install --upgrade pip python -m pip install "isaaclab[isaacsim,all]==2.3.2.post1" --extra-index-url https://pypi.nvidia.com python -m pip install torch==2.7.0 torchvision==0.22.0 --index-url https://download.pytorch.org/whl/cu128 ``` -拉取 Go1 分支并安装项目内定制包: +拉取固定分支。内部 Gitea 地址需要相应读取权限;没有权限时应向交付方获取源码归档及 commit 校验,不能退回公开仓库的不同分支假装等价: ```bash -git clone --branch go1 --single-branch https://github.com/wertyuilife2/go2_rl_robotlab.git -cd go2_rl_robotlab +git clone --branch v2.3.2 --depth 1 https://github.com/isaac-sim/IsaacLab.git /opt/IsaacLab +git clone --branch go1 --single-branch https://gitea.qingruxu.xyz/cyy/go2_rl_robotlab.git /opt/go2_rl_robotlab +git clone --branch go1 --single-branch https://gitea.qingruxu.xyz/cyy/RoboGauge.git /opt/RoboGauge +git clone --branch main --single-branch https://gitea.qingruxu.xyz/cyy/go1_pro_deploy.git /opt/go1_pro_deploy + +cd /opt/go2_rl_robotlab python -m pip install -e source/robot_lab python -m pip install -e source/rsl_rl -python -m pip install mujoco pygame onnx onnxruntime tensorboard +python -m pip install tensordict onnx onnxscript onnxruntime mujoco pygame tensorboard +``` + +RoboGauge 使用独立环境,避免其 `mujoco==3.2.3`、`dm_control==1.0.23` 和 `numpy<2` 约束影响 IsaacLab。必须先固定 PyTorch,防止无上限的 `torch` 依赖在未来解析成 CUDA 13 等大体积版本: + +```bash +conda create --prefix /opt/envs/robogauge python=3.11 -y +conda activate /opt/envs/robogauge +python -m pip install torch==2.7.0 --index-url https://download.pytorch.org/whl/cpu +cd /opt/RoboGauge +python -m pip install -e /opt/RoboGauge +``` + +最后由管理员创建运行目录并交给实际运行用户: + +```bash +sudo install -d -o "$USER" -g "$(id -gn)" /opt/go2_rl_robotlab/logs /opt/go2_rl_robotlab/outputs +sudo install -d -o "$USER" -g "$(id -gn)" /opt/RoboGauge/logs /opt/RoboGauge/outputs +sudo install -d -o "$USER" -g "$(id -gn)" /opt/go1_pro_deploy/logs ``` 记录环境,便于在部署前复现: ```bash -git rev-parse HEAD -python --version -python -m pip freeze > requirements-lock.txt +git --git-dir=/opt/go2_rl_robotlab/.git --work-tree=/opt/go2_rl_robotlab rev-parse HEAD +/opt/envs/go2_rl_robotlab/bin/python --version +/opt/envs/go2_rl_robotlab/bin/python -m pip freeze > /opt/go2_rl_robotlab/requirements-lock.txt nvidia-smi ``` @@ -277,10 +458,12 @@ max_iterations = 300000(通常通过命令行覆盖) 建议从小到大试探: ```bash -python scripts/rsl_rl/train.py --task=RobotLab-Go1-v0 --num_envs=512 --max_iterations=20 --headless -python scripts/rsl_rl/train.py --task=RobotLab-Go1-v0 --num_envs=1024 --max_iterations=20 --headless -python scripts/rsl_rl/train.py --task=RobotLab-Go1-v0 --num_envs=2048 --max_iterations=20 --headless -python scripts/rsl_rl/train.py --task=RobotLab-Go1-v0 --num_envs=4096 --max_iterations=20 --headless +cd /opt/go2_rl_robotlab +export OMNI_KIT_ACCEPT_EULA=YES +/opt/envs/go2_rl_robotlab/bin/python scripts/rsl_rl/train.py --task=RobotLab-Go1-v0 --num_envs=512 --max_iterations=20 --headless +/opt/envs/go2_rl_robotlab/bin/python scripts/rsl_rl/train.py --task=RobotLab-Go1-v0 --num_envs=1024 --max_iterations=20 --headless +/opt/envs/go2_rl_robotlab/bin/python scripts/rsl_rl/train.py --task=RobotLab-Go1-v0 --num_envs=2048 --max_iterations=20 --headless +/opt/envs/go2_rl_robotlab/bin/python scripts/rsl_rl/train.py --task=RobotLab-Go1-v0 --num_envs=4096 --max_iterations=20 --headless ``` 另开终端观察: @@ -294,10 +477,10 @@ watch -n 1 nvidia-smi ### 6.2 正式训练并保留候选检查点 ```bash -cd go2_rl_robotlab -conda activate go2_rl_robotlab +cd /opt/go2_rl_robotlab +export OMNI_KIT_ACCEPT_EULA=YES -python scripts/rsl_rl/train.py \ +/opt/envs/go2_rl_robotlab/bin/python scripts/rsl_rl/train.py \ --task=RobotLab-Go1-v0 \ --num_envs=4096 \ --max_iterations=33500 \ @@ -309,13 +492,13 @@ python scripts/rsl_rl/train.py \ 日志默认位于: ```text -logs/rsl_rl/go1_moe_cts/<时间戳>_go1_4096x24/ +/opt/go2_rl_robotlab/logs/rsl_rl/go1_moe_cts/<时间戳>_go1_4096x24/ ``` 检查点每 500 轮保存一次。不要只保留最后一个文件,至少确认课程切换前后和最终候选都存在: ```bash -find logs/rsl_rl/go1_moe_cts -name 'model_*.pt' -print | sort -V +find /opt/go2_rl_robotlab/logs/rsl_rl/go1_moe_cts -name 'model_*.pt' -print | sort -V ``` 本次实际 run 保留了 `model_15000.pt`、`model_19500.pt`、`model_26000.pt` 和 `model_33500.pt`。若训练进程被 `Ctrl+C` 中断,以磁盘上最后一个完整 checkpoint 为准;本次停止日志到 33540 左右,但 33540 没有保存,不能把 33500 标成 33540。 @@ -323,7 +506,7 @@ find logs/rsl_rl/go1_moe_cts -name 'model_*.pt' -print | sort -V ### 6.3 断点续训 ```bash -python scripts/rsl_rl/train.py \ +OMNI_KIT_ACCEPT_EULA=YES /opt/envs/go2_rl_robotlab/bin/python /opt/go2_rl_robotlab/scripts/rsl_rl/train.py \ --task=RobotLab-Go1-v0 \ --num_envs=4096 \ --max_iterations=3000 \ @@ -340,7 +523,7 @@ python scripts/rsl_rl/train.py \ 训练机执行: ```bash -tensorboard --logdir logs/rsl_rl --port 6006 +/opt/envs/go2_rl_robotlab/bin/python -m tensorboard.main --logdir /opt/go2_rl_robotlab/logs/rsl_rl --port 6006 ``` 从本机通过 SSH 查看远端 TensorBoard: @@ -373,10 +556,11 @@ ssh -L 6006:127.0.0.1:6006 @ `play.py` 加载 checkpoint 后,会先在同一 run 的 `exported/` 下生成 `policy.pt` 和 `policy.onnx`,再进入可视化 rollout: ```bash -python scripts/rsl_rl/play.py \ +cd /opt/go2_rl_robotlab +OMNI_KIT_ACCEPT_EULA=YES /opt/envs/go2_rl_robotlab/bin/python scripts/rsl_rl/play.py \ --task=RobotLab-Go1-v0 \ --num_envs=64 \ - --checkpoint=/absolute/path/to/model_26000.pt + --checkpoint=/opt/go2_rl_robotlab/logs/rsl_rl/go1_moe_cts//model_26000.pt ``` 输出: @@ -389,8 +573,9 @@ python scripts/rsl_rl/play.py \ 同一 run 下再次导出会覆盖这两个通用文件名。必须在切换到下一个 checkpoint 前复制并带上轮次、课程阶段;导出文件完整写入后才能终止 play: ```bash -cp /exported/policy.onnx /path/to/go1_pro_deploy/deploy_45dim_rl_gym/policy_robotlab_26000.onnx -cp /exported/policy.pt /path/to/RoboGauge/resources/models/go1/policy_robotlab_26000.pt +cp /exported/policy.onnx /opt/go1_pro_deploy/deploy_45dim_rl_gym/policy_robotlab_26000.onnx +cp /exported/policy.onnx /opt/RoboGauge/resources/models/go1/policy_robotlab_26000_post_command_curriculum.onnx +cp /exported/policy.pt /opt/RoboGauge/resources/models/go1/policy_robotlab_26000_post_command_curriculum.pt ``` RoboGauge 当前通过 `torch.jit.load()` 使用 TorchScript `.pt`;ONNX 用于独立 MuJoCo、量化和实机部署。两者不能只靠改后缀互换。 @@ -400,10 +585,11 @@ RoboGauge 当前通过 `torch.jit.load()` 使用 TorchScript `.pt`;ONNX 用于 训练 runner 保存的是可恢复训练的 checkpoint,不会默认在每次保存时生成 ONNX。`play.py` 即使使用 `--headless` 也会启动 Isaac Sim 和一个环境,不是纯模型导出器。要保持主训练进程运行,只应在另一块 GPU、另一台机器或确认剩余显存足够时启动独立 `play.py`: ```bash -CUDA_VISIBLE_DEVICES=1 python scripts/rsl_rl/play.py \ +cd /opt/go2_rl_robotlab +OMNI_KIT_ACCEPT_EULA=YES CUDA_VISIBLE_DEVICES=1 /opt/envs/go2_rl_robotlab/bin/python scripts/rsl_rl/play.py \ --task=RobotLab-Go1-v0 \ --num_envs=1 \ - --checkpoint=/absolute/path/to/model_26000.pt \ + --checkpoint=/opt/go2_rl_robotlab/logs/rsl_rl/go1_moe_cts//model_26000.pt \ --headless ``` @@ -417,7 +603,7 @@ CUDA_VISIBLE_DEVICES=1 python scripts/rsl_rl/play.py \ ### 8.3 检查 ONNX 接口 ```bash -python -c "import onnxruntime as ort; s=ort.InferenceSession('policy_robotlab_26000.onnx'); print([(x.name,x.shape,x.type) for x in s.get_inputs()]); print([(x.name,x.shape,x.type) for x in s.get_outputs()])" +/opt/envs/go2_rl_robotlab/bin/python -c "import onnx, onnxruntime as ort; p='/opt/go1_pro_deploy/deploy_45dim_rl_gym/policy_robotlab_26000.onnx'; onnx.checker.check_model(onnx.load(p)); s=ort.InferenceSession(p, providers=['CPUExecutionProvider']); print([(x.name,x.shape,x.type) for x in s.get_inputs()]); print([(x.name,x.shape,x.type) for x in s.get_outputs()])" ``` 预期 ONNX 输入为 `obs: [1, 450] float32`,输出为 `actions: [1, 12] float32`。本次导出的 19500、26000 和 33500 ONNX 均已通过 `onnx.checker.check_model()`。输入输出不匹配时不要继续 sim2sim 或量化。 @@ -426,18 +612,27 @@ python -c "import onnxruntime as ort; s=ort.InferenceSession('policy_robotlab_26 如果你要做的是“和部署链路一致”的快速检查,直接使用部署仓库里的 ONNX 入口。它读取当前 45 维单帧观测,并在脚本内部维护 10 帧历史,适合在进入完整 RoboGauge 评估前核对观测、动作缩放和地形 XML: +Linux 不需要 `mjpython`;它主要用于 macOS 的 MuJoCo 图形启动。镜像中用绝对 ONNX 路径执行非交互采样。该脚本会在加载模型前切换工作目录,相对 ONNX 路径可能因此失效: + ```bash -cd /path/to/go1_pro_deploy -MUJOCO_GL=glfw mjpython deploy_45dim_rl_gym/deploy_go1_onnx_mujoco_lab.py \ - --onnx deploy_45dim_rl_gym/policy_robotlab_26000.onnx +cd /opt/go1_pro_deploy/deploy_45dim_rl_gym +env -u MUJOCO_GL /opt/envs/robogauge/bin/python deploy_go1_onnx_mujoco_lab.py \ + --onnx /opt/go1_pro_deploy/deploy_45dim_rl_gym/policy_robotlab_26000.onnx \ + --sample \ + --sample-seconds 1 \ + --sample-log-dir /opt/go1_pro_deploy/logs ``` +采样目录名固定以 `mujoco_stairs_sample_` 开头,用于保存独立 MuJoCo ONNX 推理检查日志;PTQ 使用第 11 节的正式 64 样本校验集。 + 楼梯测试同样直接切 terrain: ```bash -MUJOCO_GL=glfw mjpython deploy_45dim_rl_gym/deploy_go1_onnx_mujoco_lab.py \ - --onnx deploy_45dim_rl_gym/policy_robotlab_26000.onnx \ - --terrain deploy_45dim_rl_gym/terrains/stairs/stairs_3.xml \ +env -u MUJOCO_GL /opt/envs/robogauge/bin/python deploy_go1_onnx_mujoco_lab.py \ + --onnx /opt/go1_pro_deploy/deploy_45dim_rl_gym/policy_robotlab_26000.onnx \ + --sample-stairs-level 3 \ + --sample-seconds 20 \ + --sample-log-dir /opt/go1_pro_deploy/logs \ --spawn-x -0.6 \ --spawn-z 0.34 ``` @@ -448,40 +643,46 @@ MUJOCO_GL=glfw mjpython deploy_45dim_rl_gym/deploy_go1_onnx_mujoco_lab.py \ ### 9.1 安装 -建议使用独立环境,因为当前 RoboGauge 固定了 `mujoco==3.2.3`、`dm_control==1.0.23` 和 `numpy<2`: +路径 A 的镜像用户不再安装,先检查解释器、任务注册和模型: ```bash -conda create -n robogauge python=3.10 -y -conda activate robogauge +test -x /opt/envs/robogauge/bin/python +test -f /opt/RoboGauge/resources/models/go1/policy_robotlab_26000_post_command_curriculum.pt +test -w /opt/RoboGauge/logs -git clone https://github.com/wty-yy/RoboGauge.git -cd RoboGauge +cd /opt/RoboGauge +/opt/envs/robogauge/bin/python -c "import torch, mujoco, numpy; print('torch', torch.__version__); print('mujoco', mujoco.__version__); print('numpy', numpy.__version__)" +/opt/envs/robogauge/bin/python -c "import robogauge.tasks; from robogauge.utils.task_register import task_register; print(*sorted(task_register.pipeline_classes), sep='\n')" | grep '^go1_lab\.' +``` -# go1 分支当前维护在私有派生仓库;有权限时再执行 -git remote add go1-private -git fetch go1-private go1 -git switch -c go1 --track go1-private/go1 +路径 B 的无镜像用户按 3.4 节 clone 后,单独创建环境。当前 RoboGauge 固定了 `mujoco==3.2.3`、`dm_control==1.0.23` 和 `numpy<2`;先安装固定的 CPU PyTorch,再安装仓库,避免 `setup.py` 中无上限的 `torch` 自动选中未来的大体积 CUDA 构建: +```bash +conda create --prefix /opt/envs/robogauge python=3.11 -y +conda activate /opt/envs/robogauge +python -m pip install torch==2.7.0 --index-url https://download.pytorch.org/whl/cpu +cd /opt/RoboGauge python -m pip install -e . ``` -公开仓库作为基线使用。本文所需的 `go1_lab.*` 任务来自本地修改版的 `go1` 分支;在新评估机上还必须同步该分支或应用对应提交。安装后执行下面的命令确认任务注册,输出中必须出现 `go1_lab.flat`、`go1_lab.stairs_fd` 等任务: +上面的最后一条命令必须在 `/opt/RoboGauge` 中执行。本文需要 Gitea `go1` 分支中的 `go1_lab.*` 任务;公开上游仓库只能作为参考,不能用 `go2_lab.*` 代替。安装后确认当前 commit 与任务注册,输出中必须出现 `go1_lab.flat`、`go1_lab.stairs_fd` 等任务: ```bash -git branch --show-current -python -c "import robogauge.tasks; from robogauge.utils.task_register import task_register; print(*sorted(task_register.pipeline_classes), sep='\n')" +git --git-dir=/opt/RoboGauge/.git --work-tree=/opt/RoboGauge rev-parse HEAD +/opt/envs/robogauge/bin/python -c "import robogauge.tasks; from robogauge.utils.task_register import task_register; print(*sorted(task_register.pipeline_classes), sep='\n')" ``` 若不存在 `go1_lab.*` 任务,不要用 `go2_lab.*` 代替,应先同步本地 Go1 适配代码。 ### 9.2 单模型评估 -直接通过 `--model-path` 指定 26000 对应的部署版 TorchScript。不要传入训练 checkpoint `model_26000.pt`,它是包含优化器等状态的字典,不能被 `torch.jit.load()`。平地配置默认没有启用目标,必须显式传入 `--goals`,否则不会得到有效的速度评估: +直接通过 `--model-path` 指定 26000 对应的部署版 TorchScript。不要传入训练 checkpoint `model_26000.pt`,它是包含优化器等状态的字典,不能被 `torch.jit.load()`。当前平地配置默认启用最大速度和对角速度;命令仍显式传入 `--goals`,以免配置默认值变化后评测范围静默改变: ```bash -MUJOCO_GL=glfw python robogauge/scripts/run.py \ +cd /opt/RoboGauge +MUJOCO_GL=glfw MPLCONFIGDIR=/tmp/robogauge-matplotlib /opt/envs/robogauge/bin/python robogauge/scripts/run.py \ --task-name go1_lab.flat \ - --model-path resources/models/go1/policy_robotlab_26000.pt \ + --model-path /opt/RoboGauge/resources/models/go1/policy_robotlab_26000_post_command_curriculum.pt \ --experiment-name go1_robotlab_26000_flat \ --run-name flat_velocity \ --goals max_velocity diagonal_velocity \ @@ -491,18 +692,18 @@ MUJOCO_GL=glfw python robogauge/scripts/run.py \ 三级楼梯使用目标点任务。`--spawn-type level_eval` 固定评估出生点,避免和搜索最高等级时的出生点混淆: ```bash -MUJOCO_GL=glfw python robogauge/scripts/run.py \ +MUJOCO_GL=glfw MPLCONFIGDIR=/tmp/robogauge-matplotlib /opt/envs/robogauge/bin/python robogauge/scripts/run.py \ --task-name go1_lab.stairs_fd \ - --model-path resources/models/go1/policy_robotlab_26000.pt \ + --model-path /opt/RoboGauge/resources/models/go1/policy_robotlab_26000_post_command_curriculum.pt \ --experiment-name go1_robotlab_26000_stairs_fd \ --run-name stairs_fd_l3 \ --level 3 \ --spawn-type level_eval \ --headless -MUJOCO_GL=glfw python robogauge/scripts/run.py \ +MUJOCO_GL=glfw MPLCONFIGDIR=/tmp/robogauge-matplotlib /opt/envs/robogauge/bin/python robogauge/scripts/run.py \ --task-name go1_lab.stairs_bd \ - --model-path resources/models/go1/policy_robotlab_26000.pt \ + --model-path /opt/RoboGauge/resources/models/go1/policy_robotlab_26000_post_command_curriculum.pt \ --experiment-name go1_robotlab_26000_stairs_bd \ --run-name stairs_bd_l3 \ --level 3 \ @@ -512,14 +713,17 @@ MUJOCO_GL=glfw python robogauge/scripts/run.py \ `run.py --headless` 在 Linux 默认选择 EGL。本次评估机的 EGL 驱动不支持 `PLATFORM_DEVICE`,所以命令显式设置 `MUJOCO_GL=glfw`;GLFW 可能打印无法打开 X11 的 warning,但无窗口仿真仍可完成。如果目标机 EGL 工作正常,可改回 `MUJOCO_GL=egl`。 +本次镜像自检只启用 `--goals max_velocity`,6 个速度子任务约 12 秒完成,`quality_score.mean=0.8402`,证明 TorchScript 加载、Go1 XML、MuJoCo 和指标落盘链路可用。该数值不是发布验收阈值,也不能替代下文完整的多目标、多 seed 评估。 + 单任务的 `--task-name` 必须是注册表里的完整名称,例如 `go1_lab.flat` 或 `go1_lab.stairs_fd`,不能写成裸的 `go1_lab`。只有下面的 stress pipeline 把 `go1_lab` 当作机器人任务前缀,再拼接具体地形。 ### 9.3 跨地形压力测试 ```bash -MUJOCO_GL=glfw python robogauge/scripts/run.py \ +cd /opt/RoboGauge +MUJOCO_GL=glfw MPLCONFIGDIR=/tmp/robogauge-matplotlib /opt/envs/robogauge/bin/python robogauge/scripts/run.py \ --task-name go1_lab \ - --model-path resources/models/go1/policy_robotlab_26000.pt \ + --model-path /opt/RoboGauge/resources/models/go1/policy_robotlab_26000_post_command_curriculum.pt \ --experiment-name go1_robotlab_26000_stress \ --stress-benchmark \ --stress-terrain-names flat slope_fd slope_bd stairs_fd stairs_bd wave obstacle \ @@ -558,17 +762,15 @@ RoboGauge 的 `dof_power` 是归一化质量分,不是瓦特或电机温度。 先启动服务端: ```bash -conda activate robogauge -cd RoboGauge -python robogauge/scripts/server.py --port 9973 --num-processes 8 +cd /opt/RoboGauge +MPLCONFIGDIR=/tmp/robogauge-matplotlib /opt/envs/robogauge/bin/python robogauge/scripts/server.py --port 9973 --num-processes 8 ``` 再启动训练: ```bash -conda activate go2_rl_robotlab -cd go2_rl_robotlab -python scripts/rsl_rl/train.py \ +cd /opt/go2_rl_robotlab +OMNI_KIT_ACCEPT_EULA=YES /opt/envs/go2_rl_robotlab/bin/python scripts/rsl_rl/train.py \ --task=RobotLab-Go1-v0 \ --num_envs=4096 \ --max_iterations=26000 \ @@ -600,19 +802,20 @@ task_name="go1_lab.flat" 这里推荐使用 `go1_pro_deploy/deploy_45dim_rl_gym/deploy_go1_onnx_mujoco_lab.py`,因为它与 RobotLab 的 10 帧/450 维 ONNX 接口一致。 ```bash -cd /path/to/go1_pro_deploy -conda activate +cd /opt/go1_pro_deploy/deploy_45dim_rl_gym -MUJOCO_GL=glfw mjpython deploy_45dim_rl_gym/deploy_go1_onnx_mujoco_lab.py \ - --onnx deploy_45dim_rl_gym/policy_robotlab_26000.onnx +MUJOCO_GL=glfw /opt/envs/robogauge/bin/python deploy_go1_onnx_mujoco_lab.py \ + --onnx /opt/go1_pro_deploy/deploy_45dim_rl_gym/policy_robotlab_26000.onnx ``` +这是带窗口和键盘的交互命令,需要可用的 X11/桌面。Linux 使用普通 `python`;只有 macOS 才通常需要 `mjpython`。脚本内部会 `chdir` 到自身目录,因此 `--onnx` 使用绝对路径。无图形环境应使用 8.4 节的 `--sample` 命令。 + 楼梯测试: ```bash -MUJOCO_GL=glfw mjpython deploy_45dim_rl_gym/deploy_go1_onnx_mujoco_lab.py \ - --onnx deploy_45dim_rl_gym/policy_robotlab_26000.onnx \ - --terrain deploy_45dim_rl_gym/terrains/stairs/stairs_3.xml \ +MUJOCO_GL=glfw /opt/envs/robogauge/bin/python deploy_go1_onnx_mujoco_lab.py \ + --onnx /opt/go1_pro_deploy/deploy_45dim_rl_gym/policy_robotlab_26000.onnx \ + --terrain /opt/go1_pro_deploy/deploy_45dim_rl_gym/terrains/stairs/stairs_3.xml \ --spawn-x -0.6 \ --spawn-z 0.34 ``` @@ -644,16 +847,26 @@ sim2sim 重点检查: BPU 量化不是把 ONNX 改一个后缀。至少需要: 1. 已通过接口检查的 `policy_robotlab_26000.onnx`。 -2. 来自相同观测构建逻辑的真实部署日志。 -3. 从 RL 状态提取的 10 帧/450 维 `float32` 校准样本。 +2. 与部署观测构建逻辑一致的 10 帧/450 维 `float32` PTQ 输入样本。 +3. 使用浮点 ONNX 对这批输入执行推理得到的参考输出。 4. 浮点 ONNX、图变换 ONNX、量化模型三者的逐样本输出对比。 +当前 26000 模型使用 `calibration_data_26000_robotlab_fast64/` 中的 64 个 PTQ 校验样本。这批数据来自 ONNX 推理流程,不是 X5 量化产生的模型 `.bin`。需要重新生成时,先检查供 `make_calibration_data.py` 使用的 ONNX 推理日志: + +```bash +find /opt/go1_pro_deploy/logs \ + -path '*/robotlab_go1_deploy_*/steps.jsonl' \ + -type f -print +``` + +`make_calibration_data.py` 读取日志中的 `mode: RL` 和 45 维 `obs_single`,按部署顺序重建 10 帧/450 维历史,并写出工具链所需的 raw float32 校准输入 `.bin`。这里的 `.bin` 是 PTQ 输入文件;X5 编译完成后生成的模型也使用 `.bin` 后缀,但两者用途完全不同。脚本找不到匹配日志或有效样本不足时会中止,不会绕过数据准备继续编译。 + 当前量化脚本会保留 actions 输出、降级 opset、包装为 BPU 需要的 4D 输入,并把 MoE grouped Conv 等价替换为 Gemm,以减少 CPU fallback。中间 norm 节点位于 actor 之前,不能随意删除或移到后处理。 量化脚本内部流程如下: ```text -真实日志 steps.jsonl +ONNX 推理流程日志 steps.jsonl -> make_calibration_data.py 生成 float32 featuremap 校准样本 -> keep_actions_output.py 只保留 actions 输出 -> downgrade_policy_to_opset11.py 降级到工具链可接受的 opset @@ -674,28 +887,38 @@ BPU 量化不是把 ONNX 改一个后缀。至少需要: | `--flat-dim` | 平铺输入维度;不填时为 `45 * history-len` | RobotLab 为 `450`,Gym 为 `225` | | `--samples` | 校准样本数量,越大越慢但覆盖更稳 | 默认 `64`,必要时 `128` | | `--min-samples` | 最少有效样本数,不足则中止 | 默认 `32` | -| `--log-prefix` | 从 `logs/` 下筛选部署日志的目录前缀 | `robotlab_go1_deploy` | +| `--log-prefix` | 从 `logs/` 下筛选 ONNX 推理日志的目录前缀 | `robotlab_go1_deploy` | | `--cal-tag` | 校准目录标签,区分 RobotLab/Gym | `robotlab`、`gym` | | `--compare-limit` | 浮点 ONNX 等价对比样本数 | 默认 `64` | | `--quant` | 量化策略 | 默认 `int16`,`int8` 仅作对照 | | `--docker-image` | D-Robotics CPU 工具链镜像 | X5/S100 各自不同 | -量化建议在 Mac 或训练机的 Docker 中完成,不在 X5/S100 板端跑 Docker。板端只负责加载产物做离线测速、数值对齐和实机部署。 +量化建议在 Mac 或训练机的 Docker 中完成,不在 X5/S100 板端跑 Docker。本文训练/量化主机的仓库固定为 `/opt/go1_pro_deploy`;板端只负责加载产物做离线测速、数值对齐和实机部署。 + +量化脚本内部直接调用 `docker`。运行 X5/S100 脚本前先验收 daemon: + +```bash +sudo /opt/envs/go2_rl_robotlab/docker-toolchain/bin/docker info >/dev/null +``` ### 11.2 RDK X5 X5 使用 D-Robotics X5 CPU 工具链镜像: ```bash -docker pull openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.8 +sudo /opt/envs/go2_rl_robotlab/docker-toolchain/bin/docker load \ + -i /opt/envs/go2_rl_robotlab/docker-toolchain/images/openexplorer_ai_toolchain_ubuntu_20_x5_cpu_v1.2.8.tar +# 或在可联网的 Docker 主机直接拉取: +# sudo /opt/envs/go2_rl_robotlab/docker-toolchain/bin/docker pull openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.8 ``` 脚本默认会用 `docker run --rm --platform linux/amd64` 启动这个镜像,并把当前仓库挂载到 `/workspace/deploy_go1_pro`。量化机执行: ```bash -cd /path/to/go1_pro_deploy +cd /opt/go1_pro_deploy -bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_x5.sh \ +sudo env PATH=/opt/envs/go2_rl_robotlab/docker-toolchain/bin:${PATH} \ + bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_x5.sh \ --policy ../policy_robotlab_26000.onnx \ --round 26000 \ --name policy_robotlab_26000 \ @@ -704,6 +927,7 @@ bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_x5.sh \ --min-samples 32 \ --log-prefix robotlab_go1_deploy \ --cal-tag robotlab \ + --compare-limit 64 \ --docker-image openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.8 \ --quant int16 ``` @@ -715,17 +939,11 @@ X5 关键配置: - int16 时脚本在 YAML 中写入 `optimization: "set_all_nodes_int16"`。 - `hb_mapper checker` 默认会先运行;明确知道模型已检查过时才使用 `--skip-checker`。 -预期产物: - -```text -deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_gemm/ - policy_robotlab_26000_int16_gemm.bin -``` - 如果要量化旧 Gym 5 帧模型,必须同步修改历史长度、日志前缀和标签: ```bash -bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_x5.sh \ +sudo env PATH=/opt/envs/go2_rl_robotlab/docker-toolchain/bin:${PATH} \ + bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_x5.sh \ --policy ../policy_35k.onnx \ --round 35k \ --history-len 5 \ @@ -734,6 +952,8 @@ bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_x5.sh \ --quant int16 ``` +以下是 **RDK X5 目标板** 命令。板端软件按交付约定安装在 `/root/go1_pro_deploy`;这是硬件系统路径,不是训练/量化镜像路径,也不应复制回 `/opt` 镜像执行: + 板端先做完全离线自检,不连接电机控制: ```bash @@ -752,15 +972,19 @@ X5 的 featuremap 模型不要直接改用 `hobot_dnn.pyeasy_dnn.forward()`。 S100 使用新版 S100/S600 CPU 工具链镜像: ```bash -docker pull registry.d-robotics.cc/deliver/ai_toolchain_ubuntu_22_s100_s600_cpu:v3.7.0 +sudo /opt/envs/go2_rl_robotlab/docker-toolchain/bin/docker load \ + -i /opt/envs/go2_rl_robotlab/docker-toolchain/images/ai_toolchain_ubuntu_22_s100_s600_cpu_v3.7.0.tar +# 或在已登录 registry 的 Docker 主机直接拉取: +# sudo /opt/envs/go2_rl_robotlab/docker-toolchain/bin/docker pull registry.d-robotics.cc/deliver/ai_toolchain_ubuntu_22_s100_s600_cpu:v3.7.0 ``` 脚本同样在量化机 Docker 中运行,不在 S100 板端运行 Docker: ```bash -cd /path/to/go1_pro_deploy +cd /opt/go1_pro_deploy -bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_s100.sh \ +sudo env PATH=/opt/envs/go2_rl_robotlab/docker-toolchain/bin:${PATH} \ + bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_s100.sh \ --policy ../policy_robotlab_26000.onnx \ --round 26000 \ --name policy_robotlab_26000 \ @@ -769,6 +993,7 @@ bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_s100.sh \ --min-samples 32 \ --log-prefix robotlab_go1_deploy \ --cal-tag robotlab \ + --compare-limit 64 \ --docker-image registry.d-robotics.cc/deliver/ai_toolchain_ubuntu_22_s100_s600_cpu:v3.7.0 \ --march nash-e \ --quant int16 @@ -781,13 +1006,6 @@ S100 关键配置: - int16 时脚本在 YAML 中写入 `quant_config.model_config.all_node_type: int16`。 - `compiler_parameters.core_num` 当前为 `1`,优先保证单次策略推理低延迟;需要多核吞吐测试时应另做离线 benchmark,不要直接改实机脚本。 -预期产物: - -```text -deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_s100_gemm/ - policy_robotlab_26000_s100_int16_gemm.hbm -``` - 产物同步到 S100 后,先看模型信息再测速: ```bash @@ -833,12 +1051,9 @@ deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_s100_gemm/ 公开 SDK 可用于核对通用 API、结构体字段和安全调用方式,但不要直接运行带位置目标的官方示例。先只编译: ```bash -git clone https://github.com/unitreerobotics/unitree_legged_sdk.git -cd unitree_legged_sdk -mkdir build -cd build -cmake .. -cmake --build . --parallel +git clone https://github.com/unitreerobotics/unitree_legged_sdk.git /opt/unitree_legged_sdk +cmake -S /opt/unitree_legged_sdk -B /opt/unitree_legged_sdk/build +cmake --build /opt/unitree_legged_sdk/build --parallel ``` 本地 `walk-these-ways/go1_gym_deploy/unitree_legged_sdk_bin/lcm_position.cpp` 可作为官方 SDK 接入策略控制环的公开参考。阅读时重点关注 UDP 收发线程、`LowState` 到策略观测的转换、`Safety` 调用和退出流程,不要照搬其网络地址、增益或速度范围到另一台机器人。 @@ -929,7 +1144,7 @@ pgrep -fl 'keep_sport_alive|Legged_sport|appTransit' - 用相同 450 维输入比较 PyTorch、ONNX 和 BPU 输出。 - 检查 12 维动作的顺序、符号、范围和有限性。 - 测量平均、P99 和最大推理时间。 -- 对零输入、真实日志输入和边界输入做回归。 +- 对零输入、PTQ 校验输入和边界输入做回归。 ### 14.2 第 1 级:只读 LowState @@ -1094,7 +1309,7 @@ loop_dt_ms / recv_ms / policy_ms / work_ms / state_fresh / state_age_ms ### 16.3 BPU 很快,但真机表现比 ONNX 差 -速度合格不代表数值合格。使用同一批真实 450 维输入逐帧比较 ONNX/BPU,重点查 featuremap 输入、量化校准分布、输出 reshape、CPU fallback 和 runtime 调用生命周期。 +速度合格不代表数值合格。使用同一批 PTQ 校验输入逐帧比较 ONNX/BPU,重点查 featuremap 输入、量化校准分布、输出 reshape、CPU fallback 和 runtime 调用生命周期。 ### 16.4 TensorBoard 总回报上涨,但 RoboGauge 下降 @@ -1106,7 +1321,10 @@ loop_dt_ms / recv_ms / policy_ms / work_ms / state_fresh / state_age_ms ## 17. 发布前检查清单 -- [ ] RoboGo 镜像和容器启动信息已补全。 +- [ ] RoboGo 镜像名称、拉取命令、容器启动参数和持久化目录已补全;当前文档中的阻断项不再是 TODO。 +- [ ] `/opt/IsaacLab` 为 `v2.3.2`,pip 环境为 IsaacLab `2.3.2.post1`、Isaac Sim `5.1.0.0`、PyTorch `2.7.0`,且没有重新挂载旧 `/opt/IsaacSim`。 +- [ ] 运行用户可写训练、RoboGauge、MuJoCo 和 Isaac Sim runtime 目录,且 `OMNI_KIT_ACCEPT_EULA=YES` 已注入。 +- [ ] 镜像 1 轮训练自检通过,并保存 `model_0.pt`、日志和参数文件。 - [ ] 硬件、接线、网络和急停章节已由设备负责人补全。 - [ ] 所有仓库 commit 和 Python 依赖已记录。 - [ ] 15000、19500、26000、33500 候选已注明课程阶段,并完成 TensorBoard 与 RoboGauge 对比。 @@ -1114,8 +1332,9 @@ loop_dt_ms / recv_ms / policy_ms / work_ms / state_fresh / state_age_ms - [ ] ONNX 输入 450、输出 12,关节顺序为 `FR, FL, RR, RL`。 - [ ] RoboGauge 单任务使用完整的 `go1_lab.*` 注册名,而非裸 `go1_lab` 或 `go2_lab`。 - [ ] MuJoCo 平地、转向、侧移、急停和台阶测试通过。 -- [ ] 真实日志校准集与模型版本一致。 +- [ ] PTQ 输入、ONNX 参考输出与模型版本一致。 - [ ] X5/S100 量化模型通过离线精度和延迟验收。 +- [ ] X5/S100 工具链归档已通过 SHA-256 校验,并在具备 Docker daemon 的主机完成 `docker load`。 - [ ] 私有 SDK 的协议、密钥和专有实现未写入公开文档。 - [ ] 实机测试严格完成只读、观测、推理、状态机、悬空、地面分级流程。 - [ ] 每条停机路径均已实际演练。