点击下方卡片,关注【Xbotics具身智能实验室】公众号
你想要的这里都有~~
本次 AMD Hackathon 的 Physical AI 赛道,并不限定某种特定机器人,而是希望选手围绕一个核心问题展开:如何利用 AMD Radeon GPU 与 ROCm 生态,把一套完整的机器人工作流实现下来。
本文将带你从零开始,在 Genesis 仿真中生成 Franka 机械臂的专家抓取轨迹,通过 LeRobot 构建标准数据集,并对视觉‑语言‑动作模型 SmolVLA 进行微调,最终形成一个“仿真→数据→训练→评估”的完整闭环。
一、赛道评分与本文目标
大赛评分主要从五个维度考察:
能力表现(30分):任务是否稳定完成 AMD Radeon & ROCm(20分):ROCm 运行记录、训练耗时、峰值显存、利用率 创新与原创性(20分):设定自己的 baseline、进行消融实验 真实应用价值(20分):能否迁移至真实场景 上游开源贡献(10分):成果是否可复现、可继续开发


本教程的输出刚好覆盖以上所有要求——我们在 AMD GPU + ROCm 上完成数据生成与模型训练,记录显存、耗时与 loss 变化,保留完整的 LeRobot 数据集和权重,并留有消融实验的接口。
demo效果



