维护说明:每次调整数据来源、路径、脚本或训练参数时,请同步更新本文档。
一、200 条数据的四类来源
按《实验场景设置》,bell + alarmclock 一组共 200 条,分 4 类、每类 50 条:
表格
| 类别 | 场景 | 数据路径(data1 现有) | 说明 |
|---|---|---|---|
| 1 | 单场景,仅 bell | /data1/[用户名]/project/RoboTwin/data/click_bell_sim/demo_clean/ |
桌面只有铃铛,指令点铃铛 |
| 2 | 单场景,仅 alarmclock | /data1/[用户名]/project/RoboTwin/data/click_alarmclock/demo_clean/ |
桌面只有闹钟,指令点闹钟 |
| 3 | 复杂场景,bell+alarmclock,指令点 bell | /data1/[用户名]/project/RoboTwin/data/click_bell_double/demo_clean/ |
两物体都在,成功判定只看 bell |
| 4 | 复杂场景,bell+alarmclock,指令点 alarmclock | /data1/[用户名]/project/RoboTwin/data/click_alarmclock_double/demo_clean/ |
两物体都在,成功判定只看 alarmclock |
- 每类 50 条 → 共 200 条,用于微调与评测。
- 预处理 / 训练时应对 上述 4 个目录 分别预处理,再合并为一个 dataset(或分别注册后 mixture)。
二、数据收集:demo_*.yml 与 env 各管什么
2.1 谁决定「画面里有几个物体」?
- 由 env 里的 Python 任务类决定 ,即
envs/下对应task_name的.py文件。 - 在任务的
**load_actors()** 里:只加载一个物体 = 简单场景;加载两个物体(目标 + 干扰)= 复杂场景。 - 例如《实验场景设置》中的做法:
- 简单 :
load_actors()里只create_actor一个 bell(或只一个 alarmclock)。 - 复杂 :
load_actors()里先决定左右,再分别create_actorbell 和 alarmclock,成功判定只检查目标物体。
- 简单 :
因此:「画面中同时有两种物体」只靠改 env 的 py 文件即可实现 (在 load_actors() 中加第二个物体)。不需要、也不能单靠 yml 来「增加物体」;yml 不描述场景结构。
2.2 demo_clean.yml/demo_bell_alarm.yml 等 yml 起什么作用?
(demo_bell_alarm.yml :仅为「小规模试跑」用,例如把 episode_num 设为 20;正式 200 条仍用 4 类数据各 50 条,对应 task_config 通常用 demo_clean 即可。)
- 这些是 task_config ,对应
task_config/*.yml。 - 采集时命令为:
bash collect_data.sh <task_name> <task_config> <gpu_id>。 - task_name :选哪个 env(如
click_bell、hmr_complex_bell),决定场景里有什么物体、成功判谁。 - task_config :选哪份 yml,决定例如:
- episode_num:采多少条(如 50);
- save_path :数据写到哪(如
./data,即data/<task_name>/<task_config>/); - camera 、domain_randomization 、language_num 等。
所以:
- 构建「两物体」画面 :只改 env 的 py(或使用已有复杂场景任务,如
hmr_complex_bell)。 - 用不用 demo_clean.yml :可以。同一份
demo_clean.yml可用于不同 task_name;若要不同条数或不同随机化,可再建一份 yml(如demo_bell_alarm.yml里只把episode_num改成 20 做小规模测试)。
三、training_data 放哪里(RoboTwin_ws 与 OpenVLA-oft 下均可)
- RoboTwin_ws:之前建议用来集中放「数据 /checkpoint」等,与代码库分离,便于多项目共用。
- OpenVLA-oft 下 :完全可以把 training_data 直接建在
policy/openvla-oft/下 ,例如:policy/openvla-oft/training_data/openvla_click_bell_sim_demo_clean/policy/openvla-oft/training_data/openvla_click_bell_and_alarmclock/(合并 4 类后)
- 本流程以下均按 「OpenVLA-oft 的 training_data 放在
policy/openvla-oft/training_data/下」 写;若你更习惯用RoboTwin_ws,把下文路径中的training_data换成~/RoboTwin_ws/training_data即可。
四、全流程概览(数据收集 → OpenVLA-oft 配置 → 转换 → RLDS → 训练 → 评测)
1. 数据收集(4 类 × 50 条)
→ 2. 预处理为 ALOHA 格式(4 个输入目录 → training_data 下)并合并为 200 条
→ 3. 生成 RLDS(python -m datasets.click_bell_alarmclock_builder → TFDS 落盘)
→ 4. 训练(bash finetune_click_bell_alarmclock.sh,见第八节 8.3 条实际命令)
→ 5. 评测(bash eval.sh ...,见第九节)
复现说明 :各步实际可执行命令 以对应章节为准;步骤 4 以 **finetune_click_bell_alarmclock.sh** 及第八节 8.3 的复制粘贴命令为准(不再以文档内手写 torchrun 为例)。若训练时报缺包或其它错误,见 附录 A。
五、步骤 1:数据收集
5.1 本机采数(需先完成 RoboTwin 安装与 assets 下载)
若在 本机 ~/RoboTwin 采:
- 简单场景 :task_name 用只加载单物体的 env(如官方
click_bell、click_alarmclock)。 - 复杂场景 :task_name 用「两物体」的 env;若本机还没有,需从旧项目拷贝或参考《实验场景设置》在
envs/里改出(例如hmr_complex_bell、hmr_complex_alarmclock,或自建click_bell_double、click_alarmclock_double并在load_actors()里加载 bell+alarmclock)。
命令(在 ~/RoboTwin 下):
conda activate RoboTwin
# 示例:每类 50 条,task_config 用 demo_clean(episode_num: 50)
bash collect_data.sh <task_name> demo_clean <gpu_id>
- 数据落盘:
~/RoboTwin/data/<task_name>/demo_clean/(含data/*.hdf5、instructions/episode*.json)。 - 若用自定义 yml(如
demo_bell_alarm),把demo_clean换成该 yml 名即可;该 yml 只影响条数、保存路径等,不影响场景里有没有两个物体。
5.2 直接使用 data1 已有 200 条(当前推荐)
不重复采数时,直接用 data1 上已有 4 类数据:
click_bell_sim/demo_clean(50)click_alarmclock/demo_clean(50)click_bell_double/demo_clean(50)click_alarmclock_double/demo_clean(50)
后续预处理与合并均以这 4 个路径为输入。
六、步骤 2:预处理为 OpenVLA-oft 可用的 ALOHA 格式
- 输入 :每类一个目录,即上面 4 个路径下的 data/ (hdf5)和 instructions/(episode*.json)。
- 输出 :建议统一放在
**policy/openvla-oft/training_data/** 下,每类一个子目录(或先每类一个,再合并为一个 200 条目录)。
在 **~/RoboTwin/policy/openvla-oft** 下执行(示例为 data1 路径;若本机采数则改为本机路径):
conda activate RoboTwin
# 1) 单场景 bell
python preprocess_aloha.py \
--dataset_path /data1/[用户名]/project/RoboTwin/data/click_bell_sim/demo_clean/data \
--out_base_dir $(pwd)/training_data/openvla_click_bell_sim_demo_clean \
--instruction_dir /data1/[用户名]/project/RoboTwin/data/click_bell_sim/demo_clean/instructions \
--percent_val 0.05 --img_resize_size 256
# 2) 单场景 alarmclock
python preprocess_aloha.py \
--dataset_path /data1/[用户名]/project/RoboTwin/data/click_alarmclock/demo_clean/data \
--out_base_dir $(pwd)/training_data/openvla_click_alarmclock_demo_clean \
--instruction_dir /data1/[用户名]/project/RoboTwin/data/click_alarmclock/demo_clean/instructions \
--percent_val 0.05 --img_resize_size 256
# 3) 复杂场景 按 bell
python preprocess_aloha.py \
--dataset_path /data1/[用户名]/project/RoboTwin/data/click_bell_double/demo_clean/data \
--out_base_dir $(pwd)/training_data/openvla_click_bell_double_demo_clean \
--instruction_dir /data1/[用户名]/project/RoboTwin/data/click_bell_double/demo_clean/instructions \
--percent_val 0.05 --img_resize_size 256
# 4) 复杂场景 按 alarmclock
python preprocess_aloha.py \
--dataset_path /data1/[用户名]/project/RoboTwin/data/click_alarmclock_double/demo_clean/data \
--out_base_dir $(pwd)/training_data/openvla_click_alarmclock_double_demo_clean \
--instruction_dir /data1/[用户名]/project/RoboTwin/data/click_alarmclock_double/demo_clean/instructions \
--percent_val 0.05 --img_resize_size 256
得到 4 个目录,每个含 train/、val/ 与 episode_*.hdf5。
合并为 200 条 :在 policy/openvla-oft 下执行(先完成上述 4 次 preprocess):
cd ~/RoboTwin/policy/openvla-oft
M=training_data/openvla_click_bell_and_alarmclock_200
mkdir -p $M/train $M/val
# 1) 单场景 bell
cp training_data/openvla_click_bell_sim_demo_clean/train/*.hdf5 $M/train/
cp training_data/openvla_click_bell_sim_demo_clean/val/*.hdf5 $M/val/
# 2) 单场景 alarmclock(加前缀防重名)
for f in training_data/openvla_click_alarmclock_demo_clean/train/*.hdf5; do cp "$f" "$M/train/alarm_$(basename $f)"; done
for f in training_data/openvla_click_alarmclock_demo_clean/val/*.hdf5; do cp "$f" "$M/val/alarm_$(basename $f)"; done
# 3) 复杂场景 按 bell
for f in training_data/openvla_click_bell_double_demo_clean/train/*.hdf5; do cp "$f" "$M/train/bell_double_$(basename $f)"; done
for f in training_data/openvla_click_bell_double_demo_clean/val/*.hdf5; do cp "$f" "$M/val/bell_double_$(basename $f)"; done
# 4) 复杂场景 按 alarmclock
for f in training_data/openvla_click_alarmclock_double_demo_clean/train/*.hdf5; do cp "$f" "$M/train/alarm_double_$(basename $f)"; done
for f in training_data/openvla_click_alarmclock_double_demo_clean/val/*.hdf5; do cp "$f" "$M/val/alarm_double_$(basename $f)"; done
# 检查:train 应为 192,val 应为 8
echo "train: $(ls $M/train | wc -l) val: $(ls $M/val | wc -l)"
RLDS builder 的 PREPROCESSED_ROOT 已指向 training_data/openvla_click_bell_and_alarmclock_200(见 datasets/click_bell_alarmclock_builder.py)。
七、步骤 3:合并 200 条并生成 RLDS
-
合并 :见第六节「合并为 200 条」的脚本;合并结果目录为
training_data/openvla_click_bell_and_alarmclock_200/(train 192,val 8)。 -
依赖 :生成 RLDS 前需安装
tensorflow、tensorflow_datasets(若未装):conda activate RoboTwin pip install "tensorflow==2.15.0" "tensorflow_datasets==4.9.3" -
ml_dtypes 兼容 :若运行 builder 时报错
AttributeError: cannot import name 'float8_e3m4' from 'ml_dtypes',请先执行:pip install "ml_dtypes>=0.5.0"再重新运行下面的「生成 RLDS」命令。
-
生成 RLDS (在
policy/openvla-oft下,TFDS 输出放在本目录下):cd ~/RoboTwin/policy/openvla-oft
conda activate RoboTwin若曾报错 float8_e3m4,先执行: pip install "ml_dtypes>=0.5.0" --upgrade --no-deps
export TFDS_DATA_DIR=(pwd)/tensorflow_datasets mkdir -p TFDS_DATA_DIR
python -m datasets.click_bell_alarmclock_builder -
**export TFDS_DATA_DIR=$(pwd)/tensorflow_datasets说明 **:TensorFlow Datasets (TFDS) 规定所有通过 builder 生成的数据都写入一个「数据根目录」。该根目录由环境变量**TFDS_DATA_DIR** 指定;若不设置,TFDS 会使用默认的~/tensorflow_datasets。这里显式设为当前项目下的tensorflow_datasets,目的是:① 生成的数据与代码同目录,便于备份与复现;② 训练时--data_root_dir指向同一路径即可读取。builder 运行时会在此目录下创建aloha_click_bell_and_alarmclock/1.0.0/并写入 TFRecord 与元数据。 -
无外网 / 离线环境 :builder 已内置禁用 GCS(
_is_gcs_disabled+try_download_gcs=False),无需访问 Google;直接运行上述命令即可。 -
成功时 :脚本会遍历 train/val 的 hdf5 并写入 TFDS,完成后
policy/openvla-oft/tensorflow_datasets/下会出现对应数据集目录;训练时--data_root_dir即指向该目录(或上级tensorflow_datasets)。 -
与「注册」和「PREPROCESSED_ROOT」的先后顺序 :
- 先做好(代码与数据准备) :在 configs.py / transforms.py / mixtures.py 中已注册数据集名
**aloha_click_bell_and_alarmclock;在**datasets/click_bell_alarmclock_builder.py中 PREPROCESSED_ROOT 已指向**training_data/openvla_click_bell_and_alarmclock_200**。并且需先完成步骤 2 的预处理与合并,确保该目录下已有 train/val 的 hdf5(共 200 条)。 - 再执行 :在
policy/openvla-oft下设置TFDS_DATA_DIR并运行**python -m datasets.click_bell_alarmclock_builder**。此时 builder 从 PREPROCESSED_ROOT 读取 hdf5,按注册的 schema 转成 RLDS,并写入$TFDS_DATA_DIR/aloha_click_bell_and_alarmclock/1.0.0/。 - 训练时 :
--data_root_dir指向tensorflow_datasets,--dataset_name使用已注册的**aloha_click_bell_and_alarmclock**,训练脚本会到 data_root_dir 下按该名字加载上一步生成的 TFDS 数据。总结:注册 + PREPROCESSED_ROOT 与合并数据是前置条件 → 运行 builder 生成 TFDS → 训练读取 TFDS。
- 先做好(代码与数据准备) :在 configs.py / transforms.py / mixtures.py 中已注册数据集名
八、步骤 4:训练(finetune)
8.1 前置条件(首次运行前必做)
-
环境 :
conda activate RoboTwin,且已在policy/openvla-oft下执行过pip install -e . --no-deps。 -
依赖 :训练脚本依赖较多,若直接运行报缺包,请按 附录 A 依次安装;或一次性执行下面一坨(与附录中问题对应):
conda activate RoboTwin
cd ~/RoboTwin/policy/openvla-oft
pip install "accelerate>=0.25.0" "peft==0.11.1"
pip install git+https://github.com/moojink/transformers-openvla-oft.git
pip install json-numpy jsonlines timm sentencepiece uvicorn diffusers
pip install "ml_dtypes>=0.5.0" --upgrade --no-deps
pip install git+https://github.com/moojink/dlimp_openvla.git
pip install "ml_dtypes>=0.5.0" --upgrade --no-deps -
环境变量 :脚本默认在线模式 ,使用当前用户的 HF 缓存
**$HOME/huggingface_cache**(无需再设HF_HOME),通过反向 SSH 代理访问 Hugging Face;未配置 wandb 时脚本内已设WANDB_MODE=disabled。若需完全离线,见 8.6。
8.2 实际使用的脚本与参数
- 训练入口 :本流程实际运行 的是项目内的
**finetune_click_bell_alarmclock.sh**,不再手敲一长串torchrun ...。脚本内已写死:--data_root_dir为$(pwd)/tensorflow_datasets--run_root_dir为/data1/[用户名]/openvla_checkpoints/click_bell_alarmclock_200--dataset_name aloha_click_bell_and_alarmclock--nproc-per-node 4(4 张卡);若你只用 2 张卡,需把脚本里的4改为2,并设置CUDA_VISIBLE_DEVICES为 2 个卡号。
- GPU 与卡数 :训练前用
nvidia-smi确认有空闲 GPU 。通过**CUDA_VISIBLE_DEVICES** 指定使用的卡号;**--nproc-per-node必须等于可见 GPU 个数 **。脚本内当前为export CUDA_VISIBLE_DEVICES=4,5,6,7与--nproc-per-node 4,复现时请按本机空闲卡修改(例如改为0,1且nproc-per-node 2)。单卡 / 双卡 5090 可用run_finetune_click_bell_alarmclock_5090.sh、run_finetune_click_bell_alarmclock_2x5090.sh(见脚本内注释)。
8.3 复现:从零到启动训练
默认在线 :脚本会使用当前用户目录 $HOME/huggingface_cache 作为 HF 缓存,并自动设代理 127.0.0.1:8080、检查能否访问 Hugging Face。需先在本机建立反向 SSH 隧道(见 8.6 方式一),再在服务器执行下面命令。
以下命令按顺序执行即可复现 (路径假设为 ~/RoboTwin 与 ~/RoboTwin/policy/openvla-oft;若不同请替换)。
cd ~/RoboTwin/policy/openvla-oft
source ~/miniconda3/etc/profile.d/conda.sh
conda activate RoboTwin
# 按本机空闲 GPU 修改,且与脚本内 nproc-per-node 数量一致
export CUDA_VISIBLE_DEVICES=4,5,6,7
bash finetune_click_bell_alarmclock.sh
若希望前台运行并同时落盘日志:
cd ~/RoboTwin/policy/openvla-oft
source ~/miniconda3/etc/profile.d/conda.sh
conda activate RoboTwin
export CUDA_VISIBLE_DEVICES=4,5,6,7
bash finetune_click_bell_alarmclock.sh 2>&1 | tee finetune_click_bell_alarmclock.log
cd /home/[用户名]/RoboTwin/policy/openvla-oft
若希望 SSH 断线后训练不中断(推荐):
cd ~/RoboTwin/policy/openvla-oft
source ~/miniconda3/etc/profile.d/conda.sh
conda activate RoboTwin
export CUDA_VISIBLE_DEVICES=4,5,6,7
nohup bash finetune_click_bell_alarmclock.sh > finetune_click_bell_alarmclock.log 2>&1 &
# 查看日志:tail -f finetune_click_bell_alarmclock.log
8.4 断线后恢复训练
-
若训练被中断,可从最后一次保存的 checkpoint 恢复。checkpoint 目录形如:
/data1/[用户名]/openvla_checkpoints/click_bell_alarmclock_200/<run_id>--<step>_chkpt(例如openvla-7b+aloha_click_bell_and_alarmclock+b4+...--5000_chkpt)。 -
实际恢复命令 (使用项目内
resume_finetune_click_bell_alarmclock.sh):先查看已有 checkpoint 目录名与步数,再执行:cd ~/RoboTwin/policy/openvla-oft
source ~/miniconda3/etc/profile.d/conda.sh
conda activate RoboTwin
export WANDB_MODE=disabled
ls /data1/[用户名]/openvla_checkpoints/click_bell_alarmclock_200/假设最后一次为 45000 步,目录名为 openvla-7b+aloha_click_bell_and_alarmclock+b4+lr-0.0005+lora-r32+dropout-0.0--image_aug--click_bell_alarm_200--45000_chkpt
bash resume_finetune_click_bell_alarmclock.sh "openvla-7b+aloha_click_bell_and_alarmclock+b4+lr-0.0005+lora-r32+dropout-0.0--image_aug--click_bell_alarm_200--45000_chkpt" 45000 >> finetune_click_bell_alarmclock.log 2>&1
恢复时同样建议加 nohup ... & 或放在 screen 中。
8.4.1 checkpoint 目录权限(多人共用 data1 时)
checkpoint 当前写在 /data1/[用户名]/openvla_checkpoints/click_bell_alarmclock_200/ 。若你以其他用户运行训练且出现 PermissionError: Permission denied,需要目录所属用户(或管理员)在服务器上执行以下之一,给该目录写权限:
方式一:把目录属组改为当前用户并给组写权限(推荐,无需重新登录)
# 目录所属用户或 root 执行
sudo chgrp -R [当前用户名] /data1/[用户名]/openvla_checkpoints
sudo chmod -R g+rwX /data1/[用户名]/openvla_checkpoints
方式二:直接放开该目录的写权限(简单,但任何用户可写)
# 目录所属用户或 root 执行
chmod -R 777 /data1/[用户名]/openvla_checkpoints
执行其一后,当前用户即可在该目录下正常保存新 checkpoint。
8.5 显存与其它说明
- 显存 :正常训练时每卡通常占用 十几 GB 到几十 GB 。若每进程只有约 1.x GB ,多为仍在加载或同卡被其他任务占用,易 OOM,建议独占 GPU 再训。
- 合并 LoRA :训练结束后若需合并权重便于部署:
bash merge_lora.sh(参数见脚本内,指向run_root_dir下对应 checkpoint)。
8.6 网络:在线(代理)与离线
训练入口仅 **finetune_click_bell_alarmclock.sh** 一个脚本。默认在线模式 (用当前用户 $HOME/huggingface_cache + 代理);需离线时 export HF_OFFLINE=1 后运行同一脚本。
方式一:在线 + 反向 SSH 代理(默认)
适用于:服务器不能直连 Hugging Face。脚本会使用代理 127.0.0.1:8080 并检查能否访问 Hugging Face。
步骤 1:在本地笔记本开一个终端 ,建立反向 SSH 通道(本机 7890 → 服务器 8080),保持该终端不关闭:
ssh -N -R 8080:127.0.0.1:7890 [用户名]@[服务器IP]
# 按实际账号与服务器 IP 替换
步骤 2:在服务器上 按 8.3 运行训练即可(脚本内已设代理与 $HOME/huggingface_cache,会先 curl 检查再启动):
cd ~/RoboTwin/policy/openvla-oft
source ~/miniconda3/etc/profile.d/conda.sh
conda activate RoboTwin
export CUDA_VISIBLE_DEVICES=4,5,6,7
bash finetune_click_bell_alarmclock.sh 2>&1 | tee finetune_click_bell_alarmclock.log
# 或后台:nohup bash finetune_click_bell_alarmclock.sh > finetune_click_bell_alarmclock.log 2>&1 &
方式二:纯离线(模型已在 HF 缓存)
适用于:本机已有 openvla-7b 完整缓存,不想走代理、完全离线训练。
离线训练 :设 HF_OFFLINE=1 后运行同一脚本;脚本会设 HF_HUB_OFFLINE=1、TRANSFORMERS_OFFLINE=1 并从 $HF_HOME(默认 $HOME/huggingface_cache)或 OPENVLA_7B_LOCAL_PATH 解析本地模型路径。
cd ~/RoboTwin/policy/openvla-oft
source ~/miniconda3/etc/profile.d/conda.sh
conda activate RoboTwin
export HF_OFFLINE=1
# 若模型不在默认缓存,指定:export OPENVLA_7B_LOCAL_PATH=/path/to/openvla-7b
export CUDA_VISIBLE_DEVICES=4,5,6,7
bash finetune_click_bell_alarmclock.sh 2>&1 | tee finetune_click_bell_alarmclock.log
若仍报「找不到 local cache」,需用方式一 通过代理先下载,或使用方式三在别处下载后拷到服务器。
方式三:完全离线(在能联网的机器下载,再拷到服务器)
适用于:服务器尽量不联网,你可以在笔记本或另一台有网的机器上下载好 openvla-7b,再把整份目录拷到服务器使用。
步骤 1:在能联网的电脑上 下载完整模型到某个目录(该目录内需包含 config.json、model-00001-of-00003.safetensors、model-00002-of-00003.safetensors、model-00003-of-00003.safetensors 以及 tokenizer 等文件)。
用 Python(推荐,目录结构完整):
pip install huggingface_hub
python -c "
from huggingface_hub import snapshot_download
snapshot_download('openvla/openvla-7b', local_dir='./openvla-7b', local_dir_use_symlinks=False)
print('下载完成,目录: ./openvla-7b')
"
或用命令行(需先 pip install huggingface_hub):
huggingface-cli download openvla/openvla-7b --local-dir ./openvla-7b
步骤 2:把整个 openvla-7b 目录拷到服务器 ,例如放到 $HOME/openvla-7b(或你指定的路径)。传输方式任选:scp、rsync、U 盘等。
# 示例:在笔记本上执行,把当前目录下的 openvla-7b 拷到服务器
scp -r ./openvla-7b [用户名]@[服务器IP]:~/
# 若服务器上 ~/openvla-7b 已存在,脚本离线时会自动使用
步骤 3:在服务器上 指定该目录并启动训练。脚本会优先使用 OPENVLA_7B_LOCAL_PATH;若放在默认路径 $HOME/openvla-7b,脚本也会自动识别。
cd ~/RoboTwin/policy/openvla-oft
source ~/miniconda3/etc/profile.d/conda.sh
conda activate RoboTwin
export HF_OFFLINE=1
# 若拷到其他路径,设置:export OPENVLA_7B_LOCAL_PATH=/path/to/openvla-7b
export CUDA_VISIBLE_DEVICES=4,5,6,7
bash finetune_click_bell_alarmclock.sh 2>&1 | tee finetune_click_bell_alarmclock.log
目录是否完整 :在服务器上 ls 该目录,应能看到 config.json、model-00001-of-00003.safetensors 等;若缺少权重文件,训练会报错。
九、步骤 5:评测(eval.sh)
- eval.sh 位于
**~/RoboTwin/policy/openvla-oft/eval.sh**,执行时会cd ../..到 RoboTwin 根目录再调用script/eval_policy.py,故需在 RoboTwin 根目录 存在script/eval_policy.py及对应 task 配置。 - 参数含义 :
eval.sh <task_name> <task_config> <checkpoint_path> <seed> <gpu_id> <unnorm_key>;unnorm_key 必须与注册数据集名一致,即**aloha_click_bell_and_alarmclock**。
实际运行命令 (将 <checkpoint_path> 换为真实路径,如某次保存的 *--5000_chkpt 或 merge 后的目录):
cd ~/RoboTwin/policy/openvla-oft
bash eval.sh click_bell demo_clean <checkpoint_path> 0 0 aloha_click_bell_and_alarmclock
示例(checkpoint 为 40000 步、已合并后的目录,存放在 data1 上):
cd ~/RoboTwin/policy/openvla-oft
bash eval.sh click_bell_complex demo_clean "/data1/[用户名]/openvla_checkpoints/click_bell_alarmclock_200/openvla-7b+aloha_click_bell_and_alarmclock+b4+lr-0.0005+lora-r32+dropout-0.0--image_aug--click_bell_alarm_200--40000_merged" 0 4 aloha_click_bell_and_alarmclock
<task_name>/<task_config>可按你要评测的 RoboTwin 任务修改(如click_alarmclock、demo_clean等)。- 评测结果(含视频)在 RoboTwin 项目根目录 的
eval_result/下。
十、本流程涉及路径汇总(便于修改时同步更新)
表格
| 用途 | 路径 |
|---|---|
| 合并后 200 条预处理数据 | policy/openvla-oft/training_data/openvla_click_bell_and_alarmclock_200/ |
| TFDS 输出目录 | policy/openvla-oft/tensorflow_datasets/ |
| 训练 checkpoint 输出 | /data1/[用户名]/openvla_checkpoints/click_bell_alarmclock_200/ |
| 训练入口脚本(步骤 4 实际执行) | policy/openvla-oft/finetune_click_bell_alarmclock.sh |
| 恢复训练脚本 | policy/openvla-oft/resume_finetune_click_bell_alarmclock.sh |
| 评测脚本 | policy/openvla-oft/eval.sh(在 openvla-oft 下执行,会 cd 到 RoboTwin 根目录) |
| RLDS 数据集名(config/transforms/mixtures 与 --dataset_name) | aloha_click_bell_and_alarmclock |
| OpenVLA-7b 缓存(HF_HOME,默认在线) | $HOME/huggingface_cache(脚本默认,当前用户可写) |
附录 A:Finetune OpenVLA-oft 过程与问题排查
本节记录在实际跑通 步骤 4(训练) 时遇到的问题及解决办法,便于复现或排错。
A.1 环境与入口
- 使用 conda 环境 RoboTwin ,在
**~/RoboTwin/policy/openvla-oft** 下执行训练。 - 实际运行的是
**bash finetune_click_bell_alarmclock.sh**(脚本内调用torchrun ... vla-scripts/finetune.py),不是手敲一长串torchrun。脚本路径、--data_root_dir、--run_root_dir、--dataset_name等均与第八节、第十节一致。
A.2 依赖缺失与解决顺序
安装 openvla-oft 时若使用 pip install -e . --no-deps,很多运行时依赖未装,直接运行会报 ModuleNotFoundError 或 ImportError。按下面顺序处理即可。
| 序号 | 报错信息 | 原因 | 解决办法 |
|---|---|---|---|
| 1 | ModuleNotFoundError: No module named 'accelerate' |
未装 accelerate | pip install "accelerate>=0.25.0" |
| 2 | ModuleNotFoundError: No module named 'peft' |
未装 peft | pip install "peft==0.11.1" |
| 3 | ImportError: cannot import name 'AutoModelForVision2Seq' from 'transformers' |
官方 transformers 无该类 | pip install git+https://github.com/moojink/transformers-openvla-oft.git |
| 4 | ModuleNotFoundError: No module named 'json_numpy' |
未装 json_numpy 等 | pip install json-numpy jsonlines timm sentencepiece uvicorn diffusers |
| 5 | ModuleNotFoundError: No module named 'dlimp' |
未装 dlimp_openvla | pip install git+https://github.com/moojink/dlimp_openvla.git |
| 6 | AttributeError: cannot import name 'float8_e3m4' from 'ml_dtypes' |
安装 dlimp 时把 ml_dtypes 降级到 0.2.0,与 jax 不兼容 | pip install "ml_dtypes>=0.5.0" --upgrade --no-deps(在安装 dlimp 之后再执行一次) |
| 7 | ModuleNotFoundError: No module named 'tensorflow_graphics' |
configs 加载时会 import droid_utils,而 droid_utils 顶层 import 了 tensorflow_graphics(仅 DROID 用) | 已改代码:在 **prismatic/vla/datasets/rlds/oxe/utils/droid_utils.py** 中把 import tensorflow_graphics.geometry.transformation as tfg 改为惰性导入(在用到 tfg 的函数内部再 import),这样加载 ALOHA 数据集时不会触发该依赖。若你未改过代码,需做此修改或安装 tensorflow_graphics。 |
| 8 | wandb.errors.errors.UsageError: No API key configured |
未配置 wandb | 在 **finetune_click_bell_alarmclock.sh** 中已增加 export WANDB_MODE=disabled;或在运行前执行 export WANDB_MODE=disabled。 |
| 9 | Network is unreachable / couldn't find the requested files in the local cache(加载 openvla/openvla-7b 时) |
服务器无法访问 Hugging Face,且本地 HF 缓存无该模型 | 在线 :先在本机建隧道 ssh -N -R 8080:127.0.0.1:7890 用户@服务器,再在服务器运行 bash finetune_click_bell_alarmclock.sh(脚本内已设代理与 $HOME/huggingface_cache,见 8.6)。离线 :export HF_OFFLINE=1 并设 OPENVLA_7B_LOCAL_PATH 或把模型放到 $HOME/openvla-7b 后运行同一脚本。 |
| 10 | NotImplementedError: TIMM Version must be >= 0.9.10 and < 1.0.0 (breaking) |
当前安装的 timm 为 1.x,而 modeling_prismatic 只支持 0.9.10 / 0.9.11 / 0.9.12 / 0.9.16 | pip install "timm==0.9.12"(或 0.9.10 / 0.9.11 / 0.9.16 之一)。pyproject.toml 中约定为 timm==0.9.10,若之前装过其他版本被升级,需显式降级。 |
A.3 一次性依赖安装命令(复现用)
在 conda activate RoboTwin 且 cd ~/RoboTwin/policy/openvla-oft 后,可一次性执行(若某步报错再按上表单独处理):
pip install "accelerate>=0.25.0" "peft==0.11.1"
pip install git+https://github.com/moojink/transformers-openvla-oft.git
pip install json-numpy jsonlines "timm==0.9.12" sentencepiece uvicorn diffusers
pip install "ml_dtypes>=0.5.0" --upgrade --no-deps
pip install git+https://github.com/moojink/dlimp_openvla.git
pip install "ml_dtypes>=0.5.0" --upgrade --no-deps
A.4 代码修改汇总(与官方 / 原始仓库的差异)
- droid_utils.py :
tensorflow_graphics改为惰性导入,避免在仅使用 ALOHA 数据时依赖 tensorflow_graphics(见 A.2 表第 7 条)。 - finetune_click_bell_alarmclock.sh :增加
export WANDB_MODE=disabled,避免未配置 wandb 时报错(见 A.2 表第 8 条)。 - datasets/click_bell_alarmclock_builder.py :生成 RLDS 时设置
tfds_gcs._is_gcs_disabled = True和DownloadConfig(try_download_gcs=False),避免无外网时访问 GCS 卡住。
以上修改均已在当前仓库中,按本文档复现时无需再改。
A.5 实际运行命令小结
- 首次训练 :先建反向隧道(8.6 方式一),再
cd ~/RoboTwin/policy/openvla-oft→conda activate RoboTwin→ 设置CUDA_VISIBLE_DEVICES→bash finetune_click_bell_alarmclock.sh(或加nohup ... &/tee见 8.3)。脚本默认在线、HF 缓存为$HOME/huggingface_cache。 - 恢复训练 :使用
resume_finetune_click_bell_alarmclock.sh,传入 checkpoint 目录名与步数(见 8.4)。