本博客是基于 mjlab + rsl_rlG1/H2 AMP 运动控制,同时支持走/跑、跌倒恢复 🚀

训练开源代码https://github.com/ccrpRepo/AMP_mjlab

部署集成位置:部署集成代码位于 https://github.com/ccrpRepo/wbc_fsm 项目中的 MJAmp State

其中AMP的算法思路、代码分析,参考我这篇博客:《VLA 系列》AMP 算法与代码分析技术

示例效果:
在这里插入图片描述
跌到、恢复:
在这里插入图片描述
H2的效果:
在这里插入图片描述

项目核心特点:

  • 统一策略:使用同一个 policy 同时学习 locomotion(走/跑)与 recovery(跌倒恢复)
  • 🧠 AMP 风格约束:通过 AMP discriminator 约束动作风格与运动先验
  • 🤖 H2 新增适配:原开源版本只支持 G1,可以通过修改任务配置、机器人资产、动作数据和训练入口等代码,新增适配 H2
  • 🚀 训练部署一致:训练与导出链路保持一致,支持直接导出 ONNX policy

参考项目:

📚 目录

1. 核心思路

传统做法常把“走跑策略”和“恢复策略”分开训练并做切换;本博客将两类能力放入同一个策略中统一学习。

实现要点:

  • 📁 运动数据分组
    • Walk/Run 数据目录:src/assets/motions/g1/amp/WalkandRun
    • Recovery 数据目录:src/assets/motions/g1/amp/Recovery
    • H2 数据目录:src/assets/motions/h2/amp/WalkandRunsrc/assets/motions/h2/amp/Recovery
  • ⏱️ 延迟重置机制(Delayed Termination)
    • 一部分环境在触发终止后不立即 reset,而是给定恢复窗口
    • 该子集环境优先从 Recovery 片段采样 reset 状态
  • 🧠 统一 AMP 训练
    • 单一 actor-critic + 单一 AMP discriminator
    • 在同一训练过程中学习速度跟踪、抗扰动与恢复能力

核心收益:这样可以减少策略切换带来的状态不连续问题,得到更一致的行为。

2. 环境要求

  • 系统Linux
  • PythonPython 3.11(建议)
  • 仿真 / GPU:已可用的 MuJoCo / GPU 驱动环境
  • CUDA:推荐 CUDA 12.8 / CUDA 12.9 相关环境

3. 下载代码

git clone https://github.com/ccrpRepo/AMP_mjlab.git
cd AMP_mjlab

4. 创建并激活 conda 环境

conda create -n mjlab python=3.11
conda activate mjlab

5. 安装项目依赖

项目根目录执行:

python -m pip install -e .

说明:该命令会安装本仓库,并根据 setup.py 安装 mjlab==1.2.0

6. 安装指定版本的 PyTorch

pip install torch==2.11.0 torchvision==0.26.0 torchaudio==2.11.0 --index-url https://download.pytorch.org/whl/cu128

7. 安装 Warp 和 mujoco-warp 兼容版本

pip install warp-lang==1.14.0 mujoco-warp==3.9.0

8. 应用 mjlab 观测历史补丁

⚠️ 注意:如果不打这个补丁,则需要在代码中去掉 history_ordering 配置。

补丁作用说明:

  • 增加历史观测的展开方式选项,可选择按时间维(time)或按观测项(term)展开
  • mjlab 默认仅支持按 term 展开

补丁文件:

  • mjlab_patch/mjlab/managers/observation_manager.py

示例覆盖命令:

cp mjlab_patch/mjlab/managers/observation_manager.py \
	/home/liguopu/miniconda3/envs/mjlab/lib/python3.11/site-packages/mjlab/managers/observation_manager.py

💡 路径提示:如果环境路径不同,请把 /home/liguopu/miniconda3/envs/mjlab 替换为实际的 conda 环境路径。也可以用下面命令查看 site-packages 位置:

python - <<'PY'
import site
print(site.getsitepackages())
PY

9. 修复 mjlab CUDA Graph 兼容问题

