介绍
OpenVLA(github.com/openvla/ope...)是一个开源的视觉 - 语言 - 行动(VLA)模型,训练自 Prismatic VLM(基于融合的 DINOv2 和 SigLIP 视觉主干,以及 Llama-2 LLM)。它旨在通过借助视觉语言模型直接生成机器人可以执行的控制命令,支持开箱即用。
LIBERO(github.com/Lifelong-Ro...)是一个全新的机器人持续学习环境,旨在为机器人操作任务的持续学习提供一个标准化的基准平台。它被设计用来帮助研究人员解耦和分析在机器人持续学习过程中各种因素的影响,例如持续学习算法、网络架构、任务顺序、任务空间变化、目标变化、物体变化等。因此,LIBERO特别设计了可供实验的任务集合,包括LIBERO-SPATIAL、LIBERO-OBJECT、LIBERO-GOAL、LIBERO-LONG等,覆盖了不同类型的任务变化:
- LIBERO-Spatial 由同一组对象组成,但布局不同,并测试模型对空间关系的理解。
- LIBERO-Object 由相同的场景布局但不同的对象组成,并测试模型对对象类型的理解。
- LIBERO-Goal 由相同的对象和布局组成,但任务目标不同,并测试模型对不同面向任务的行为的了解。
- LIBERO-Long 由具有不同对象、布局和任务的长范围任务组成。
复现
依照openVLA在github上的指导步骤:
-
克隆仓库
a. 克隆openvla仓库:
bash# 创建新的conda环境 conda create -n openvla python=3.10 -y conda activate openvla # 安装pytorch. 以下命令只是一个样例,具体的版本要根据这个链接去下载适合你电脑配置的: # https://pytorch.org/get-started/locally/ conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia -y # 克隆openvla git clone https://github.com/openvla/openvla.git cd openvla pip install -e . # 安装 Flash Attention 2 # 如果遇到困难先输入`pip cache remove flash_attn` pip install packaging ninja ninja --version; echo $? # Verify Ninja --> should return exit code "0" pip install "flash-attn==2.5.5" --no-build-isolation
b. 在openvla同级目录下克隆libero仓库:
bashgit clone https://github.com/Lifelong-Robot-Learning/LIBERO.git cd LIBERO pip install -e .
PS:仓库较大,如果克隆慢可以尝试以下方式:git clone报错RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL (err 8)_not closed cleanly: cancel (err 8) 2549 bytes of b-CSDN博客以及评论区评论区
git config --global http.postBuffer 157286400+
安装其他必须的软件包:
bashcd openvla pip install -r experiments/robot/libero/libero_requirements.txt
评估的时候切换到
openvla
目录下。openvla在四个 LIBERO 任务套件上独立微调了模型:LIBERO-Spatial、LIBERO-Object、LIBERO-Goal 和 LIBERO-10(也称为 LIBERO-Long)。 Hugging Face 上提供四个检查点:- openvla/openvla-7b-finetuned-libero-spatial
- openvla/openvla-7b-finetuned-libero-对象
- openvla/openvla-7b-微调-libero-goal
- openvla/openvla-7b-微调-libero-10
要使用其中一个检查点开始评估,请运行以下命令之一。
css# Launch LIBERO-Spatial evals python experiments/robot/libero/run_libero_eval.py \ --model_family openvla \ --pretrained_checkpoint openvla/openvla-7b-finetuned-libero-spatial \ --task_suite_name libero_spatial \ --center_crop True # Launch LIBERO-Object evals python experiments/robot/libero/run_libero_eval.py \ --model_family openvla \ --pretrained_checkpoint openvla/openvla-7b-finetuned-libero-object \ --task_suite_name libero_object \ --center_crop True # Launch LIBERO-Goal evals python experiments/robot/libero/run_libero_eval.py \ --model_family openvla \ --pretrained_checkpoint openvla/openvla-7b-finetuned-libero-goal \ --task_suite_name libero_goal \ --center_crop True # Launch LIBERO-10 (LIBERO-Long) evals python experiments/robot/libero/run_libero_eval.py \ --model_family openvla \ --pretrained_checkpoint openvla/openvla-7b-finetuned-libero-10 \ --task_suite_name libero_10 \ --center_crop True
接下来讲一讲可能出现的报错。
-
pytorch版本对应
出现类似报错
undefined symbol: __nvJitLinkComplete_12_4, version libnvJitLink.so.12
是cuda版本不对应,可以通过
nvcc --version
检查cuda版本,并安装对应的pytorch -
找不到模块错误
出现
ModuleNotFoundError: No module named 'experiments'
可以在引入的地方加上sys.path.append("../..")
换绝对路径 -
其他还有一些跟着报错去安装就好
-
服务器连接差连不上huggingface
可以改成本地下载传上服务器,在
openvla/experiments/robot/openvla_utils.py
改get_vla(cfg)
和get_processor(cfg)
函数,传参传本地路径:pythondef get_vla(cfg): // ... vla = AutoModelForVision2Seq.from_pretrained( cfg.pretrained_checkpoint, local_files_only=True #attn_implementation="flash_attention_2", #torch_dtype=torch.bfloat16, #load_in_8bit=cfg.load_in_8bit, #load_in_4bit=cfg.load_in_4bit, #low_cpu_mem_usage=True, #trust_remote_code=True, ) // ... // ... def get_processor(cfg): """Get VLA model's Hugging Face processor.""" processor = AutoProcessor.from_pretrained( cfg.pretrained_checkpoint, local_files_only=True, # trust_remote_code=True ) return processor
同时运行命令也要改成本地模型,
--pretrained_checkpoint
改成保存的模型本地路径:csspython experiments/robot/libero/run_libero_eval.py --model_family openvla --pretrained_checkpoint openvla-7b-finetuned-libero-spatial --task_suite_name libero_spatial --center_crop True
-
报错cuda内存不够
initorch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 39.39 GiB total capacity; 1.92 GiB already allocated; 15.25 MiB free; 1.98 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
参考(超全方法)尝试解决问题:torch.cuda.OutOfMemoryError: CUDA out of memory.-CSDN博客,我使用了改cuda索引的方法,把"openvla/experiments/robot"下的
openvla_utils.py
和robot_utils.py
里的DEVICE = torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu")
改为cuda:1(或其他空闲gpu)PS:如果用ctrlz暂停程序,再次运行也有概率报cuda内存不够的错,因为ctrlz只是挂起了任务,这个任务消耗的资源很大。还需要用
jobs -l
获取pid,用kill -9 pid
去中止程序 -
没导入数据集
markdown[Warning]: datasets path **/LIBERO/libero/libero/../datasets does not exist!
查询github上说明了他们对libero的数据集做了微调(论文里的附录E写了2406.09246)。在huggingface上下载下来openvla/modified_libero_rlds at main
在openvla的libero文件夹里有一个生成数据集的程序
"openvla/experiments/robot/libero/regenerate_libero_dataset.py
,具体做的是对libero的原始数据集进行一些调整然后产生新的数据集。在程序前几行的注释中有使用说明,他说这个程序的运行方式如下,是为了生成专属的libero任务套件的数据集,命令行参数包括套件名称、原数据目录、目标数据目录。由于我们在huggingface下载的已经是微调后的,放在LIBERO/libero/datasets/libero_spatial_no_noops
里即可。bashExample (LIBERO-Spatial): python experiments/robot/libero/regenerate_libero_dataset.py \ --libero_task_suite libero_spatial \ --libero_raw_data_dir ./LIBERO/libero/datasets/libero_spatial \ --libero_target_dir ./LIBERO/libero/datasets/libero_spatial_no_noops
-
类型不匹配报错
bashCaught exception: Input type (c10::BFloat16) and bias type (float) should be the same
在
openvla_utils.py
的get_vla_action
函数改倒数第三行:pythoninputs = processor(prompt, image).to(DEVICE, dtype=torch.float32)# 改为float32
-
openvla/prismatic/extern/hf/modeling_prismatic.py
报错arduinoThe size of tensor a (291) must match the size of tensor b (290) at non-singleton dimension 3
在代码里加入traceback信息,显示是两个张量相加的时候位数不匹配。原因是代码中,如果
input_ids
的最后一个 token 不是29871
,会向input_ids
添加一个新的 token,导致其长度从 290 变为 291。因此我的做法是在程序500多行把最后一个token改成29871而不是增加pythonif not torch.all(input_ids[:, -1] == 29871): #input_ids = torch.cat( # (input_ids, torch.unsqueeze(torch.Tensor([29871]).long(), dim=0).to(input_ids.device)), dim=1 #) input_ids[:, -1] = 29871
-
警告信息:
arduinohuggingface/tokenizers: The current process just got forked, after parallelism has already been used.Disabling parallelism to avoid deadlocks. To disable this warning, you can either: Avoid using tokenizers before the fork if possible Explicitly set the environment variable TOKENIZERS PARALLELISM=(true l false)
这个警告信息是由于 Hugging Face 的
tokenizers
库在多线程或多进程环境中使用时遇到的问题。当一个进程中已经启用了并行处理(parallelism),然后该进程被 fork 时,可能会导致死锁或其他并发问题。可以通过设置环境变量TOKENIZERS_PARALLELISM
来控制是否启用并行处理:luaimport os os.environ["TOKENIZERS_PARALLELISM"] = "false"
-
评估结果
开始评估:
csspython experiments/robot/libero/run_libero_eval.py --model_family openvla --pretrained_checkpoint openvla-7b-finetuned-libero-spatial --task_suite_name libero_spatial --center_crop True
当程序运行的时候,会把日志记录在txt里(在
./experiments/logs
查看),同时输出到终端。每一个任务套件包含10种任务,一个任务尝试50次并生成记录,每个记录会生成一个视频,这些视频保存在./rollouts
。以下为日志截图,对于每次尝试会生成任务名称、输出路径、此次尝试是否成功、当前任务的总成功率,全部结束后还会生成总成功率:
以下为任务视频:
-
其他说明
a. 如果任务可以运行了,但成功率为0且在rollout文件夹下看到结果视频效果并不好,可能是模型没有正确导入。可以试试其他模型是否是同样的结果。
b. 一次任务尝试(episode)也比较长,为了加速可以改成一个任务只有一次尝试(原本有50次)看看效果。在
experiments/robot/libero/run_libero_eval.py
中修改:c. 根据不同的任务套件名称,为每个任务的执行设置最大步数(
max_steps
)。如果想更改可以尝试的最大步数可以在此修改: