一、Dexbotic介绍

文章链接:Dexbotic: Open-Source Vision-Language-Action Toolbox

Dexbotic aims to provide a one-stop VLA research service for professionals in embodied intelligence field. It offers a codebase that supports multiple mainstream VLA policies simultaneously, allowing users to reproduce various mainstream VLA methods with just a single environment setup based on the pretrained models we provide. Additionally, Dexbotic will continuously update to include more of the latest pre-trained foundation models and cutting-edge VLA models in the industry.


二、自定义镜像

由于Dexbotic最好使用容器进行开发或部署,我们首先需要解决租赁云服务器时实例本身就是Docker容器无法嵌套的问题。对此我们需要创建自定义镜像。以我自己的操作过程为例,我本身在无问芯穹的云服务器进行开发,先根据下图提示打开使用命令行上传镜像的地方:

去到控制台,点击算力租赁
在这里插入图片描述
点击左侧镜像选项,再点击自定义镜像,点击上传镜像,选择命令行上传,他会给出相应操作流程:

在这里插入图片描述
保持在这个界面,作为我们后续将镜像上传至无问芯穹的指南

此时我们去到一个新的云服务器进行Dexbotic的拉取。由于大多数服务器墙的比较厉害,改国内镜像也总是卡在最后一个文件。为了避坑,建议大家直接去租自带如香港节点的云服务器。我在阿里云租赁了一个最便宜的服务器,记得选择中国香港作为节点,租卡操作我就不再赘述了:
在这里插入图片描述
在终端执行如下指令:

apt-get install -y docker-ce docker-ce-cli containerd.io # 安装Docker
docker pull dexmal/dexbotic:latest

此时就可以根据刚才无问芯穹的指令进行操作:

docker login --username='...' sichuan-a.cr.infini-ai.com:32443
# 密码
docker tag dexmal/dexbotic:latest sichuan-a.cr.infini-ai.com:32443/te-dcdssswkkuuats5n/dexbotic:latest
docker push sichuan-a.cr.infini-ai.com:32443/te-dcdssswkkuuats5n/dexbotic:latest

此时你能在如下界面看到你上传的镜像,我们打开开发机:
在这里插入图片描述
选择创建开发机:
在这里插入图片描述
选择自定义镜像并添加,同时一定记得勾选SSH密码登录与Docker容器,创建成功后就可以按照正常流程启动该云服务器了(如果不知道怎么操作可以点击这里查看具体步骤)

在这里插入图片描述


三、运行测评

1. 基础环境准备与CogACT

利用我们自定义的镜像创建新的云服务器,接下来克隆仓库、激活环境、安装依赖:

git clone https://github.com/dexmal/dexbotic.git
cd /dexbotic
conda activate dexbotic
pip install -e .

完成后我们开始下载Dexbotic官方调过的模型权重(先以CogACT为例),为了解决网络问题,而即使我用了国内镜像加速 hf-mirror.com,但这个模型的文件存储在 HuggingFace 的一种特殊存储服务(XetHub)上,而镜像站没能正确转发这个特殊的存储地址,导致出现了 no such host的报错。下述操作已经启用Python官方提供的下载工具 (huggingface-cli):

# 1. 安装 git-lfs (大文件下载工具)
apt-get update && apt-get install -y git-lfs
git lfs install

# 2. 创建存放权重的目录
mkdir -p checkpoints/libero

# 3. 下载模型权重
pip install -U huggingface_hub
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download Dexmal/libero-db-cogact --local-dir checkpoints/libero/libero_cogact

此时应该有一些环境冲突导致下载中断,按照如下操作即可:

pip install "huggingface_hub<1.0.0"
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download Dexmal/libero-db-cogact --local-dir checkpoints/libero/libero_cogact

这套代码采用了Client-Server(客户端-服务器)架构来进行评测,这是一个在机器人研究中非常高级且常见的设计:

  • Terminal 1(我们当前这个窗口):是 “大脑”(Model Server)。它加载了模型权重,挂在 7891 端口上,正在安静地等待指令。

  • Terminal 2(我们需要新开一个):应该是 “身体”(Evaluation Client)。它负责运行仿真环境(那个做家务的机器人),它会不断向 Terminal 1 发送画面,问:“我现在该怎么动?”,然后 Terminal 1 回复动作。