二、环境搭建:从硬件驱动到模型层
整个项目的依赖共分六层:
AMD GPU + amdgpu 驱动 – 实际计算与图形渲染 ROCm + HIP + Mesa – AMD 计算平台 PyTorch + AOTriton – 张量计算、自动求导、Attention 加速 Genesis + Taichi – 机器人仿真、碰撞、IK、相机渲染 LeRobot + Transformers – 数据集格式、策略接口、模型加载 SmolVLA – 视觉+语言+机器人状态 → 动作
上层依赖下层,因此环境检查应从底向上进行。
2.1 虚拟环境与 PyTorch(ROCm版)
cd /workspacepython3 -m venv rdnasource /workspace/rdna/bin/activatepython -m pip install --upgrade pip setuptools wheel# 安装镜像提供的 ROCm 7.2.1 版本 PyTorch wheelpython -m pip install \ /torch-2.9.1+rocm7.2.1*.whl \ /torchvision-0.24.0+rocm7.2.1*.whl \ /torchaudio-2.9.0+rocm7.2.1*.whl \ /triton-3.5.1+rocm7.2.1*.whl验证 ROCm 与 GPU 可用:
import torchprint(torch.version.hip) # 应非空print(torch.cuda.is_available()) # 应 True2.2 Genesis 仿真器
git clone --depth 1 https://github.com/Genesis-Embodied-AI/Genesis.git /workspace/Genesissource /workspace/rdna/bin/activatepython -m pip install /workspace/Genesis测试导入:
import genesisprint("Genesis:", genesis.__version__)2.3 LeRobot、Transformers 等模型依赖
python -m pip install \ "lerobot==0.4.4" transformers accelerate safetensors \ matplotlib Pillow jupyter nbconvert ipykernel num2words modelscope2.4 NumPy 与 scikit-image(修复 ABI 兼容)
python -m pip install --force-reinstall --no-cache-dir \ "numpy==2.1.2""scikit-image>=0.22"2.5 FFmpeg 与 TorchCodec(视频编解码)
apt-get updateapt-get install -y ffmpeg libavcodec-dev libavformat-dev \ libavutil-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-devbash setup_torchcodec.sh验证:
import torchcodecprint("TorchCodec import ok")2.6 缓存路径与模型完整性
将模型和数据集缓存指向持久化目录:
export HF_HOME=/workspace/cache/huggingfaceexport HF_LEROBOT_HOME=/workspace/cache/huggingface/lerobotexport MODELSCOPE_CACHE=/workspace/cache/modelscope确保 /workspace/models/ 下存在预训练权重:
smolvla_base/(SmolVLA 策略配置与权重)SmolVLM2-500M-Video-Instruct/(VLM 骨干)
此时你的环境已形成一条完整链路:
ROCm → PyTorch → Genesis → LeRobot → SmolVLA。
三、生成专家抓取数据(Genesis + LeRobot)
3.1 一键生成
进入项目目录并执行数据生成脚本:
source /workspace/rdna/bin/activatecd /workspace/Robot_synthetic_data_generation_workshoppython scripts/02_gen_data_custom_scene.py \ --scene rustic_kitchen \ --anchor floor_origin \ --camera-layout up_wrist \ --n-episodes 1 \ --repo-id local/franka-kitchen-wrist-live \ --seed 42这条命令背后完成了:
加载厨房场景 → 创建 Franka 机械臂 → 随机放置方块 专家控制器通过 逆运动学 生成抓取轨迹 同时记录两路相机图像(顶视 + 手腕)、关节状态、专家动作和语言任务“Pick up the cube.” 每条约 135 帧,30 FPS,一次抓取约 4.5 秒
日志中看到 lift=0.1448m sustain=39 即表示本次抓取成功。
3.2 数据保存位置
数据存入 LeRobot 本地仓库:
/workspace/cache/huggingface/lerobot/local/franka-kitchen-wrist-live/读取验证:
from lerobot.datasets.lerobot_dataset import LeRobotDatasetds = LeRobotDataset("local/franka-kitchen-wrist-live")sample = ds[0]print("frames:", len(ds)) # 135print("task:", sample["task"]) # Pick up the cube.print("up camera shape:", sample["observation.images.up"].shape) # [3,480,640]print("state shape:", sample["observation.state"].shape) # [9]print("action shape:", sample["action"].shape) # [9]至此,Genesis 的仿真数据被 LeRobot 转化成了 SmolVLA 能直接消费的标准格式。
四、LeRobot 数据集格式详解
LeRobot 数据集的逻辑结构:
Dataset├── Episode 0(一次完整抓取)│ ├── Frame 0│ ├── Frame 1│ └── ……├── Episode 1└── ……每条样本的关键字段:
observation.images.up – 顶视相机图像 observation.images.side – 手腕相机图像 observation.state(9维)– 前7维为机械臂关节角,后2维为夹爪位置 action(9维)– 专家给出的目标关节/夹爪位置 task – 文本指令 “Pick up the cube.” episode_index / frame_index
训练时,SmolVLA 使用图像、状态和语言作为输入,以专家 action 作为监督信号。
可以把 LeRobot 看作 Genesis 与 SmolVLA 之间的数据协议。
五、用 SmolVLA 进行模仿学习微调
5.1 模型输入/输出
SmolVLA 是一个 视觉‑语言‑动作模型,接收:
两路图像 当前 9D 机器人状态 语言任务
预测:
下一段 9D 机器人动作(机械臂 + 夹爪)
训练目标是最小化预测动作与专家动作的差异。
5.2 加载本地预训练模型
启用离线模式,确保从 /workspace/models 加载:
export HF_HUB_OFFLINE=1export TRANSFORMERS_OFFLINE=15.3 启动训练
使用 100 个 episode 的数据微调:
python scripts/02_train_vla.py \ --dataset-id local/franka-kitchen-wrist-100ep \ --pretrained /workspace/models/smolvla_base \ --n-steps 4000 \ --batch-size 4 \ --num-workers 4 \ --save-every 0 \ --log-every 20 \ --seed 42 \ --output-dir ./output \ --run-name smolvla_kitchen_wrist_100ep_4000step关键信息:
设备显示 device: cuda(实际为 ROCm/HIP)启用 AMP( torch.bfloat16)总参数量 450,046,176,可训练参数 99,880,992,冻结部分视觉骨干 初始 loss ≈ 0.6289,最终 loss ≈ 0.0106 峰值显存约 2.27 GB,训练耗时约 648 秒
5.4 训练产物
output/train/smolvla_kitchen_wrist_100ep_4000step/├── final/ # 最终模型权重与配置├── train_summary.json # 训练总结└── train_metrics.json # 详细指标六、总结与下一步
此时我们已完成:
基于 ROCm 的全链路环境搭建 利用 Genesis 生成专家抓取数据,存入 LeRobot 格式 理解 LeRobot 数据集,确认观测与动作维度 对 SmolVLA 进行模仿学习微调,loss 从 0.63 降至 0.01
所有过程均在 AMD Radeon GPU 上运行,完整记录了显存占用、训练时间和利用率,满足赛道评分要求。
下一阶段:将训练好的策略重新加载到 Genesis 仿真中,进行闭环推理,评估抓取成功率,完成从数据生成到最终性能评估的完整闭环。你还可以基于此 baseline 进行消融实验(如改变相机视角、修改任务语言描述、调整机械臂初始位姿等),充分展示创新性与真实应用价值。

复现提示
本文所有代码和数据集路径均指向
/workspace下的持久化存储,建议在实例启动后首先完成第二章的环境验证,再依次执行数据生成与训练。所有依赖版本已锁定,可直接复现。开源贡献方面,您可以将训练好的模型配置、数据集以及闭环评估脚本整理提交,推动社区在 AMD ROCm 平台上进行更广泛的机器人学习研究。
-END-
Ask Me Anything|提问箱
对文章有疑惑,或想聊更深?欢迎把你的问题丢给我们:技术方案、实操踩坑、课程与资料、项目合作、职业发展,都可以问。
怎么问:在评论区留言,或私信公众号
我们会做什么:每周集中整理高质量问题并公开回复,重点问题邀请作者或嘉宾深度解答;典型问题会加入知识库并持续更新。
提问小提示:尽量说明「你的目标—当前做法—期望产出」,附上必要信息(硬件/软件版本、数据规模等),能更快获得有用答案。
一起把问题变成知识,推动社区进步 🚀