项目文件结构
评估相关:
experiments/robot/aloha/:ALOHA 训练和评估文件,包含run_aloha_eval.py(客户端脚本)、aloha_utils.py及从原始 ALOHA 仓库复制的环境文件(如constants.py,real_env.py)。experiments/robot/:通用评估工具,含 OpenVLA 特定工具openvla_utils.py。vla-scripts/deploy.py:VLA 服务器部署脚本(服务器端)。
注意:与 LIBERO 不同,此处采用服务器 - 客户端接口。若控制机器人的机器缺乏足够 GPU 运行微调后的策略,此架构尤为适用。
训练相关:
experiments/robot/aloha/:数据预处理脚本preprocess_split_aloha_data.py。vla-scripts/finetune.py:VLA 微调脚本。
环境设置
为训练策略及在 VLA 服务器上部署,需配置 conda 环境。建议参考官方 SETUP 文档进行初始化。
数据预处理与微调
假设已收集 ALOHA 专家演示数据。首先使用 preprocess_split_aloha_data.py 预处理原始数据集,将图像从 480x640 缩小至 256x256,并按比例划分训练集与验证集。例如针对'将 X 放入锅中'任务(含多个目标对象),需分别执行预处理命令。
随后,将预处理后的数据转换为 OpenVLA 兼容的 RLDS 格式。转换过程与原仓库一致,完成后需在 configs.py、transforms.py 和 mixtures.py 中注册新数据集(如 aloha1_put_X_into_pot_300_demos)。
微调前,请在 prismatic/vla/constants.py 中确认 ALOHA 动作块大小(NUM_ACTIONS_CHUNK)。默认设为 25(对应 25 Hz 控制频率),若使用 50 Hz 则建议调整为 50。一般 1 秒长的动作块是合理选择。注意不要修改 ACTION_PROPRIO_NORMALIZATION_TYPE,因 ALOHA 动作空间为绝对关节角度,避免使用会裁剪异常值的归一化方案。
开始微调!以下示例展示了使用 OFT+ 方法(含 FiLM 增强语言接地)在'将 X 放入锅中'任务上微调 OpenVLA 的命令。请将第一行中的 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
若使用 8 张 GPU 评估 100K 步 checkpoint,上述命令可复现论文结果。模型将基于 3 个输入图像(1 个第三人称 + 2 个手腕相机)进行微调。经验表明,在 50K 步后衰减学习率有助于加快收敛,此时 L1 损失通常大幅下降。
微调最佳实践:
- 建议微调至训练 L1 损失低于 0.01 并趋于稳定。若下降缓慢,可将学习率从
5e-4衰减 10 倍至5e-5,继续训练直至稳定。 - 根据数据集规模调整超参数。大数据集可能需要更晚衰减学习率并延长训练时间,过早衰减可能导致次优策略。
- 若任务无需强语言接地(如仅单条指令),可设置
--use_film False以减少参数量。 - 测试策略时务必使用与训练相同的设备/GPU,否则性能可能大幅下降。若跨设备测试(如 H100 训练转 A100 测试),建议先合并 LoRA 权重。可使用
vla-scripts/merge_lora_weights_and_save.py离线合并适配器。
启动 ALOHA 机器人评估
在用于启动 VLA 服务器的 conda 环境(openvla-oft)中安装服务器端依赖:
conda activate openvla-oft
pip install uvicorn fastapi json-numpy
在控制机器人的机器上设置第二个 conda 环境(openvla-oft-aloha),用于运行机器人环境及查询 VLA 服务器:
# 创建并激活客户端环境
conda create -n openvla-oft-aloha python=3.10 -y
conda activate openvla-oft-aloha
# 安装 PyTorch(按官方指南选择版本)
pip3 install torch torchvision torchaudio
# 克隆仓库并安装依赖
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 服务器:
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
随后运行评估脚本,指定 VLA 服务器 URL:
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 <每次滚动的最大步数>
故障排除提示
若遇到 ROS 错误(如 ImportError: ... undefined symbol: ffi_type_pointer...),可在客户端环境中尝试修复:
conda install -c conda-forge libffi
