docs: expand bpu quantization guide

This commit is contained in:
cyy_mac
2026-07-31 16:38:02 +08:00
parent ca80135bc4
commit 8c1dd4f82b

View File

@@ -558,9 +558,47 @@ BPU 量化不是把 ONNX 改一个后缀。至少需要:
当前量化脚本会保留 actions 输出、降级 opset、包装为 BPU 需要的 4D 输入,并把 MoE grouped Conv 等价替换为 Gemm以减少 CPU fallback。中间 norm 节点位于 actor 之前,不能随意删除或移到后处理。 当前量化脚本会保留 actions 输出、降级 opset、包装为 BPU 需要的 4D 输入,并把 MoE grouped Conv 等价替换为 Gemm以减少 CPU fallback。中间 norm 节点位于 actor 之前,不能随意删除或移到后处理。
量化脚本内部流程如下:
```text
真实日志 steps.jsonl
-> make_calibration_data.py 生成 float32 featuremap 校准样本
-> keep_actions_output.py 只保留 actions 输出
-> downgrade_policy_to_opset11.py 降级到工具链可接受的 opset
-> make_bpu_4d_onnx.py 把 [1, D] 输入包装成 [1, 1, 1, D]
-> replace_group_conv_with_gemm.py 把 MoE grouped Conv 替换为等价 Gemm
-> compare_4d_onnx.py 检查浮点图变换等价
-> hb_mapper / hb_compile 生成板端模型
```
脚本中的主要可调变量含义:
| 参数 | 含义 | 常用设置 |
| --- | --- | --- |
| `--policy` | 原始 ONNX 路径,必须在部署仓库内 | `../policy_robotlab_26000.onnx` |
| `--round` | 输出目录和校准目录里的轮次标签,不参与计算 | `26000``35k` |
| `--name` | 输出模型 basename不填时取 ONNX 文件名 | `policy_robotlab_26000` |
| `--history-len` | 历史帧数,用于重建输入维度 | RobotLab 为 `10`Gym 为 `5` |
| `--flat-dim` | 平铺输入维度;不填时为 `45 * history-len` | RobotLab 为 `450`Gym 为 `225` |
| `--samples` | 校准样本数量,越大越慢但覆盖更稳 | 默认 `64`,必要时 `128` |
| `--min-samples` | 最少有效样本数,不足则中止 | 默认 `32` |
| `--log-prefix` | 从 `logs/` 下筛选部署日志的目录前缀 | `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。板端只负责加载产物做离线测速、数值对齐和实机部署。
### 11.2 RDK X5 ### 11.2 RDK X5
量化机执行 X5 使用 D-Robotics X5 CPU 工具链镜像
```bash
docker pull openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.8
```
脚本默认会用 `docker run --rm --platform linux/amd64` 启动这个镜像,并把当前仓库挂载到 `/workspace/deploy_go1_pro`。量化机执行:
```bash ```bash
cd /path/to/go1_pro_deploy cd /path/to/go1_pro_deploy
@@ -574,9 +612,17 @@ bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_x5.sh \
--min-samples 32 \ --min-samples 32 \
--log-prefix robotlab_go1_deploy \ --log-prefix robotlab_go1_deploy \
--cal-tag robotlab \ --cal-tag robotlab \
--docker-image openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.8 \
--quant int16 --quant int16
``` ```
X5 关键配置:
- `march` 固定为 `bayes-e`
- 输入类型为 `featuremap`,运行时输入 shape 是 `obs_4d [1, 1, 1, 450]`
- int16 时脚本在 YAML 中写入 `optimization: "set_all_nodes_int16"`
- `hb_mapper checker` 默认会先运行;明确知道模型已检查过时才使用 `--skip-checker`
预期产物: 预期产物:
```text ```text
@@ -584,6 +630,18 @@ deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_gemm/
policy_robotlab_26000_int16_gemm.bin policy_robotlab_26000_int16_gemm.bin
``` ```
如果要量化旧 Gym 5 帧模型,必须同步修改历史长度、日志前缀和标签:
```bash
bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_x5.sh \
--policy ../policy_35k.onnx \
--round 35k \
--history-len 5 \
--log-prefix rlgym_go1_deploy \
--cal-tag gym \
--quant int16
```
板端先做完全离线自检,不连接电机控制: 板端先做完全离线自检,不连接电机控制:
```bash ```bash
@@ -599,6 +657,14 @@ X5 的 featuremap 模型不要直接改用 `hobot_dnn.pyeasy_dnn.forward()`。
### 11.3 S100 ### 11.3 S100
S100 使用新版 S100/S600 CPU 工具链镜像:
```bash
docker pull registry.d-robotics.cc/deliver/ai_toolchain_ubuntu_22_s100_s600_cpu:v3.7.0
```
脚本同样在量化机 Docker 中运行,不在 S100 板端运行 Docker
```bash ```bash
cd /path/to/go1_pro_deploy cd /path/to/go1_pro_deploy
@@ -611,10 +677,18 @@ bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_s100.sh \
--min-samples 32 \ --min-samples 32 \
--log-prefix robotlab_go1_deploy \ --log-prefix robotlab_go1_deploy \
--cal-tag robotlab \ --cal-tag robotlab \
--docker-image registry.d-robotics.cc/deliver/ai_toolchain_ubuntu_22_s100_s600_cpu:v3.7.0 \
--march nash-e \ --march nash-e \
--quant int16 --quant int16
``` ```
S100 关键配置:
- `--march nash-e` 对应当前 S100 平台;不要沿用 X5 的 `bayes-e`
- 输出是 `.hbm`,不是 X5 的 `.bin`
- int16 时脚本在 YAML 中写入 `quant_config.model_config.all_node_type: int16`
- `compiler_parameters.core_num` 当前为 `1`,优先保证单次策略推理低延迟;需要多核吞吐测试时应另做离线 benchmark不要直接改实机脚本。
预期产物: 预期产物:
```text ```text
@@ -622,6 +696,13 @@ deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_s100_gemm/
policy_robotlab_26000_s100_int16_gemm.hbm policy_robotlab_26000_s100_int16_gemm.hbm
``` ```
产物同步到 S100 后,先看模型信息再测速:
```bash
/usr/hobot/bin/hrt_model_exec model_info \
--model_file deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_s100_gemm/policy_robotlab_26000_s100_int16_gemm.hbm
```
板端测速: 板端测速:
```bash ```bash