故下载完之后,我们现在当前的terminal1启动server:

# 注意加了 -u 参数,这样报错会立即打印出来
CUDA_VISIBLE_DEVICES=0 python -u playground/benchmarks/libero/libero_cogact.py \
  --task inference \
  --image_path test_data/libero_test.png \
  --prompt "ignored_in_benchmark_mode"

等到看到Running on http://127.0.0.1:7891后说明server已经启动。我们先返回dexbotic所在目录,打开一个新的终端terminal2,再进行如下操作:

conda activate dexbotic
# 加上 -H "Expect:" 禁用 100-continue 等待,防止服务器卡死
curl -v -H "Expect:" -X POST \
  -F "text=What action should the robot take to put both moka pots on the stove?" \
  -F "image=@test_data/libero_test.png" \
  http://localhost:7891/process_frame

若输出一长串 {“response”:[[0.456…]]}和* Closing connection 0,说明我们的“大脑”(VLA模型)已经成功接收了图片,进行了复杂的推理,并返回了一组具体的机械臂动作轨迹。

由于评测代码在另一个仓库,我们在terminal2下先克隆下来:

git clone https://github.com/Dexmal/dexbotic-benchmark.git
cd dexbotic-benchmark

此时我们需要拉取初始化子模块,因为很多核心代码都在子模块里,它会把 libero 等仿真器的实际代码下载下来:

git submodule update --init --recursive

但是由于网络原因,上述指令试图一次性把所有仿真环境(RoboTwin, Calvin, ManiSkill 等)都下载下来。这些仓库里包含大量的 3D 模型和纹理,体积巨大,国内网络环境下极容易卡死或断连。所以我准备先只测评LIBERO,指定只初始化 libero 这一个子模块,这样速度会快很多,也更不容易失败:

# 只更新 libero 子模块
git submodule update --init libero

可惜即使这样,还是因为网络问题失败了。所以我们用 “浅克隆” 加上 “国内加速代理”来解决:

# 强行停止(如果还在卡着)
# 按 Ctrl + C

# 删除失败的文件夹
rm -rf libero

# 方案 A:浅克隆(速度快很多)
git clone --depth 1 https://github.com/Lifelong-Robot-Learning/LIBERO.git libero
# 方案 B:使用加速代理(通常秒下,根据需要调整注释来选择具体方案,通常A就行,如果B的镜像也不行,可以试试把域名换成 gitclone.com
# git clone --depth 1 https://github.moeyy.xyz/https://github.com/Lifelong-Robot-Learning/LIBERO.git libero

# 安装依赖包
pip install -e libero

完成上面的步骤之后,接下来是我已经尝试过后得到的必要的解决环境冲突的步骤,直接挨个操作即可:

# 补几个 Libero 运行必须的额外包
pip install termcolor easydict h5py hydra-core omegaconf dm_control

# 安装 imageio 以及常见的评测伴侣(防止后面报错缺 cv2 或 wandb)
pip install imageio opencv-python wandb pandas matplotlib

# 强制把 numpy 降级回 1.26.4,解决冲突
pip install "numpy==1.26.4"

# 降级 opencv 到兼容旧版 numpy 的版本
pip install "opencv-python==4.9.0.80"

# 安装机器人仿真框架 robosuite
# 强制安装 1.4.1 版本
pip install "robosuite==1.4.1"

# 由于我们的服务器本身是光秃秃的自定义镜像,再补充一些系统级驱动库
apt-get update && apt-get install -y libgl1 libglib2.0-0 libsm6 libxext6 libxrender-dev

# 安装 libegl1 (EGL支持) 和 libgl1-mesa-glx (兼容性支持)
# 通过 EGL 协议解决在没有显示器的服务器上使用 GPU 进行渲染的问题
apt-get install -y libegl1 libgl1-mesa-glx
export MUJOCO_GL=egl
export PYOPENGL_PLATFORM=egl

# 安装缺失的 bddl 库
pip install bddl

# 为了防止 pip 自动升级 numpy 导致崩盘,再次强制锁定版本
pip install "numpy==1.26.4"

# 安装 cloudpickle
pip install cloudpickle

# 安装 0.25.2 版本,既能避开旧版的安装报错,又能保持 API 兼容
pip install "gym==0.25.2"

