OpenVLA-OFT+ 在真实世界 ALOHA 机器人任务中的应用
相关文件
评估
experiments/robot/aloha/:ALOHA 训练和评估文件run_aloha_eval.py:ALOHA 评估脚本(客户端;见下文 “服务器端”)aloha_utils.py:ALOHA 评估工具- 从原始 ALOHA GitHub 仓库 复制的其他 ALOHA 机器人环境文件:
constants.pyreal_env.pyrobot_utils.py
experiments/robot/:通用评估工具文件openvla_utils.py:OpenVLA 特定的评估工具robot_utils.py:其他评估工具
vla-scripts/deploy.py:VLA 服务器部署脚本(服务器端)
注意:与 LIBERO 评估设置不同,这里我们使用服务器 - 客户端接口。如果用户用于控制机器人的机器无法访问具有足够规格的本地 GPU 来运行微调后的 VLA 策略,这将特别有用。
训练
experiments/robot/aloha/:ALOHA 训练和评估文件preprocess_split_aloha_data.py:ALOHA 数据预处理脚本
vla-scripts/finetune.py:VLA 微调脚本
设置
为训练策略和在 VLA 服务器上部署它们设置一个 conda 环境(参见 SETUP.md 中的说明)。
在 ALOHA 机器人数据上进行微调
我们假设您已经收集了一组关于 ALOHA 机器人的专家演示。
首先,使用我们的 preprocess_split_aloha_data.py 脚本预处理原始 ALOHA 数据集:将图像从 480x640 缩小到 256x256,并分割为训练集和验证集。以下是我们论文中 “将 X 放入锅中” 任务的示例(每个情节有 3 个可能的目标对象):
python experiments/robot/aloha/preprocess_split_aloha_data.py \--dataset_path /scr/moojink/data/aloha1_raw/put_green_pepper_into_pot/ \--out_base_dir /scr/moojink/data/aloha1_preprocessed/ \--percent_val 0.05
python experiments/robot/aloha/preprocess_split_aloha_data.py \--dataset_path /scr/moojink/data/aloha1_raw/put_red_pepper_into_pot/ \--out_base_dir /scr/moojink/data/aloha1_preprocessed/ \--percent_val 0.05
python experiments/robot/aloha/preprocess_split_aloha_data.py \--dataset_path /scr/moojink/data/aloha1_raw/put_yellow_corn_into_pot/ \--out_base_dir /scr/moojink/data/aloha1_preprocessed/ \--percent_val 0.05
然后,将预处理后的 ALOHA 数据集转换为与 OpenVLA 微调兼容的单个 RLDS 数据集。此过程与原始 OpenVLA 仓库中的过程相同。有关转换为 RLDS 的说明,请参见 此处(示例 ALOHA 预处理到 RLDS 的转换脚本可在 此处 获得;该脚本将上述三个预处理数据集转换为一个统一的 RLDS 数据集,并包含训练 / 验证拆分)。
转换为 RLDS 后,通过在 configs.py(此处)、transforms.py(此处)和 mixtures.py(此处)中为其添加条目,将数据集(对于上面的示例任务,称为 aloha1_put_X_into_pot_300_demos)注册到我们的数据加载器。作为参考,在每个这些文件中,都有我们在论文中使用的 ALOHA 数据集的示例条目。
微调之前,在 prismatic/vla/constants.py 中设置所需的 ALOHA 动作块大小(参见 ALOHA_CONSTANTS 中的 NUM_ACTIONS_CHUNK)。我们默认将其设置为 25,因为在 ALOHA 设置中,我们使用 25 Hz 的控制频率以降低存储成本和训练时间(同时仍保持机器人运动的平滑性)。如果您使用 50 Hz,我们建议将 NUM_ACTIONS_CHUNK 设置为 50。一般来说,1 秒长的动作块是一个不错的默认值。不要修改 ACTION_PROPRIO_NORMALIZATION_TYPE:由于 ALOHA 机器人动作空间是绝对关节角度,我们不希望使用会剪辑异常值的归一化方案(例如我们在 LIBERO 中用于相对末端执行器姿态动作的 Q1-Q99 归一化),因为这会阻止模型输出某些对解决任务至关重要的机器人关节角度。
现在开始微调!以下是使用我们的 OFT+ 方法在上面的 “将 X 放入锅中” 任务上微调 OpenVLA 的示例命令(“OFT+” 中的 “+” 表示包含 FiLM 以增强语言接地)。将第一行中的 X 替换为您可用的 GPU 数量。
torchrun --standalone --nnodes 1 --nproc-per-node X vla-scripts/finetune.py \--vla_path openvla/openvla-7b \--data_root_dir /PATH/TO/RLDS/DATASETS/DIR/ \--dataset_name aloha1_put_X_into_pot_300_demos \--run_root_dir /YOUR/CHECKPOINTS/AND/LOG/DIR/ \--use_l1_regression True \--use_diffusion False \--use_film True \--num_images_in_input 3 \--use_proprio True \--batch_size 4 \--learning_rate 5e-4 \--num_steps_before_decay 50000 \--max_steps 100005 \--use_val_set True \--val_freq 10000 \--save_freq 10000 \--save_latest_checkpoint_only False \--image_aug True \--lora_rank 32 \--wandb_entity "YOUR_WANDB_ENTITY" \--wandb_project "YOUR_WANDB_PROJECT" \--run_id_note parallel_dec--25_acts_chunk--continuous_acts--L1_regression--3rd_person_img--left_right_wrist_imgs--proprio_state--film
如果 X = 8 并且评估 100K 步 checkpoint,上述训练命令应该能复现我们在 “将 X 放入锅中” 任务上的 OpenVLA-OFT+ 结果。它将使用 3 个输入图像(1 个第三人称图像 + 2 个手腕相机图像)微调 OpenVLA。请注意,我们在某个时间点(上面的命令中是 50K 步)后使用学习率衰减,因为这样做可以加快训练收敛(根据我们的经验,训练 L1 损失会大幅下降)。
微调的最佳实践:
- 一般来说,我们建议微调直到训练 L1 损失低于 0.01 并开始趋于稳定。
- 实现这一点的一种方法是使用我们默认的学习率
5e-4进行微调,直到损失开始非常缓慢地下降,然后将学习率衰减 10 倍至5e-5(这应该会使损失大幅下降),并训练直到训练 L1 损失最终趋于稳定。
- 实现这一点的一种方法是使用我们默认的学习率
- 根据您的数据集大小,您可能需要调整一些超参数。例如,如果您使用包含超过 300 个演示的大型数据集,您可能需要稍后衰减学习率并训练更长时间以获得最佳性能。过早衰减可能会导致次优策略。
- 如果您的任务不需要良好的语言接地(例如,如果只有一个语言指令),则 FiLM 不是必需的;考虑设置
--use_film False来训练更少的模型参数。 - 请确保使用训练时使用的相同设备 / GPU 测试您的策略!否则,性能可能会大幅下降。如果您在用于测试的下游设备上(例如,在 H100 上训练,然后在 A100 上合并后在 A100 上测试)将 LoRA 权重合并到基础模型中,您可能能够避免性能下降。您可以查看我们的脚本 vla-scripts/merge_lora_weights_and_save.py 以离线将 LoRA 适配器合并到基础模型中。如果您在微调期间已经将 LoRA 权重合并到基础 OpenVLA 模型中也没关系;只要您仍然拥有 LoRA 适配器,您总是可以重新下载基础模型并再次合并(
merge_lora_weights_and_save.py将为您处理此问题)。
如果您遇到任何问题,请打开一个新的 GitHub 问题。
启动 ALOHA 机器人评估
在您将用于启动 VLA 服务器的主要 conda 环境(openvla-oft)中,安装一些用于服务器 - 客户端接口的包:
conda activate openvla-oft
pip install uvicorn fastapi json-numpy
在您将用于控制机器人的机器上,设置第二个 conda 环境,该环境将用于运行机器人环境、查询 VLA 服务器并在环境中执行动作:
# 创建并激活客户端 conda 环境
conda create -n openvla-oft-aloha python=3.10 -y
conda activate openvla-oft-aloha# 安装 PyTorch
# 使用特定于您机器的命令:https://pytorch.org/get-started/locally/
pip3 install torch torchvision torchaudio# 克隆 openvla-oft 仓库并通过 pip 安装以下载依赖项
git clone https://github.com/moojink/openvla-oft.git
cd openvla-oft
pip install -e .# 安装 ALOHA 机器人环境所需的包
pip install -r experiments/robot/aloha/requirements_aloha.txt
在具有您将用于运行模型推理的 GPU 的机器上启动 VLA 服务器(使用 openvla-oft conda 环境)。以下是为此的示例命令(根据需要更改):
python vla-scripts/deploy.py \--pretrained_checkpoint /PATH/TO/FINETUNED/MODEL/CHECKPOINT/DIR/ \--use_l1_regression True \--use_film True \--num_images_in_input 3 \--use_proprio True \--center_crop True \--unnorm_key aloha1_put_X_into_pot_300_demos
然后,运行 ALOHA 评估脚本。在 vla_server_url 参数中指定 VLA 服务器 URL 或 IP 地址。以下是示例命令:
python experiments/robot/aloha/run_aloha_eval.py \--center_crop True \--num_open_loop_steps 25 \--use_vla_server True \--vla_server_url <VLA 服务器的 URL> \--num_rollouts_planned <测试滚动次数> \--max_steps <每次滚动的最大步数>
如果您遇到任何问题,请打开一个新的 GitHub 问题。
故障排除提示
-
提示 #1:如果您遇到 ROS 错误,例如
ImportError: /lib/x86_64-linux-gnu/libp11-kit.so.0: undefined symbol: ffi_type_pointer, version LIBFFI_BASE_7.0,请尝试在您的客户端 conda 环境(openvla-oft-aloha)中运行以下命令:plaintext
conda install -c conda-forge libffi
