adapt s100
This commit is contained in:
207
deploy_45dim_rl_gym/bpu_deploy_s100/README.md
Normal file
207
deploy_45dim_rl_gym/bpu_deploy_s100/README.md
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
# S100 BPU 部署测试
|
||||||
|
|
||||||
|
这个目录是 S100 平台的隔离部署路径,不覆盖现有 X5 BPU 脚本。
|
||||||
|
|
||||||
|
当前默认模型:
|
||||||
|
|
||||||
|
```text
|
||||||
|
deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_s100_gemm/policy_robotlab_26000_s100_int16_gemm.hbm
|
||||||
|
```
|
||||||
|
|
||||||
|
S100 量化参数:
|
||||||
|
|
||||||
|
- 原始模型:`deploy_45dim_rl_gym/policy_robotlab_26000.onnx`
|
||||||
|
- 历史长度:RobotLab 10 帧
|
||||||
|
- 输入:`obs_4d [1, 1, 1, 450]`,float32 featuremap
|
||||||
|
- 输出:`actions [1, 12, 1, 1]`
|
||||||
|
- `march`:`nash-e`
|
||||||
|
- Docker 镜像:`registry.d-robotics.cc/deliver/ai_toolchain_ubuntu_22_s100_s600_cpu:v3.7.0`
|
||||||
|
|
||||||
|
## 本机量化
|
||||||
|
|
||||||
|
在 Mac 的仓库根目录执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /Users/chenyouyuan/cyy_ws/deploy_go1_pro
|
||||||
|
bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_s100.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
等价显式命令:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /Users/chenyouyuan/cyy_ws/deploy_go1_pro
|
||||||
|
bash deploy_45dim_rl_gym/bpu_quantization/quantize_policy_s100.sh \
|
||||||
|
--policy ../policy_robotlab_26000.onnx \
|
||||||
|
--round 26000 \
|
||||||
|
--name policy_robotlab_26000 \
|
||||||
|
--history-len 10 \
|
||||||
|
--samples 64 \
|
||||||
|
--min-samples 32 \
|
||||||
|
--log-prefix robotlab_go1_deploy \
|
||||||
|
--cal-tag robotlab \
|
||||||
|
--march nash-e
|
||||||
|
```
|
||||||
|
|
||||||
|
输出文件:
|
||||||
|
|
||||||
|
```text
|
||||||
|
deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_s100_gemm/policy_robotlab_26000_s100_int16_gemm.hbm
|
||||||
|
```
|
||||||
|
|
||||||
|
## 同步到 S100
|
||||||
|
|
||||||
|
S100 板端地址:
|
||||||
|
|
||||||
|
```text
|
||||||
|
root@192.168.11.144
|
||||||
|
```
|
||||||
|
|
||||||
|
如果仓库已经通过 git 同步,直接在板端拉取即可。如果只同步产物,可以从 Mac 执行;Docker 只在 Mac 上用于量化,S100 板端不运行 Docker:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
scp \
|
||||||
|
deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_s100_gemm/policy_robotlab_26000_s100_int16_gemm.hbm \
|
||||||
|
root@192.168.11.144:/root/go1_pro_deploy/deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_s100_gemm/
|
||||||
|
```
|
||||||
|
|
||||||
|
同时确保校准输入存在,离线测速会用到:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
scp \
|
||||||
|
deploy_45dim_rl_gym/bpu_quantization/calibration_data_26000_robotlab_fast64/00000.bin \
|
||||||
|
root@192.168.11.144:/root/go1_pro_deploy/deploy_45dim_rl_gym/bpu_quantization/calibration_data_26000_robotlab_fast64/
|
||||||
|
```
|
||||||
|
|
||||||
|
## 板端安装 hbm_runtime
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@192.168.11.144
|
||||||
|
cd /usr/hobot/lib/hbm_runtime
|
||||||
|
./build.sh install
|
||||||
|
```
|
||||||
|
|
||||||
|
S100 使用官方 `hbm_runtime` Python 绑定加载 `.hbm`,不复用 X5 的
|
||||||
|
`/usr/include/dnn/hb_dnn.h` C++ wrapper。
|
||||||
|
|
||||||
|
## 离线推理测速
|
||||||
|
|
||||||
|
先用官方 `hrt_model_exec` 看模型信息:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/go1_pro_deploy
|
||||||
|
/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
|
||||||
|
```
|
||||||
|
|
||||||
|
官方 `hrt_model_exec` 稳态测速:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/go1_pro_deploy
|
||||||
|
/usr/hobot/bin/hrt_model_exec perf \
|
||||||
|
--model_file deploy_45dim_rl_gym/bpu_quantization/mapper_output_26000_s100_gemm/policy_robotlab_26000_s100_int16_gemm.hbm \
|
||||||
|
--model_name policy_robotlab_26000_s100_int16_gemm \
|
||||||
|
--input_file deploy_45dim_rl_gym/bpu_quantization/calibration_data_26000_robotlab_fast64/00000.bin \
|
||||||
|
--frame_count 1000 \
|
||||||
|
--thread_num 1
|
||||||
|
```
|
||||||
|
|
||||||
|
当前板端 `root@192.168.11.144` 已验证:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Average latency: 0.394 ms
|
||||||
|
FPS: 2442.456
|
||||||
|
```
|
||||||
|
|
||||||
|
部署脚本使用的 Python `hbm_runtime` wrapper:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/go1_pro_deploy
|
||||||
|
PYTHONPATH=/root/go1_pro_sdk:/root/go1_pro_deploy \
|
||||||
|
python3 deploy_45dim_rl_gym/bpu_deploy_s100/test_bpu_policy.py \
|
||||||
|
--repeat 1000
|
||||||
|
```
|
||||||
|
|
||||||
|
当前板端结果:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Backend: hbm_runtime_s100
|
||||||
|
Input: obs_4d (1, 1, 1, 450)
|
||||||
|
Output: actions (1, 12)
|
||||||
|
repeat=1000 avg_ms=0.733020
|
||||||
|
```
|
||||||
|
|
||||||
|
## 离线推理检查
|
||||||
|
|
||||||
|
这一步会连接 MCU 读取状态,但不会发送电机指令:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/go1_pro_deploy
|
||||||
|
PYTHONPATH=/root/go1_pro_sdk:/root/go1_pro_deploy \
|
||||||
|
python3 deploy_45dim_rl_gym/bpu_deploy_s100/deploy_go1_robotlab_bpu_s100_fastcpp.py \
|
||||||
|
--infer-check \
|
||||||
|
--log-dir logs \
|
||||||
|
--print-every 50 \
|
||||||
|
--max-steps 500
|
||||||
|
```
|
||||||
|
|
||||||
|
## 悬空状态机测试
|
||||||
|
|
||||||
|
先不要加 `--enable-rl`,确认 R2 只能推进到 `INFER_TEST`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/go1_pro_deploy
|
||||||
|
PYTHONPATH=/root/go1_pro_sdk:/root/go1_pro_deploy \
|
||||||
|
python3 deploy_45dim_rl_gym/bpu_deploy_s100/deploy_go1_robotlab_bpu_s100_fastcpp.py \
|
||||||
|
--kill-sport \
|
||||||
|
--log-dir logs \
|
||||||
|
--kp 28 --kd 0.7 \
|
||||||
|
--kp-cal 20 --kd-cal 1.0 \
|
||||||
|
--power-factor 7 \
|
||||||
|
--position-protect-limit 0.0 \
|
||||||
|
--action-clip 5.0 \
|
||||||
|
--action-trip-limit 8.0 \
|
||||||
|
--action-hard-trip-limit 16.0 \
|
||||||
|
--max-target-step 0.025 \
|
||||||
|
--max-roll-deg 35 \
|
||||||
|
--max-pitch-deg 35 \
|
||||||
|
--swap-vy-yaw \
|
||||||
|
--rc-vx-scale 0.3 \
|
||||||
|
--rc-vy-scale 0.3 \
|
||||||
|
--rc-wz-scale 0.6 \
|
||||||
|
--log-timing
|
||||||
|
```
|
||||||
|
|
||||||
|
## 实际 RL 启动
|
||||||
|
|
||||||
|
只有悬空测试正常后,再启用 RL:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/go1_pro_deploy
|
||||||
|
PYTHONPATH=/root/go1_pro_sdk:/root/go1_pro_deploy \
|
||||||
|
python3 deploy_45dim_rl_gym/bpu_deploy_s100/deploy_go1_robotlab_bpu_s100_fastcpp.py \
|
||||||
|
--kill-sport \
|
||||||
|
--enable-rl \
|
||||||
|
--log-dir logs \
|
||||||
|
--kp 28 --kd 0.7 \
|
||||||
|
--kp-cal 20 --kd-cal 1.0 \
|
||||||
|
--power-factor 7 \
|
||||||
|
--position-protect-limit 0.0 \
|
||||||
|
--action-clip 5.0 \
|
||||||
|
--action-trip-limit 8.0 \
|
||||||
|
--action-hard-trip-limit 16.0 \
|
||||||
|
--max-target-step 0.025 \
|
||||||
|
--max-roll-deg 35 \
|
||||||
|
--max-pitch-deg 35 \
|
||||||
|
--swap-vy-yaw \
|
||||||
|
--rc-vx-scale 0.3 \
|
||||||
|
--rc-vy-scale 0.3 \
|
||||||
|
--rc-wz-scale 0.6 \
|
||||||
|
--log-timing
|
||||||
|
```
|
||||||
|
|
||||||
|
如果要临时指定其它 S100 `.hbm`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 deploy_45dim_rl_gym/bpu_deploy_s100/deploy_go1_robotlab_bpu_s100_fastcpp.py \
|
||||||
|
--bpu-model /absolute/path/to/model.hbm
|
||||||
|
```
|
||||||
77
deploy_45dim_rl_gym/bpu_deploy_s100/bpu_policy.py
Normal file
77
deploy_45dim_rl_gym/bpu_deploy_s100/bpu_policy.py
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""S100 HBM policy runtime wrapper."""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
class BpuInferLibPolicy:
|
||||||
|
"""S100 backend: official hbm_runtime Python binding."""
|
||||||
|
|
||||||
|
backend_name = "hbm_runtime_s100"
|
||||||
|
|
||||||
|
def __init__(self, model_path, priority=0, bpu_cores=(0,), cpp_lib=None):
|
||||||
|
del cpp_lib
|
||||||
|
self.model_path = Path(model_path).expanduser().resolve()
|
||||||
|
if not self.model_path.exists():
|
||||||
|
raise FileNotFoundError(f"S100 HBM model not found: {self.model_path}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
from hbm_runtime import HB_HBMRuntime
|
||||||
|
except ImportError as exc:
|
||||||
|
raise RuntimeError(
|
||||||
|
"hbm_runtime is required on S100. Install it on the board with: "
|
||||||
|
"cd /usr/hobot/lib/hbm_runtime && ./build.sh install"
|
||||||
|
) from exc
|
||||||
|
|
||||||
|
self.priority = int(priority)
|
||||||
|
self.bpu_cores = tuple(int(core) for core in bpu_cores)
|
||||||
|
self.runtime = HB_HBMRuntime(str(self.model_path))
|
||||||
|
self.version = getattr(self.runtime, "version", "")
|
||||||
|
|
||||||
|
model_names = list(self.runtime.model_names)
|
||||||
|
if len(model_names) != 1:
|
||||||
|
raise RuntimeError(f"expected one model in {self.model_path}, got {model_names}")
|
||||||
|
self.model_name = model_names[0]
|
||||||
|
|
||||||
|
input_names = list(self.runtime.input_names[self.model_name])
|
||||||
|
output_names = list(self.runtime.output_names[self.model_name])
|
||||||
|
if len(input_names) != 1 or len(output_names) != 1:
|
||||||
|
raise RuntimeError(
|
||||||
|
f"expected 1 input and 1 output, got {input_names} / {output_names}"
|
||||||
|
)
|
||||||
|
self.input_name = input_names[0]
|
||||||
|
self.output_name = output_names[0]
|
||||||
|
|
||||||
|
self.input_shape = tuple(int(x) for x in self.runtime.input_shapes[self.model_name][self.input_name])
|
||||||
|
self.output_shape = tuple(int(x) for x in self.runtime.output_shapes[self.model_name][self.output_name])
|
||||||
|
self.input_size = int(np.prod(self.input_shape))
|
||||||
|
self.output_size = int(np.prod(self.output_shape))
|
||||||
|
|
||||||
|
print(f"[INFO] BPU model: {self.model_path}")
|
||||||
|
print(f"[INFO] Backend: {self.backend_name}")
|
||||||
|
print(f"[INFO] Runtime: {self.version}")
|
||||||
|
print(f"[INFO] Input : {self.input_name} {self.input_shape}")
|
||||||
|
print(f"[INFO] Output : {self.output_name} {self.output_shape}")
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
self.runtime = None
|
||||||
|
|
||||||
|
def __call__(self, flat_input):
|
||||||
|
arr = np.asarray(flat_input, dtype=np.float32)
|
||||||
|
if arr.size != self.input_size:
|
||||||
|
raise ValueError(f"S100 policy input has {arr.size} values, expected {self.input_size}")
|
||||||
|
input_tensor = np.ascontiguousarray(arr.reshape(self.input_shape), dtype=np.float32)
|
||||||
|
outputs = self.runtime.run(input_tensor)
|
||||||
|
action = np.asarray(outputs[self.model_name][self.output_name], dtype=np.float32).reshape(-1)
|
||||||
|
if action.size != self.output_size:
|
||||||
|
raise RuntimeError(
|
||||||
|
f"S100 policy output has {action.size} values, expected {self.output_size}"
|
||||||
|
)
|
||||||
|
if not np.all(np.isfinite(action)):
|
||||||
|
raise RuntimeError(f"S100 policy output is not finite: {action}")
|
||||||
|
return action.copy()
|
||||||
|
|
||||||
|
|
||||||
|
BpuInferLibPythonPolicy = BpuInferLibPolicy
|
||||||
File diff suppressed because it is too large
Load Diff
55
deploy_45dim_rl_gym/bpu_deploy_s100/test_bpu_policy.py
Normal file
55
deploy_45dim_rl_gym/bpu_deploy_s100/test_bpu_policy.py
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Offline BPU policy smoke test for S100.
|
||||||
|
|
||||||
|
This does not connect to the robot. It loads a S100 BPU .hbm and one raw
|
||||||
|
float32 input file, then runs the hbm_runtime backend repeatedly.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import time
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from bpu_policy import BpuInferLibPolicy
|
||||||
|
|
||||||
|
|
||||||
|
HERE = Path(__file__).parent.resolve()
|
||||||
|
DEFAULT_MODEL = (
|
||||||
|
HERE.parent / "bpu_quantization" / "mapper_output_26000_s100_gemm" /
|
||||||
|
"policy_robotlab_26000_s100_int16_gemm.hbm"
|
||||||
|
)
|
||||||
|
DEFAULT_INPUT = (
|
||||||
|
HERE.parent / "bpu_quantization" /
|
||||||
|
"calibration_data_26000_robotlab_fast64" / "00000.bin"
|
||||||
|
)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="Offline BPU policy smoke test")
|
||||||
|
parser.add_argument("--bpu-model", default=str(DEFAULT_MODEL))
|
||||||
|
parser.add_argument("--input-bin", default=str(DEFAULT_INPUT))
|
||||||
|
parser.add_argument("--repeat", type=int, default=1000)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
input_path = Path(args.input_bin).expanduser().resolve()
|
||||||
|
data = np.fromfile(input_path, dtype=np.float32)
|
||||||
|
policy = BpuInferLibPolicy(args.bpu_model)
|
||||||
|
if data.size != policy.input_size:
|
||||||
|
raise ValueError(
|
||||||
|
f"{input_path} has {data.size} float32 values, "
|
||||||
|
f"but model expects {policy.input_size}"
|
||||||
|
)
|
||||||
|
action = policy(data)
|
||||||
|
print("action", np.array2string(action, precision=6))
|
||||||
|
print("action_max_abs", float(np.max(np.abs(action))))
|
||||||
|
|
||||||
|
repeats = max(1, int(args.repeat))
|
||||||
|
t0 = time.perf_counter()
|
||||||
|
for _ in range(repeats):
|
||||||
|
policy(data)
|
||||||
|
elapsed_ms = (time.perf_counter() - t0) * 1000.0
|
||||||
|
print(f"repeat={repeats} avg_ms={elapsed_ms / repeats:.6f}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
model_parameters:
|
||||||
|
onnx_model: "./policy_robotlab_26000_bpu4d_gemm.onnx"
|
||||||
|
march: "nash-e"
|
||||||
|
layer_out_dump: false
|
||||||
|
working_dir: "mapper_output_26000_s100_gemm"
|
||||||
|
output_model_file_prefix: "policy_robotlab_26000_s100_int16_gemm"
|
||||||
|
|
||||||
|
input_parameters:
|
||||||
|
input_name: "obs_4d"
|
||||||
|
input_shape: "1x1x1x450"
|
||||||
|
input_type_rt: "featuremap"
|
||||||
|
input_type_train: "featuremap"
|
||||||
|
input_layout_train: "NCHW"
|
||||||
|
norm_type: "no_preprocess"
|
||||||
|
separate_batch: false
|
||||||
|
|
||||||
|
calibration_parameters:
|
||||||
|
cal_data_dir: "./calibration_data_26000_robotlab_fast64"
|
||||||
|
cal_data_type: "float32"
|
||||||
|
calibration_type: "max"
|
||||||
|
quant_config:
|
||||||
|
model_config:
|
||||||
|
all_node_type: int16
|
||||||
|
activation:
|
||||||
|
calibration_type: max
|
||||||
|
per_channel: true
|
||||||
|
|
||||||
|
compiler_parameters:
|
||||||
|
compile_mode: "latency"
|
||||||
|
optimize_level: "O2"
|
||||||
|
core_num: 1
|
||||||
|
jobs: 8
|
||||||
|
cache_mode: "disable"
|
||||||
229
deploy_45dim_rl_gym/bpu_quantization/quantize_policy_s100.sh
Executable file
229
deploy_45dim_rl_gym/bpu_quantization/quantize_policy_s100.sh
Executable file
@@ -0,0 +1,229 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
||||||
|
|
||||||
|
POLICY="../policy_robotlab_26000.onnx"
|
||||||
|
ROUND="26000"
|
||||||
|
NAME=""
|
||||||
|
HISTORY_LEN=10
|
||||||
|
FLAT_DIM=""
|
||||||
|
SAMPLES=64
|
||||||
|
MIN_SAMPLES=32
|
||||||
|
LOG_PREFIX="robotlab_go1_deploy"
|
||||||
|
CAL_TAG="robotlab"
|
||||||
|
DOCKER_IMAGE="registry.d-robotics.cc/deliver/ai_toolchain_ubuntu_22_s100_s600_cpu:v3.7.0"
|
||||||
|
MARCH="nash-e"
|
||||||
|
COMPARE_LIMIT=64
|
||||||
|
RUN_CHECKER=1
|
||||||
|
QUANT="int16"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<'EOF'
|
||||||
|
Usage:
|
||||||
|
./quantize_policy_s100.sh [options]
|
||||||
|
|
||||||
|
Default: quantize RobotLab policy_robotlab_26000.onnx as 10-frame/450-dim
|
||||||
|
S100 int16 Gemm BPU model.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--policy PATH ONNX policy path, relative to this directory or absolute
|
||||||
|
--round NAME round label used in output paths, e.g. 15k/25k/30k/35k
|
||||||
|
--name NAME model basename; default is policy filename without .onnx
|
||||||
|
--history-len N observation history length; Gym=5, RobotLab=10
|
||||||
|
--flat-dim N flat input dim; default 45 * history-len
|
||||||
|
--samples N calibration sample count; default 64 for faster mapping
|
||||||
|
--min-samples N minimum valid samples required; default 32
|
||||||
|
--log-prefix PREFIX log dir prefix below logs/, default rlgym_go1_deploy
|
||||||
|
--cal-tag TAG calibration dir tag, default gym
|
||||||
|
--docker-image IMAGE D-Robotics S100/S600 CPU toolchain image
|
||||||
|
--march MARCH S100 march, default nash-e
|
||||||
|
--compare-limit N float ONNX equivalence sample count, default 64
|
||||||
|
--quant int16|int8 int16 uses all_node_type int16; int8 uses default S100 PTQ
|
||||||
|
--skip-checker accepted for parity with X5 script; hb_compile path ignores it
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
--policy) POLICY="$2"; shift 2 ;;
|
||||||
|
--round) ROUND="$2"; shift 2 ;;
|
||||||
|
--name) NAME="$2"; shift 2 ;;
|
||||||
|
--history-len) HISTORY_LEN="$2"; shift 2 ;;
|
||||||
|
--flat-dim) FLAT_DIM="$2"; shift 2 ;;
|
||||||
|
--samples) SAMPLES="$2"; shift 2 ;;
|
||||||
|
--min-samples) MIN_SAMPLES="$2"; shift 2 ;;
|
||||||
|
--log-prefix) LOG_PREFIX="$2"; shift 2 ;;
|
||||||
|
--cal-tag) CAL_TAG="$2"; shift 2 ;;
|
||||||
|
--docker-image) DOCKER_IMAGE="$2"; shift 2 ;;
|
||||||
|
--march) MARCH="$2"; shift 2 ;;
|
||||||
|
--compare-limit) COMPARE_LIMIT="$2"; shift 2 ;;
|
||||||
|
--quant) QUANT="$2"; shift 2 ;;
|
||||||
|
--skip-checker) RUN_CHECKER=0; shift ;;
|
||||||
|
-h|--help) usage; exit 0 ;;
|
||||||
|
*) echo "Unknown argument: $1" >&2; usage >&2; exit 2 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -z "${FLAT_DIM}" ]]; then
|
||||||
|
FLAT_DIM=$((45 * HISTORY_LEN))
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "${QUANT}" in
|
||||||
|
int16|int8) ;;
|
||||||
|
*) echo "--quant must be int16 or int8, got: ${QUANT}" >&2; exit 2 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ "${POLICY}" = /* ]]; then
|
||||||
|
POLICY_ABS="${POLICY}"
|
||||||
|
else
|
||||||
|
POLICY_ABS="${SCRIPT_DIR}/${POLICY}"
|
||||||
|
fi
|
||||||
|
POLICY_ABS="$(cd "$(dirname "${POLICY_ABS}")" && pwd)/$(basename "${POLICY_ABS}")"
|
||||||
|
|
||||||
|
if [[ ! -f "${POLICY_ABS}" ]]; then
|
||||||
|
echo "Policy not found: ${POLICY_ABS}" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
case "${POLICY_ABS}" in
|
||||||
|
"${REPO_ROOT}"/*) POLICY_REL="${POLICY_ABS#${REPO_ROOT}/}" ;;
|
||||||
|
*) echo "Policy must be inside repo root ${REPO_ROOT}: ${POLICY_ABS}" >&2; exit 2 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ -z "${NAME}" ]]; then
|
||||||
|
NAME="$(basename "${POLICY_ABS}" .onnx)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CAL_DIR="calibration_data_${ROUND}_${CAL_TAG}_fast${SAMPLES}"
|
||||||
|
if [[ "${QUANT}" = "int16" ]]; then
|
||||||
|
OUTPUT_DIR="mapper_output_${ROUND}_s100_gemm"
|
||||||
|
OUTPUT_PREFIX="${NAME}_s100_int16_gemm"
|
||||||
|
else
|
||||||
|
OUTPUT_DIR="mapper_output_${ROUND}_s100_int8_gemm"
|
||||||
|
OUTPUT_PREFIX="${NAME}_s100_int8_gemm"
|
||||||
|
fi
|
||||||
|
YAML_FILE="${OUTPUT_PREFIX}.yaml"
|
||||||
|
|
||||||
|
echo "[INFO] repo : ${REPO_ROOT}"
|
||||||
|
echo "[INFO] policy : ${POLICY_REL}"
|
||||||
|
echo "[INFO] name/round : ${NAME} / ${ROUND}"
|
||||||
|
echo "[INFO] history/shape : ${HISTORY_LEN} / 1x1x1x${FLAT_DIM}"
|
||||||
|
echo "[INFO] calibration : ${CAL_DIR} (${SAMPLES} samples, prefix ${LOG_PREFIX})"
|
||||||
|
echo "[INFO] output : ${OUTPUT_DIR}/${OUTPUT_PREFIX}.hbm"
|
||||||
|
echo "[INFO] quant : ${QUANT}"
|
||||||
|
echo "[INFO] march : ${MARCH}"
|
||||||
|
echo "[INFO] docker image : ${DOCKER_IMAGE}"
|
||||||
|
|
||||||
|
docker run --rm --platform linux/amd64 \
|
||||||
|
-e POLICY_REL="${POLICY_REL}" \
|
||||||
|
-e NAME="${NAME}" \
|
||||||
|
-e HISTORY_LEN="${HISTORY_LEN}" \
|
||||||
|
-e FLAT_DIM="${FLAT_DIM}" \
|
||||||
|
-e SAMPLES="${SAMPLES}" \
|
||||||
|
-e MIN_SAMPLES="${MIN_SAMPLES}" \
|
||||||
|
-e LOG_PREFIX="${LOG_PREFIX}" \
|
||||||
|
-e CAL_DIR="${CAL_DIR}" \
|
||||||
|
-e OUTPUT_DIR="${OUTPUT_DIR}" \
|
||||||
|
-e OUTPUT_PREFIX="${OUTPUT_PREFIX}" \
|
||||||
|
-e YAML_FILE="${YAML_FILE}" \
|
||||||
|
-e COMPARE_LIMIT="${COMPARE_LIMIT}" \
|
||||||
|
-e RUN_CHECKER="${RUN_CHECKER}" \
|
||||||
|
-e QUANT="${QUANT}" \
|
||||||
|
-e MARCH="${MARCH}" \
|
||||||
|
-v "${REPO_ROOT}:/workspace/deploy_go1_pro" \
|
||||||
|
"${DOCKER_IMAGE}" \
|
||||||
|
bash -lc '
|
||||||
|
set -euo pipefail
|
||||||
|
cd /workspace/deploy_go1_pro/deploy_45dim_rl_gym/bpu_quantization
|
||||||
|
|
||||||
|
POLICY="/workspace/deploy_go1_pro/${POLICY_REL}"
|
||||||
|
ACTIONS_ONNX="${NAME}_actions.onnx"
|
||||||
|
OPSET_ONNX="${NAME}_opset11.onnx"
|
||||||
|
BPU4D_ONNX="${NAME}_bpu4d.onnx"
|
||||||
|
GEMM_ONNX="${NAME}_bpu4d_gemm.onnx"
|
||||||
|
|
||||||
|
python3 make_calibration_data.py \
|
||||||
|
--logs-root ../../logs \
|
||||||
|
--log-prefix "${LOG_PREFIX}" \
|
||||||
|
--history-len "${HISTORY_LEN}" \
|
||||||
|
--output-dir "${CAL_DIR}" \
|
||||||
|
--max-samples "${SAMPLES}" \
|
||||||
|
--min-samples "${MIN_SAMPLES}" \
|
||||||
|
--overwrite
|
||||||
|
|
||||||
|
python3 keep_actions_output.py \
|
||||||
|
--input "${POLICY}" \
|
||||||
|
--output "${ACTIONS_ONNX}"
|
||||||
|
|
||||||
|
python3 downgrade_policy_to_opset11.py \
|
||||||
|
--input "${ACTIONS_ONNX}" \
|
||||||
|
--output "${OPSET_ONNX}"
|
||||||
|
|
||||||
|
python3 make_bpu_4d_onnx.py \
|
||||||
|
--input "${OPSET_ONNX}" \
|
||||||
|
--output "${BPU4D_ONNX}" \
|
||||||
|
--flat-dim "${FLAT_DIM}"
|
||||||
|
|
||||||
|
python3 replace_group_conv_with_gemm.py \
|
||||||
|
--input "${BPU4D_ONNX}" \
|
||||||
|
--output "${GEMM_ONNX}"
|
||||||
|
|
||||||
|
python3 compare_4d_onnx.py \
|
||||||
|
--flat-onnx "${ACTIONS_ONNX}" \
|
||||||
|
--bpu4d-onnx "${GEMM_ONNX}" \
|
||||||
|
--calibration-dir "${CAL_DIR}" \
|
||||||
|
--flat-dim "${FLAT_DIM}" \
|
||||||
|
--limit "${COMPARE_LIMIT}"
|
||||||
|
|
||||||
|
if [[ "${QUANT}" = "int16" ]]; then
|
||||||
|
QUANT_CONFIG=$(cat <<EOF
|
||||||
|
quant_config:
|
||||||
|
model_config:
|
||||||
|
all_node_type: int16
|
||||||
|
activation:
|
||||||
|
calibration_type: max
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
else
|
||||||
|
QUANT_CONFIG=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat > "${YAML_FILE}" <<YAML
|
||||||
|
model_parameters:
|
||||||
|
onnx_model: "./${GEMM_ONNX}"
|
||||||
|
march: "${MARCH}"
|
||||||
|
layer_out_dump: false
|
||||||
|
working_dir: "${OUTPUT_DIR}"
|
||||||
|
output_model_file_prefix: "${OUTPUT_PREFIX}"
|
||||||
|
|
||||||
|
input_parameters:
|
||||||
|
input_name: "obs_4d"
|
||||||
|
input_shape: "1x1x1x${FLAT_DIM}"
|
||||||
|
input_type_rt: "featuremap"
|
||||||
|
input_type_train: "featuremap"
|
||||||
|
input_layout_train: "NCHW"
|
||||||
|
norm_type: "no_preprocess"
|
||||||
|
separate_batch: false
|
||||||
|
|
||||||
|
calibration_parameters:
|
||||||
|
cal_data_dir: "./${CAL_DIR}"
|
||||||
|
cal_data_type: "float32"
|
||||||
|
calibration_type: "max"
|
||||||
|
${QUANT_CONFIG}
|
||||||
|
per_channel: true
|
||||||
|
|
||||||
|
compiler_parameters:
|
||||||
|
compile_mode: "latency"
|
||||||
|
optimize_level: "O2"
|
||||||
|
core_num: 1
|
||||||
|
jobs: 8
|
||||||
|
cache_mode: "disable"
|
||||||
|
YAML
|
||||||
|
|
||||||
|
hb_compile -c "${YAML_FILE}"
|
||||||
|
|
||||||
|
find "${OUTPUT_DIR}" -maxdepth 1 -type f \( -name "${OUTPUT_PREFIX}.hbm" -o -name "${OUTPUT_PREFIX}.bin" \) -print -exec ls -lh {} \;
|
||||||
|
'
|
||||||
|
|
||||||
|
echo "[INFO] Done: deploy_45dim_rl_gym/bpu_quantization/${OUTPUT_DIR}/${OUTPUT_PREFIX}.hbm"
|
||||||
Reference in New Issue
Block a user