记录openVLA的LIBERO评估复现过程

介绍

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上的指导步骤:

  1. 克隆仓库

    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仓库:

    bash 复制代码
    git 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+

    安装其他必须的软件包:

    bash 复制代码
    cd 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 上提供四个检查点:

    要使用其中一个检查点开始评估,请运行以下命令之一。

    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

    接下来讲一讲可能出现的报错。

  2. pytorch版本对应

    出现类似报错undefined symbol: __nvJitLinkComplete_12_4, version libnvJitLink.so.12

    是cuda版本不对应,可以通过nvcc --version检查cuda版本,并安装对应的pytorch

  3. 找不到模块错误

    出现ModuleNotFoundError: No module named 'experiments'可以在引入的地方加上 sys.path.append("../..")换绝对路径

  4. 其他还有一些跟着报错去安装就好

  5. 服务器连接差连不上huggingface

    可以改成本地下载传上服务器,在openvla/experiments/robot/openvla_utils.pyget_vla(cfg)get_processor(cfg)函数,传参传本地路径:

    python 复制代码
        def 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改成保存的模型本地路径:

    css 复制代码
    python 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
  6. 报错cuda内存不够

    ini 复制代码
    torch.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.pyrobot_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去中止程序

  7. 没导入数据集

    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里即可。

    bash 复制代码
    Example (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
  8. 类型不匹配报错

    bash 复制代码
     Caught exception: Input type (c10::BFloat16) and bias type (float) should be the same

    openvla_utils.pyget_vla_action函数改倒数第三行:

    python 复制代码
    inputs = processor(prompt, image).to(DEVICE, dtype=torch.float32)# 改为float32
  9. openvla/prismatic/extern/hf/modeling_prismatic.py报错

    arduino 复制代码
     The 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而不是增加

    python 复制代码
    if 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 
  10. 警告信息:

    arduino 复制代码
    huggingface/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 来控制是否启用并行处理:

    lua 复制代码
    import os
    os.environ["TOKENIZERS_PARALLELISM"] = "false"
  11. 评估结果

    开始评估:

    css 复制代码
    python 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

    以下为日志截图,对于每次尝试会生成任务名称、输出路径、此次尝试是否成功、当前任务的总成功率,全部结束后还会生成总成功率:

    以下为任务视频:

  12. 其他说明

    a. 如果任务可以运行了,但成功率为0且在rollout文件夹下看到结果视频效果并不好,可能是模型没有正确导入。可以试试其他模型是否是同样的结果。

    b. 一次任务尝试(episode)也比较长,为了加速可以改成一个任务只有一次尝试(原本有50次)看看效果。在experiments/robot/libero/run_libero_eval.py中修改:

    c. 根据不同的任务套件名称,为每个任务的执行设置最大步数(max_steps)。如果想更改可以尝试的最大步数可以在此修改:

相关推荐
唐天下文化15 小时前
罗庚机器人:机器人打磨领域的先行者
机器人
机器觉醒时代15 小时前
探索机器人创新技术基座,傅利叶开源人形机器人 Fourier N1
机器人·开源
LitchiCheng18 小时前
MuJoCo 机械臂关节路径规划+轨迹优化+末端轨迹可视化(附代码)
人工智能·深度学习·机器人
alicema111119 小时前
Python-Django集成yolov识别模型摄像头人数监控网页前后端分离
开发语言·后端·python·算法·机器人·django
JackieZeng5271 天前
动手强化学习之马尔可夫决策(机器人篇)
机器人
llkk星期五1 天前
Mujoco xml actuator
xml·ubuntu·机器人
llkk星期五1 天前
Mujoco xml <option>
xml·ubuntu·机器人
三阶码叟2 天前
协作焊接机器人的应用场景
机器人
寻丶幽风2 天前
论文阅读笔记——Reactive Diffusion Policy
论文阅读·笔记·机器人·dp·具身智能
kyle~2 天前
ROS2---std_msgs基础消息包
开发语言·python·机器人·ros·机器人操作系统