SimplerEnv evaluation

July 5, 2026 · View on GitHub

Layout

evaluation/SimplerEnv/eval_simplerenv/
├── README.md                ← this file
├── main.py                  ← evaluation client (run inside `simplerenv_state`)
├── env_options/
│   └── bridge.json          ← 576 episodes × 4 task suites
└── scripts/
    ├── deploy.sh            ← N policy servers in a tmux session
    └── launch_simplerenv.sh ← N parallel eval clients

Environment Setup

ComponentConda envNotes
Policy serverlerobot_labRuns evaluation/LIBERO/policy_server/server_policy.py.
SimplerEnv eval clientsimplerenv_stateSAPIEN + ManiSkill2_real2sim from allenzren/SimplerEnv.
# Create and activate a new conda environment
conda create -n simplerenv_state python=3.10 -y
conda activate simplerenv_state

# Clone the SimplerEnv repository
git clone https://github.com/allenzren/SimplerEnv.git --recurse-submodules

# Install numpy<2.0 (otherwise errors in IK might occur in pinocchio):
pip install torch==2.8.0 torchvision==0.23.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cu128

# Install ManiSkill2 real-to-sim environments and their dependencies:
cd SimplerEnv/ManiSkill2_real2sim
pip install -e .

# Install SimplerEnv
cd ..
pip install -e .

pip install numpy==1.24.4 tyro transformers==4.57.1 pandas

Quick start

# Terminal 1 — start 8 servers across 8 GPUs (tmux session: policy_servers)
# InternVLA-A1.5 checkpoints load fine under the default --action_loss_only;
# only pass WAN_MODEL_PATH when running with --no-action_loss_only.
VLM_MODEL_PATH=/path/to/Qwen3.5-2B-Action \
bash evaluation/SimplerEnv/eval_simplerenv/scripts/deploy.sh \
    /path/to/pretrained_model 8 8

# Terminal 2 — wait for the servers to print "server running ...", then:
SimplerEnv_PATH=/path/to/allenzren/SimplerEnv \
bash evaluation/SimplerEnv/eval_simplerenv/scripts/launch_simplerenv.sh \
    8 bridge ./logs

deploy.sh defaults STATS_KEY=widowx and ROBOT_TYPE=widowx so the server picks the bridge subset out of a multi-key stats.json and the widowx image-mapping (single observation.images.image_0 → slot 0) drives input validation. Pass STATS_KEY= (empty) if your checkpoint only has one stats key and you want the server to auto-pick.

Each rank i connects to BASE_PORT + i (default BASE_PORT=10086), processes its slice of env_options/bridge.json, and writes a per-rank CSV under <LOG_PATH>/bridge/results/{i}.csv. Rank 0 aggregates the per-rank CSVs into all_results.csv once every rank has dropped its *.end marker.

Per-episode rollout videos land under <LOG_PATH>/bridge/videos/<task_suite>/.