在百舸上使用 Mind2Act 评测镜像评测视觉-动作模型
在百舸上使用 Mind2Act 评测镜像评测视觉-动作模型
概述
Mind2Act 是面向「想&做」协同的跨架构诊断 Benchmark,提供 30 个双臂操作任务、90 种任务配置与 4,500 条专家示范。平台分别检验模型的「想」(Mind)与「做」(Act),再检验二者能否协同(Mind2Act),并为每个被测模型生成一张诊断卡,说明短板所在、失败发生在哪一步、下一步该补什么。
本镜像打包了社区版评测代码与完整运行环境:任务在 Isaac Sim 5.1 中由双臂 ARX X5 执行,分 old15、new15 两套 release,每个任务有 easy/medium/hard 三档配置,clean 模式每档 50 个冻结实例。镜像内置一键评测脚本,在百舸上申请多卡即可并行跑评测。
详见官网:https://mind2act-world.com/index.html
适用场景
- 对视觉-动作(VLA / 具身智能)模型做标准化、可复现的仿真评测与诊断。
- 需要多卡、多任务并行跑完整 Benchmark(4,500 实例)的场景。
- 通过 adapter 接入自有模型(端到端关节控制接口),在统一预算下与他人结果对齐比较。
环境与资源要求
| 项目 | 说明 |
|---|---|
| 镜像地址 | ccr-registry.baidubce.com/aihc/mind2act:torch270_cuda128_sim5-1_20261110 |
| 代码目录 | /root/workspace/mind2act-eval |
| 评测脚本目录 | /root/workspace/mind2act-scripts(一键入口 run.sh,另有 run_batch.sh、list_cases.py、summary.py) |
| 运行时环境 | Isaac Sim 5.1.0,入口 /root/isaac-sim/python.sh |
| GPU | 支持图像渲染的卡型 |
镜像内置软件栈:
| 组件 | 版本 |
|---|---|
| Python | 3.11.13 |
| PyTorch | 2.7.0+cu128(CUDA 12.8) |
| torch 编译架构 | sm_75 / 80 / 86 / 90 / 100 / 120 |
| ffmpeg | 6.1.1 |
| 其他 | Vulkan / GL 运行库;/root/venvs/hf-dl 内置 huggingface_hub 2.4.0(用于下载资产) |
镜像内不含任何凭证(HF token、模型 API key 等),运行时通过任务环境变量传入。镜像已清空着色器与 Warp 缓存,每种 GPU 首次启动 Isaac 会重新编译,首局偏慢属正常现象。 镜像登录 shell 会自动加载
/etc/profile.d/mind2act.sh,预置以下环境变量(一般无需改动):
1export ISAAC_PYTHON=/root/isaac-sim/python.sh
2export M2A_CODE_ROOT=/root/workspace/mind2act-eval
3export M2A_PYTHON_OVERLAY=/root/workspace/mind2act-overlay
4export MIND2ACT_ASSET_ROOT=/mnt/pfs/datasets/Mind2act/mind2act-assets
5export PYTHONNOUSERSITE=1
6export PYTHONPATH="$M2A_CODE_ROOT/src:$M2A_PYTHON_OVERLAY${PYTHONPATH:+:$PYTHONPATH}"
准备工作
下载评测资产
评测资产约 70 GB,不打进镜像,需先下载到 PFS,再把 PFS 挂到评测环境的 /mnt/pfs。默认路径 /mnt/pfs/datasets/Mind2act/mind2act-assets,放在其他位置时修改环境变量 MIND2ACT_ASSET_ROOT。
从 BOS 下载(推荐):百舸 BOS 上有一份同步自 HuggingFace 的镜像,且无需 HF token:
1#!/usr/bin/env bash
2set -eo pipefail
3# 需已配置 bcecmd 凭证(bcecmd -c 或 ~/.go-bcecli/credentials)
4A=/mnt/pfs/datasets/Mind2act/mind2act-assets
5mkdir -p "$A"
6bcecmd bos cp bos:/aihc-rdw-bj/huggingface.co/datasets/Mind2act/mind2act-assets/ "$A/"
7 --recursive --yes --disable-bar
从 HuggingFace 下载(Mind2act/mind2act-assets 为私有仓库,需单独申请读权限):
1#!/usr/bin/env bash
2set -eo pipefail
3# HF_TOKEN 需对 Mind2act/mind2act-assets 有读权限,从环境变量传入,不要写进脚本
4: "${HF_TOKEN:?export HF_TOKEN first}"
5A=/mnt/pfs/datasets/Mind2act/mind2act-assets
6mkdir -p "$A"
7HF_HUB_DISABLE_PROGRESS_BARS=1 /root/venvs/hf-dl/bin/hf download Mind2act/mind2act-assets
8 --repo-type dataset --revision v1.0.4
9 --local-dir "$A" --max-workers 16
单 token 并发过高会被 HF 限流(429),下载中断时重跑同一条命令即可续传。
资产自检
下载完成后,先做资产完整性与「代码—资产」配对校验,两项都通过才可使用:
1#!/usr/bin/env bash
2set -eo pipefail
3export PYTHONPATH="${PYTHONPATH:-}"
4. /etc/profile.d/mind2act.sh
5A=$MIND2ACT_ASSET_ROOT; K=${OUTPUT_PATH:-/root/workspace/outputs}/checks; mkdir -p $K
6
7# 1. 资产完整性:逐文件比对 MANIFEST.json 的大小和 SHA-256
8$ISAAC_PYTHON $A/tools/verify_manifest.py > $K/verify_manifest.log 2>&1
9tail -c 300 $K/verify_manifest.log # 期望 "status": "passed", "findings": []
10
11# 2. 代码与资产配对
12cd $M2A_CODE_ROOT
13$ISAAC_PYTHON tools/verify_release_pair.py --asset-root $A > $K/verify_release_pair.log 2>&1
14tail -c 300 $K/verify_release_pair.log # 期望 "paired_files_verified": true
15
16# 3. 实例输入门检查(CPU,不启动物理)
17$ISAAC_PYTHON $A/tools/check_native_input_gates.py $K/native-input-gates.json > $K/gates.log 2>&1
18tail -c 300 $K/gates.log # 期望 "cases": 900, "passed": 900
GPU 渲染自检
不依赖资产,确认 Isaac、CUDA、RTX 渲染与物理均可用。换新型号 GPU(如 3090/4090)时建议先跑一次:
1. /etc/profile.d/mind2act.sh
2$ISAAC_PYTHON -c "import torch;print(torch.cuda.get_device_name(0),torch.cuda.get_device_capability(0))"
3# 随后用镜像内自检脚本渲染一帧,期望输出非空图像、方块正常落地
冷缓存下首次运行可能拿到空帧,重跑一次即可。
开通 AgentOS(使用 duclaw adapter 时)
若用镜像内置的 duclaw adapter 接入被测模型,需先在百度智能云 AgentOS 文档「API 管理」 开通服务,获取 BaseURL、创建 API Key。开通后系统自动创建一个默认 API Key(不可禁用、不可更换),也可在 AgentOS 助手页面按用途另建 Key。
- API Key:设置到百舸任务的环境变量
MIND2ACT_API_KEY,不要写进配置文件或启动命令。 - BaseURL:与默认地址
https://duclaw-gateway.baidubce.com/star/openai/v1不同时,写入 adapter 配置的base_url,详见「接入被测模型」。
开始评测
统一用一键脚本 /root/workspace/mind2act-scripts/run.sh 启动。它会先检查环境(输出目录可写、资产与镜像代码配对一致、所选 GPU 全部空闲),再用评测框架在指定卡上并行跑实例,最后汇总 infra_valid、termination 计数与缺失实例,明细写到 <OUTPUT_PATH>/summary.csv。
百舸任务中把 PFS 挂到
/mnt/pfs,用OUTPUT_PATH指定 PFS 上的输出目录(如/mnt/pfs/<your-dir>/m2a)。无需挂载/shared:环境中没有/shared时run.sh自动建软链/shared → OUTPUT_PATH;若环境中已有/shared,则OUTPUT_PATH必须设在其下。
常用变量
以下变量均可不设,取默认值即可跑通:
| 变量 | 默认值 | 说明 |
|---|---|---|
POLICY_KIND |
空 | 空表示原始预算,仅用于环境检查;被测模型用 e2e 或 coding_agent |
ADAPTER |
mind2act_eval.adapters.hold:create |
被测模型的 adapter(module:create)。hold 让机器人保持不动,仅用于环境检查;duclaw 用 mind2act_llm_e2e.duclaw:create |
ADAPTER_CONFIG |
空 | adapter 的 JSON 配置文件路径,运行时按 sha256 校验 |
CASE_ID |
空 | 只跑这些实例,逗号分隔 |
TASKS / LEVELS |
空(全部) | 逗号分隔,如 PR1,DR2、easy,medium |
GPUS |
0 |
本 Pod 内用哪些卡,逗号分隔(如 0,1,2,3)。每张卡同时跑 1 局,最多并行 6 局 |
SHARD / NSHARD |
0 / 1 |
多个百舸任务分片,见「多任务多卡」 |
OUTPUT_PATH |
/root/workspace/outputs |
输出根。默认值在容器本地、任务结束即丢失,百舸任务中应设为 PFS 目录 |
ASSET_ROOT |
空 | 资产不在默认路径时设置 |
模型 API key 等凭证用任务环境变量传入,不写进脚本。不同
POLICY_KIND的结果不能混在一起比较,换协议时换一个OUTPUT_PATH。
单任务单卡
1# 环境检查:hold,原始预算,只跑一局
2OUTPUT_PATH=/mnt/pfs/<your-dir>/m2a-hold CASE_ID=PR1_easy_0c7134bad55b7c6c
3 /root/workspace/mind2act-scripts/run.sh
4
5# duclaw,e2e 预算;MIND2ACT_API_KEY 已在任务环境变量中设置
6OUTPUT_PATH=/mnt/pfs/<your-dir>/m2a-duclaw CASE_ID=PR1_easy_0c7134bad55b7c6c GPUS=0
7 POLICY_KIND=e2e ADAPTER=mind2act_llm_e2e.duclaw:create ADAPTER_CONFIG=/mnt/pfs/<your-dir>/duclaw.json
8 /root/workspace/mind2act-scripts/run.sh
9tail -f /mnt/pfs/<your-dir>/m2a-duclaw/logs/worker.log
单任务多卡
一个任务×难度的全部实例分到多张卡并行,每张卡同时跑 1 局(单局不跨卡):
1OUTPUT_PATH=/mnt/pfs/<your-dir>/m2a-duclaw TASKS=PR1 LEVELS=easy GPUS=0,1,2,3
2 POLICY_KIND=e2e ADAPTER=mind2act_llm_e2e.duclaw:create ADAPTER_CONFIG=/mnt/pfs/<your-dir>/duclaw.json
3 /root/workspace/mind2act-scripts/run.sh
- 上一局写出
ready.json后才启动下一局,两次启动至少间隔 60 s,错开 Isaac 冷启动。 - 并行局数等于
GPUS卡数,超过 6 张时只并行 6 局。
多任务多卡
在一个 Pod 内跑多个任务和难度:
1OUTPUT_PATH=/mnt/pfs/<your-dir>/m2a-duclaw TASKS=PR1,DR2,CP01 LEVELS=easy,medium GPUS=0,1,2,3,4,5
2 POLICY_KIND=e2e ADAPTER=mind2act_llm_e2e.duclaw:create ADAPTER_CONFIG=/mnt/pfs/<your-dir>/duclaw.json
3 /root/workspace/mind2act-scripts/run.sh
实例更多时拆成 n 个百舸任务,镜像和挂载相同。第 i 个任务(i = 0…n-1):
1SHARD=<i> NSHARD=<n> GPUS=0,1 OUTPUT_PATH=/mnt/pfs/<your-dir>/m2a-duclaw
2 POLICY_KIND=e2e ADAPTER=mind2act_llm_e2e.duclaw:create ADAPTER_CONFIG=/mnt/pfs/<your-dir>/duclaw.json
3 /root/workspace/mind2act-scripts/run.sh
4# 查看进度
5tail -n 3 /mnt/pfs/<your-dir>/m2a-duclaw/w*/logs/worker.log
- n 个任务用同一个
OUTPUT_PATH,各分片输出到$OUTPUT_PATH/w<i>、锁目录互不相同,各自汇总一次。全部结束后汇总所有分片:/root/isaac-sim/kit/python/bin/python3 -I /root/workspace/mind2act-scripts/summary.py /mnt/pfs/<your-dir>/m2a-duclaw。 - n 个任务间隔 60 s 提交,错开 Isaac 冷启动。
- 耗时按 hold 实测粗估:每局 430–630 s,4500 局 8 卡并行约 86 小时,模型推理时间另计。
内存上限
框架在每局启动前和运行中统计同一 UID 所有进程的 RSS 合计,超限的局判为 resource_limit。单局约 14 GiB。
- 只用 1 张卡时上限固定为 36 GiB,够用。
- 多卡并行且容器有 cgroup 内存上限时,脚本自动生成
--resource-config,RSS 合计上限默认16 GiB × 并行局数 + 8 GiB,最高 128 GiB、并行 6 局。百舸任务的内存配额按此预留(如 6 卡并行建议设 256 GiB 以上)。 - 容器没有 cgroup 内存上限时,上限只能是 36 GiB,脚本自动把并行降到 2 局;需要更多并行时,在百舸任务中设置内存配额。
接入被测模型(duclaw e2e adapter)
镜像内置一个 duclaw 关节空间端到端(e2e)adapter(mind2act_llm_e2e.duclaw:create):每次决策把任务指令、当前关节状态、剩余控制行数和 3 路相机 RGB 发给模型,模型返回若干绝对关节路点(两臂各 6 个关节角加夹爪开合),adapter 按单行步长上限线性展开成 30 Hz 控制行执行,执行完再问下一次。
- 开通:使用 duclaw adapter 需先开通百度智能云 AgentOS 服务并创建 API Key,详见准备工作「开通 AgentOS」。
- 接口:OpenAI Responses 兼容接口,默认地址
https://duclaw-gateway.baidubce.com/star/openai/v1/responses,默认模型A6A。AgentOS 控制台给出的 BaseURL 与默认地址不同时,写入配置的base_url(到/v1为止,adapter 自动拼接/responses)。 - 凭证:API Key 从环境变量
MIND2ACT_API_KEY读取,不进日志、不进结果。在百舸任务的环境变量中设置,不要写进配置文件或启动命令。 - 只支持
POLICY_KIND=e2e(控制频率 30 Hz)。
配置文件(JSON)至少包含以下 3 项,未知字段会被拒绝:
1{
2 "log_dir": "/mnt/pfs/<your-dir>/m2a-duclaw/requests",
3 "ledger": "/mnt/pfs/<your-dir>/m2a-duclaw/ledger.json",
4 "ledger_limit": 200,
5 "reasoning_effort": "medium"
6}
| 字段 | 默认值 | 说明 |
|---|---|---|
log_dir |
必填 | 每局一个子目录,每次决策写一个 decision-NNNNN.json(请求骨架、模型回复、HTTP 状态、耗时、token 用量;图像只记 sha256) |
ledger |
必填 | 请求账本,记录每次 HTTP 请求(含失败和重试)。跨局、跨进程累计,并行局共用同一账本安全(文件锁),永不重置 |
ledger_limit |
必填 | 账本总请求上限(正整数)。用满后该局报错终止。账本已存在时上限不能改,换上限要换 ledger 路径。建议按「实例数 × 每局决策次数 × 2」预留 |
max_decisions |
不限 | 单局决策次数上限,用于控费;正式评测不建议设置 |
reasoning_effort |
不传 | 透传给 Responses 接口的 reasoning.effort,如 medium |
request_retries |
2 |
单次请求失败(408/429/5xx、网络错误)的重试次数 |
parse_retries |
1 |
回复不是合法 JSON 时带错误说明重问的次数 |
max_rows_per_decision |
150 |
单次决策最多执行的控制行数(30 Hz 下 5 s) |
max_step_rad / max_step_gripper |
0.05 / 0.25 |
每控制行关节、夹爪的最大变化量 |
timeout_s |
180 |
单次 HTTP 请求超时 |
model |
A6A |
模型名 |
base_url |
https://duclaw-gateway.baidubce.com/star/openai/v1 |
接口前缀,adapter 在其后拼接 /responses |
镜像内的
/root/workspace/mind2act-llm-e2e/examples/duclaw.json只是示例,其log_dir、ledger在容器本地、任务结束即丢失,百舸任务中应复制一份改到 PFS 上。不占用 GPU 也能自检 adapter:$ISAAC_PYTHON /root/workspace/mind2act-llm-e2e/offline_check.py,期望最后一行tail truncation ok。
查看结果
- 单局结果在
<OUTPUT_PATH>/results/batch-<id>/episode-<NNNN>-attempt-01/result.json,关键字段为termination、infra_valid、ticks、error,同目录有录像(结束后另存.tar.gz)。 - 同一 batch 目录下有
summary.json(各局结果)和resource-receipt.json(内存上限、并行数、每局分到的卡)。 - 日志在
<OUTPUT_PATH>/logs/:worker.log(每次启动一段)、batch-<时间>.log(框架输出)、manifest-<时间>.json(本次提交的实例与参数)。 run.sh汇总只是运行层面的统计;模型成绩与诊断卡以项目组按统一预算的判定为准。
常见问题
Q:评测资产放在非默认目录可以吗?
可以。通过环境变量 MIND2ACT_ASSET_ROOT(或 ASSET_ROOT)指向实际路径即可。
Q:中断后如何续跑?
重跑同一条启动命令即可。框架会跳过已有 infra_valid=true 结果的实例,只补余下的。
Q:为什么首局特别慢? 镜像已清空着色器与 Warp 缓存,每种 GPU 首次启动 Isaac 会重新编译,属正常现象,后续局会恢复正常速度。
Q:多卡并行局数如何确定?
并行局数等于 GPUS 卡数,单局不跨卡,最多并行 6 局。并行受内存上限约束,详见「内存上限」。
Q:不同协议的结果能一起比较吗?
不能。不传 POLICY_KIND(原始预算)仅用于 hold 等环境检查;被测模型按类型选 e2e 或 coding_agent,不同协议的结果不能混在一起比较,换协议时换一个 OUTPUT_PATH。
后续操作
- 评测日志输出到
<OUTPUT_PATH>/logs/,可通过worker.log观察进度。 - 全部实例跑完后用
summary.py汇总,核对summary.csv中的infra_valid、termination与缺失实例。 - 需要换被测模型时,调整
ADAPTER/ADAPTER_CONFIG并换一个OUTPUT_PATH后重新启动。
评价此篇文章