torch==2.11.0+cu128 环境中,torch.cuda.get_driver_version() 不存在,而 mjlab==1.2.0 默认会调用它判断 CUDA Graph 是否可用,因此训练会报错:

AttributeError: module 'torch.cuda' has no attribute 'get_driver_version'

推荐修改 mjlab 安装包里的文件:

/home/liguopu/miniconda3/envs/mjlab/lib/python3.11/site-packages/mjlab/sim/sim.py

找到 _should_use_cuda_graph(),把原来的 PyTorch driver version 获取逻辑:

import torch
driver_ver_int = torch.cuda.get_driver_version()
driver_ver = (driver_ver_int // 1000, (driver_ver_int % 1000) // 10)

改为使用 Warp:

driver_ver = wp.get_cuda_driver_version()

修改后的关键代码应类似:

def _should_use_cuda_graph(self) -> bool:
	"""Determine if CUDA graphs can be used based on device and driver version."""
	if not self.wp_device.is_cuda:
		return False

	driver_ver = wp.get_cuda_driver_version()
	has_mempool = wp.is_mempool_enabled(self.wp_device)

	if driver_ver is None:
		print("[WARNING] CUDA Graphs disabled: driver version unavailable")
		return False

	if has_mempool and driver_ver >= _GRAPH_CAPTURE_MIN_DRIVER:
		return True

	reasons = []
	if not has_mempool:
		reasons.append("mempool disabled")
	if driver_ver < _GRAPH_CAPTURE_MIN_DRIVER:
		reasons.append(f"driver {driver_ver[0]}.{driver_ver[1]} < 12.4")
	print(f"[WARNING] CUDA Graphs disabled: {', '.join(reasons)}")
	return False

原因:当前 warp-lang==1.14.0wp.get_cuda_driver_version() 返回类似 (12, 9)tuple,正好能和 mjlab 后续的 _GRAPH_CAPTURE_MIN_DRIVER = (12, 4) 比较。

可用下面命令验证:

python - <<'PY'
import warp as wp
wp.init()
print(wp.get_cuda_driver_version())
PY

10. 查看可用任务

python scripts/list_envs.py --keyword AMP

主要任务:

  • Unitree-G1-AMP-Rough
  • Unitree-G1-AMP-Flat
  • Unitree-H2-AMP-Rough
  • Unitree-H2-AMP-Flat

备注:原开源版本只支持 G1H2 相关任务是本博客通过修改代码后新增适配的任务。

💡 临时运行方式:如果不想安装项目,也可以临时把项目根目录加入 Python 模块搜索路径(仅当前终端生效):

export PYTHONPATH=/home/liguopu/lgp_dev/project/AMP_mjlab:$PYTHONPATH
python scripts/list_envs.py --keyword AMP

命令写法注意:

python -m scripts.list_envs --keyword AMP

⚠️ 不要写错python -m scripts.list_envs.py 是错误写法,-m 后面应跟模块名,不能带 .py 后缀。

11. G1 训练

python scripts/train.py Unitree-G1-AMP-Flat --env.scene.num-envs=4096

日志默认保存到:

logs/rsl_rl/g1_amp_locomotion/<time_stamp_run>/

📈 训练曲线说明(对应训练信息)

在约 2w(约 20k iterations)附近,策略通常会突然学会“跌倒后恢复”行为。

正常现象:对应地,logs 中多个指标可能出现明显突变(阶跃式变化),这是正常现象,不一定是训练异常。

训练过程中终端会持续打印统计信息。下面这一段是 G1 Flat 训练日志示例,用于说明各类指标的含义和正常输出格式:

################################################################################

Learning iteration                          : 100000/100001

Computation                                 : 53904 steps/s (collection: 1.071s, learning 0.752s)
Mean action noise std                       : 0.28
Mean value_function loss                    : 0.0065
Mean surrogate loss                         : -0.0100
Mean entropy loss                           : 3.3100
Mean amp loss                               : 0.3794
Mean amp_grad_pen loss                      : 0.2058
Mean amp_policy_pred loss                   : -0.4078
Mean amp_expert_pred loss                   : 0.4068
Mean skipped_non_finite_batches loss        : 0.0000
Mean reward                                 : 41.46
Mean episode length                         : 995.78

Episode_Reward/track_anchor_linear_velocity : 0.7154
Episode_Reward/track_anchor_angular_velocity: 0.9129
Episode_Reward/track_root_height            : 0.0038
Episode_Reward/body_ang_vel_xy_l2           : 0.4666
Episode_Reward/is_terminated                : -0.0014
Episode_Reward/joint_acc_l2                 : -0.0761
Episode_Reward/joint_pos_limits             : -0.0039
Episode_Reward/action_rate_l2               : -0.0616
Episode_Reward/foot_slip                    : -0.0174
Episode_Reward/self_collisions              : -0.0039
Episode_Metrics/mean_action_acc             : 0.5422
Episode_Metrics/mean_delay_steps            : 0.5537
Metrics/twist/error_vel_xy                  : 1.5915
Metrics/twist/error_vel_yaw                 : 1.7172
Episode_Termination/time_out                : 5.1667
Episode_Termination/bad_orientation         : 0.0000
Episode_Termination/bad_base_height         : 0.0417
Metrics/slip_velocity_mean                  : 0.1289
--------------------------------------------------------------------------------
Total timesteps                             : 9830498304
Iteration time                              : 1.82s
Time elapsed                                : 02:57:11
ETA                                         : 00:00:01

🔍 怎么看这类输出:可以快速观察训练速度、rewardAMP loss、终止原因、速度误差和剩余时间。比如上面的 G1 示例中 Mean reward: 41.46Computation: 53904 steps/sMean skipped_non_finite_batches loss: 0.0000,说明该阶段训练正在正常推进,且没有跳过非有限数值 batchH2 Flat 的实测训练日志单独记录在第 12 节。

12. H2 训练

⚠️ 训练前置条件H2 训练前需要先准备 H2 AMP NPZ 数据。可由现有 G1 AMP NPZ 重定位生成,详见第 14 节。

确认 src/assets/motions/h2/amp/WalkandRun 中已经存在 .npz 后,执行:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/train.py Unitree-H2-AMP-Flat \
	--env.scene.num-envs=4096

日志默认保存到:

logs/rsl_rl/h2_amp_locomotion/<time_stamp_run>/

如果要训练 粗糙地形 版本,任务名改为:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/train.py Unitree-H2-AMP-Rough \
	--env.scene.num-envs=4096

🧪 H2 最小连通性测试命令:

💡 这里的“冒烟测试”指用最小环境数最少训练轮数快速跑一遍,不追求训练效果,只验证 H2 资产、H2 NPZ 数据、任务注册和训练入口是否能正常连通。

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/train.py Unitree-H2-AMP-Flat \
	--env.scene.num-envs=1 \
	--agent.max-iterations=1

通过标准:如果能进入 runner 并保存 model_0.pt,说明 H2 资产、H2 NPZ 和训练入口都已打通。

📊 H2 Flat 实测训练记录

本次 H2 Flat 训练命令:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/train.py Unitree-H2-AMP-Flat \
	--env.scene.num-envs=4096

训练末尾输出:

################################################################################
Learning iteration                          : 100000/100001

Computation                                 : 32648 steps/s (collection: 1.685s, learning 1.326s)
Mean action noise std                       : 0.26
Mean value_function loss                    : 0.0067
Mean surrogate loss                         : -0.0107
Mean entropy loss                           : -1.8587
Mean amp loss                               : 0.2792
Mean amp_grad_pen loss                      : 0.2033
Mean amp_policy_pred loss                   : -0.5074
Mean amp_expert_pred loss                   : 0.5010
Mean skipped_non_finite_batches loss        : 0.0000
Mean reward                                 : 39.14
Mean episode length                         : 1000.00

Episode_Reward/track_anchor_linear_velocity : 0.6854
Episode_Reward/track_anchor_angular_velocity: 0.9154
Episode_Reward/track_root_height            : 0.0019
Episode_Reward/body_ang_vel_xy_l2           : 0.4594
Episode_Reward/is_terminated                : 0.0000
Episode_Reward/joint_acc_l2                 : -0.0881
Episode_Reward/joint_pos_limits             : -0.0056
Episode_Reward/action_rate_l2               : -0.0622
Episode_Reward/foot_slip                    : -0.0239
Episode_Reward/self_collisions              : -0.0019
Episode_Metrics/mean_action_acc             : 0.5028
Episode_Metrics/mean_delay_steps            : 0.8181
Metrics/twist/error_vel_xy                  : 1.6271
Metrics/twist/error_vel_yaw                 : 2.0770
Episode_Termination/time_out                : 4.3333
Episode_Termination/bad_orientation         : 0.0000
Episode_Termination/bad_base_height         : 0.0000
Metrics/slip_velocity_mean                  : 0.1238
--------------------------------------------------------------------------------
Total timesteps                             : 9830498304
Iteration time                              : 3.01s
Time elapsed                                : 01:21:54
ETA                                         : 00:00:01

13. 评估与可视化

🚀 说明:训练与回放阶段都支持 ONNX 导出(默认开启)。

13.1 通用回放命令

使用已训练权重回放时,需要指定任务名checkpoint 文件

G1 回放命令:

python scripts/play.py Unitree-G1-AMP-Rough \
	--checkpoint-file logs/rsl_rl/g1_amp_locomotion/<run_dir>/model_<iter>.pt

H2 回放命令:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/play.py Unitree-H2-AMP-Flat \
	--checkpoint-file logs/rsl_rl/h2_amp_locomotion/<run_dir>/model_<iter>.pt \
	--num-envs 1 \
	--viewer native

如果评估 H2 粗糙地形版本,任务名改为:

Unitree-H2-AMP-Rough

⚠️ 注意G1 checkpoint 不能直接用于 H2H2 当前策略只控制 29 个非头部关节,头部两个关节保持固定;但 H2 机器人模型和观测空间仍与 G1 不同。H2 必须使用 logs/rsl_rl/h2_amp_locomotion/... 下训练得到的 checkpoint

13.2 G1 实践示例

以下示例使用 2026-07-12_11-43-37 这次训练中的 model_23900.pt 进行回放与可视化。

先确认权重文件存在:

find logs/rsl_rl/g1_amp_locomotion -name 'model_23900.pt'

示例输出:

logs/rsl_rl/g1_amp_locomotion/2026-07-12_11-43-37/model_23900.pt

13.3 方式一:Viser 浏览器可视化

启动 Viser 可视化回放:

source ~/miniconda3/etc/profile.d/conda.sh && conda activate mjlab

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/play.py Unitree-G1-AMP-Flat \
	--checkpoint-file logs/rsl_rl/g1_amp_locomotion/2026-07-12_11-43-37/model_23900.pt \
	--num-envs 1 \
	--viewer viser

启动成功后,终端会显示类似:

[INFO]: Loading checkpoint: model_23900.pt
[INFO]: Exported ONNX policy to: /home/liguopu/lgp_dev/project/AMP_mjlab/logs/rsl_rl/g1_amp_locomotion/2026-07-12_11-43-37/export/Unitree-G1-AMP-Flat_model_23900.onnx
╭────── viser (listening *:8080) ───────╮
│             ╷                         │
│   HTTP      │ http://localhost:8080   │
│   Websocket │ ws://localhost:8080     │
│             ╵                         │
╰───────────────────────────────────────╯

浏览器打开:

http://localhost:8080

💡 端口提示:如果已有其他 Viser 进程占用了 8080,终端可能显示 8081 或其他端口,以实际输出为准。

13.4 方式二:native viewer 本地窗口

如果浏览器提示 WebGL unavailable,或者 Viser 页面能连接但画面空白,可以改用 native viewer

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/play.py Unitree-G1-AMP-Flat \
	--checkpoint-file logs/rsl_rl/g1_amp_locomotion/2026-07-12_11-43-37/model_36600.pt \
	--num-envs 1 \
	--viewer native

H2 native viewer 示例:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/play.py Unitree-H2-AMP-Flat \
	--checkpoint-file logs/rsl_rl/h2_amp_locomotion/<run_dir>/model_<iter>.pt \
	--num-envs 1 \
	--viewer native

示例效果:
在这里插入图片描述

native viewer 常用按键:

按键 作用
s 切换模式,提高帧率
= 加速播放
- 减速播放
R 开关 debug visualization
P 开关 reward plots
Space 暂停 / 继续
Enter 重置环境
, 切换到上一个环境
. 切换到下一个环境
暂停时单步前进

在这里插入图片描述

🎮 操作建议:可以先按 R 关闭 debug visualization,再按 P 确认 reward plots 关闭;需要更快播放时按 = 加速。
在这里插入图片描述

13.5 H2 实践示例

本小节使用已经训练完成的 H2 Flat checkpoint 进行回放,主要用于确认 H2 策略是否能正常驱动机器人走、跑以及跌倒恢复

示例权重:这里使用的是 logs/rsl_rl/h2_amp_locomotion/2026-07-13_18-59-23/model_100000.pt。如果使用自己的训练结果,请把 run_dirmodel_<iter>.pt 替换为实际路径。

H2 Flat native viewer 回放命令:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/play.py Unitree-H2-AMP-Flat \
	--checkpoint-file logs/rsl_rl/h2_amp_locomotion/2026-07-13_18-59-23/model_100000.pt \
	--num-envs 1 \
	--viewer native

参数说明:

  • Unitree-H2-AMP-Flat:使用 H2 Flat 评估任务
  • --checkpoint-file:指定训练完成后的 H2 权重文件
  • --num-envs 1:只启动 1 个环境,便于观察单个机器人的动作效果
  • --viewer native:使用 MuJoCo 原生窗口查看回放效果

⚠️ 注意:这里必须使用 h2_amp_locomotion 目录下的 H2 checkpoint。不要把 G1checkpoint 直接拿来回放 H2,两者机器人模型和观测空间不同。

走、跑效果:
在这里插入图片描述

跌倒、恢复效果:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

🎬 观察重点:回放时可以重点看 H2 是否能稳定跟踪速度命令、走跑动作是否连续、跌倒后是否能进入恢复动作并重新站起。

13.6 常见问题:rsl_rl 导入路径

如果直接运行 python scripts/play.py ... 时出现下面错误:

ModuleNotFoundError: No module named 'rsl_rl.runners.amp_on_policy_runner'

原因与处理:通常是因为没有优先导入本仓库自带的 rsl_rl。在命令前加上下面这一段即可:

PYTHONPATH="$PWD:${PYTHONPATH:-}"

完整命令可以写成:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/play.py Unitree-G1-AMP-Flat \
	--checkpoint-file logs/rsl_rl/g1_amp_locomotion/2026-07-12_11-43-37/model_23900.pt \
	--num-envs 1 \
	--viewer viser

13.7 ONNX 导出结果

这次实践中导出的 ONNX 文件为:

logs/rsl_rl/g1_amp_locomotion/2026-07-12_11-43-37/export/Unitree-G1-AMP-Flat_model_23900.onnx

14. 运动数据准备

仓库提供 CSVNPZ 的转换脚本:

python scripts/csv_to_npz.py --help

推荐目录组织:

  • 原始 CSVmotion_data_csv/amp
  • 转换后 NPZsrc/assets/motions/g1/amp/WalkandRunsrc/assets/motions/g1/amp/Recovery
  • H2 重定位 NPZsrc/assets/motions/h2/amp/WalkandRunsrc/assets/motions/h2/amp/Recovery

自动加载:只要上述目录中存在可用 NPZ,训练配置会自动加载。

14.1 G1 AMP NPZ 可视化

如果想直接查看 G1 NPZ 动作本身,不需要训练 checkpoint,可以用 MuJoCo 原生窗口播放:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/visualize_g1_npz.py \
	--npz-file src/assets/motions/g1/amp/Recovery/fallAndGetUp1_subject1.npz \
	--device cuda:0

🎬 播放提示:脚本默认会循环播放,关闭 MuJoCo 窗口即可退出。

常用参数:

# 无窗口快速校验前三帧,适合远程或无显示环境
PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/visualize_g1_npz.py \
	--npz-file src/assets/motions/g1/amp/Recovery/fallAndGetUp1_subject1.npz \
	--no-viewer \
	--no-loop \
	--max-frames 3

# 慢速播放
PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/visualize_g1_npz.py \
	--npz-file src/assets/motions/g1/amp/Recovery/fallAndGetUp1_subject1.npz \
	--speed 0.5

该脚本会读取 G1 NPZ 中的 root 状态、29 维关节位置/速度,并逐帧写入 G1 MuJoCo/mjlab 模型。

14.2 由 G1 AMP NPZ 生成 H2 AMP NPZ

H2 可以直接使用脚本从现有 G1 AMP NPZ 重定位生成:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/retarget_g1_amp_to_h2_npz.py \
	--input-root src/assets/motions/g1/amp \
	--output-root src/assets/motions/h2/amp \
	--device cuda:0

如果使用 CPU:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python scripts/retarget_g1_amp_to_h2_npz.py \
	--input-root src/assets/motions/g1/amp \
	--output-root src/assets/motions/h2/amp \
	--device cpu

当前重定位策略:

  • 关节映射G129 个同名关节映射到 H229 个非头部关节
  • 头部关节H2head_pitch_jointhead_yaw_joint 保持默认 0 位姿和 0 速度
  • 数据格式:输出仍然保留 H2 31 DoF 数据格式,其中头部两维为默认 0;训练策略只控制 29 个非头部关节
  • 重新计算 body 状态:脚本会用 H2 MuJoCo/mjlab 模型 forward,重新生成 H2body_pos_wbody_quat_wbody_lin_vel_wbody_ang_vel_w

生成后可验证:

find src/assets/motions/h2/amp -name '*.npz' | sort | wc -l

检查 shape:

PYTHONPATH="$PWD:${PYTHONPATH:-}" \
python - <<'PY'
import pathlib
import numpy as np

files = sorted(pathlib.Path("src/assets/motions/h2/amp").glob("*/*.npz"))
print("files", len(files))

joint_dims = set()
body_counts = set()
head_max = 0.0

for path in files:
	data = np.load(path)
	joint_dims.add(data["joint_pos"].shape[-1])
	body_counts.add(data["body_pos_w"].shape[1])
	head_max = max(head_max, float(abs(data["joint_pos"][:, 15:17]).max()))

print("joint_dims", joint_dims)
print("body_counts", body_counts)
print("head_abs_max", head_max)
PY

期望输出类似:

files 18
joint_dims {31}
body_counts {32}
head_abs_max 0.0

📘 更详细说明见:

H2_NPZ生成指导.md

15. 核心代码——目录说明

  • 📁 src/tasks/amp_locoAMP locomotion/recovery 任务实现
  • 📁 src/tasks/amp_loco/config/g1G1 任务注册、环境与 RL 配置
  • 📁 src/tasks/amp_loco/config/h2H2 任务注册、环境与 RL 配置
  • 📁 src/tasks/amp_loco/mdp:奖励、观测、事件、终止逻辑
  • 🚀 scripts/train.py:训练入口
  • 🎬 scripts/play.py:回放入口
  • 📊 scripts/csv_to_npz.py:动作数据转换工具
  • 👀 scripts/visualize_g1_npz.pyG1 AMP NPZMuJoCo 原生窗口可视化工具
  • 👀 scripts/visualize_h2_npz.pyH2 AMP NPZMuJoCo 原生窗口可视化工具
  • 🔁 scripts/retarget_g1_amp_to_h2_npz.pyG1 AMP NPZH2 AMP NPZ 的重定位生成工具
  • 📘 H2_NPZ生成指导.mdH2 AMP NPZ 生成说明
  • 🩹 mjlab_patch:依赖的 mjlab 本地补丁

16. 总结

  • 单一策略:统一覆盖走跑与跌倒恢复
  • 🧠 AMP + 速度任务联合优化:兼顾风格与任务性能
  • 🛡️ 延迟重置与 recovery 采样机制:显式强化恢复能力
  • 🚀 训练到部署链路完整:支持 ONNX 导出

✅ 分享完成~

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