此时再执行评测运行命令即可:

bash scripts/env_sh/libero.sh evaluation/configs/libero/example_libero.yaml

2. Pi0(相对特殊)

首先在我们之前创建的文件夹中下载官方给的权重(其他权重也可以在官方找到):

# 1. 创建存放目录 (保持整洁,方便管理)
mkdir -p checkpoints/libero/libero_pi0

# 2. 执行下载 
huggingface-cli download Dexmal/libero-db-pi0 --local-dir checkpoints/libero/libero_pi0

此时我们打开文件/root/dexbotic/dexbotic/exp/pi0_exp.py,大概在第332行附近找到函数def _initialize_inference(self) -> None,在如下位置:

def _initialize_inference(self) -> None:
        if self.norm_stats is None:
            norm_stats_file = os.path.join(self.model_name_or_path, "norm_stats.json")

强制插入模型路径,插入后如下:

def _initialize_inference(self) -> None:
        # [HACK] 强制指定模型路径
        self.model_name_or_path = "/root/dexbotic/checkpoints/libero/libero_pi0"

        if self.norm_stats is None:
            norm_stats_file = os.path.join(self.model_name_or_path, "norm_stats.json")

接下来其他模型都能按照上述cogact的方法正常跑起来,但唯独pi0总是0成功率,在进行了大量排查(包括图像接受,脚本处理逻辑等)后发现,应该将上述的terminal2的dexbotic-benchmark中的evaluation/configs/libero/example_libero.yaml文件中的replan(执行多少步后重新推理)改成5,反应更灵敏。

不过现在官方也发现了这个问题,在/dexbotic-benchmark/evaluation/configs/libero中添加新文件example_pi0_libero.yaml,我们直接使用它在terminal2运行即可。

在terminal1中,进入dexbotic并激活环境,然后运行如下指令:

cd dexbotic
conda activate dexbotic
CUDA_VISIBLE_DEVICES=0 python -u playground/benchmarks/libero/libero_pi0.py \
    --task inference \
    --image_path test_data/libero_test.png \
    --prompt "ignored_in_benchmark_mode"

此时再打开terminal2,进入dexbotic-benchmark并激活环境,运行如下指令即可:

cd dexbotic-benchmark
conda activate dexbotic
bash scripts/env_sh/libero.sh evaluation/configs/libero/example_pi0_libero.yaml

PS:或许因为网络原因,可能还会遇到关于SigLIP的问题,也就是服务器无法访问外网,而在terminal1运行上面的相应指令去跑libero_pi0.py后,代码试图从互联网下载这个视觉模型(google/siglip-so400m-patch14-224),进而会报错并影响使用。此时我们需要手动下载SigLIP:

# 1. 设置 HuggingFace 镜像地址
export HF_ENDPOINT=https://hf-mirror.com

# 2. (可选) 验证一下能不能连通,如果有返回说明网络通了
curl -I https://hf-mirror.com

# 3. 下载 Google 的 SigLIP 模型到指定目录
huggingface-cli download google/siglip-so400m-patch14-224 --local-dir checkpoints/siglip

显示下载成功后,我们依然需要修改 config.json,因为代码默认还是会去云端找,而我们需要显式告诉它:“用我下载好的这个文件夹”。打开/root/dexbotic/checkpoints/libero/libero_pi0/config.json,找到 vision_config 部分,修改如下:

"vision_config": {
    "model_name_or_path": "/root/dexbotic/checkpoints/siglip",
    ...
}

四、结果展示

按照上述过程运行cogact终端日志如下,其他的模型也类似,就不再展示了:

在这里插入图片描述
部分具体对比结果与官方差异如下:

Model Libero-Spatial Libero-Object Libero-Goal Libero-10 Average Own_Libero_Goal
CogACT 97.2 98.0 90.2 88.8 93.6 89.2%
DB-CogACT 93.8 97.8 96.2 91.8 94.9 91.8%
π0 96.8 98.8 95.8 85.2 94.2 92.6%
DB-π0 97 98.2 94 86.4 93.9 95.4%
MemVLA 98.4 98.4 96.4 93.4 96.7 94.4%
DB-MemVLA 97.2 99.2 98.4 93.2 97.0 96.0%
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