RoboTwin2.0中训练OpenVLA-oft 全流程(bell + alarmclock)

维护说明:每次调整数据来源、路径、脚本或训练参数时,请同步更新本文档。


一、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_actor bell 和 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_bellhmr_complex_bell),决定场景里有什么物体、成功判谁。
  • task_config :选哪份 yml,决定例如:
    • episode_num:采多少条(如 50);
    • save_path :数据写到哪(如 ./data,即 data/<task_name>/<task_config>/);
    • cameradomain_randomizationlanguage_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_bellclick_alarmclock)。
  • 复杂场景 :task_name 用「两物体」的 env;若本机还没有,需从旧项目拷贝或参考《实验场景设置》在 envs/ 里改出(例如 hmr_complex_bellhmr_complex_alarmclock,或自建 click_bell_doubleclick_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/*.hdf5instructions/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 前需安装 tensorflowtensorflow_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」的先后顺序

    1. 先做好(代码与数据准备) :在 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 条)。
    2. 再执行 :在 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/
    3. 训练时--data_root_dir 指向 tensorflow_datasets--dataset_name 使用已注册的 **aloha_click_bell_and_alarmclock**,训练脚本会到 data_root_dir 下按该名字加载上一步生成的 TFDS 数据。总结:注册 + PREPROCESSED_ROOT 与合并数据是前置条件 → 运行 builder 生成 TFDS → 训练读取 TFDS

八、步骤 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,1nproc-per-node 2)。单卡 / 双卡 5090 可用 run_finetune_click_bell_alarmclock_5090.shrun_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=1TRANSFORMERS_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.jsonmodel-00001-of-00003.safetensorsmodel-00002-of-00003.safetensorsmodel-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(或你指定的路径)。传输方式任选:scprsync、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.jsonmodel-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_alarmclockdemo_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,很多运行时依赖未装,直接运行会报 ModuleNotFoundErrorImportError。按下面顺序处理即可。

序号 报错信息 原因 解决办法
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 RoboTwincd ~/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.pytensorflow_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 = TrueDownloadConfig(try_download_gcs=False),避免无外网时访问 GCS 卡住。

以上修改均已在当前仓库中,按本文档复现时无需再改。

A.5 实际运行命令小结

  • 首次训练 :先建反向隧道(8.6 方式一),再 cd ~/RoboTwin/policy/openvla-oftconda activate RoboTwin → 设置 CUDA_VISIBLE_DEVICESbash finetune_click_bell_alarmclock.sh(或加 nohup ... & / tee 见 8.3)。脚本默认在线、HF 缓存为 $HOME/huggingface_cache
  • 恢复训练 :使用 resume_finetune_click_bell_alarmclock.sh,传入 checkpoint 目录名与步数(见 8.4)。
相关推荐
穿过锁扣的风2 小时前
OpenCV 入门实战:图片与视频处理零基础教程
人工智能·opencv·计算机视觉
沪漂阿龙2 小时前
智能体:给大语言模型装上“手脚”,让它学会使用工具
人工智能·语言模型·自然语言处理
无心水2 小时前
【OpenClaw:认知启蒙】3、OpenClaw Agent执行循环(Lobster)深度拆解:从意图识别到工具调用的全流程
java·人工智能·系统架构·自动化
Daydream.V2 小时前
Opencv——轮廓有关操作
人工智能·opencv·计算机视觉
weiyvyy2 小时前
机器人数学基础补充
人工智能·决策树·机器学习·机器人·嵌入式软件开发·机器人嵌入式开发
一知半解仙2 小时前
AI加持下的IDEA让Java开发更高效
java·人工智能·intellij-idea
2401_865854882 小时前
腾讯云龙虾大模型API配置:一键解锁AI算力,赋能业务高效升级
大数据·人工智能·腾讯云
justtoomuchforyou2 小时前
deepseek- 上千种类别如何image classification
python
IT_陈寒2 小时前
JavaScript性能翻倍的5个隐藏技巧,90%的开发者都不知道!
前端·人工智能·后端