Skip to main content

GR00T-N1.7 LIBERO closed-loop evaluation

Each episode executes model actions in LIBERO until check_success() becomes true or the episode reaches its step limit.

Result

Per-task results

Each task contains 50 fixed initial states.

Evaluation settings

The evaluation uses:
  • benchmark/gr00t/libero_rollout_server.py to expose PhyAI through the NVIDIA policy-server protocol.
  • benchmark/gr00t/libero_closed_loop_client.py to run LIBERO episodes and save the result after every episode.

Reproduce

Prepare the checkpoint as described in ws1. The PhyAI reproduction runs LIBERO from a pinned simulator container. It requires Docker, NVIDIA Container Toolkit, and a CUDA GPU. From the PhyAI repository root, set:
Install the transport packages in a temporary directory:
Start the PhyAI adapter in the first terminal:
If the Cosmos-Reason2 files are not cached, add --online on the first run. The built-in processor does not require remote code. Only pass --trust-remote-code for a custom processor repository whose code you trust. With CUDA graphs enabled, --max-batch-size is the captured batch size and must equal the client’s actual request batch. This client sends one environment per request, so both values are 1; when using the official client, set it to the same value as --n-envs. --capture-suite libero_10 scans all ten tasks before the socket is bound, then deduplicates profiles by their complete Backbone and Action Head Graph structure. The ten canonical prompts share the same structure, so setup runs one representative warmup and captures one graph for each stage. Runtime requests only replay these graphs. For a custom fixed task subset, replace it with one repeated --capture-task "..." argument per task structure; equivalent structures are still captured only once. The Action Head uses SDPA in this CUDA Graph path. If the optional FlashInfer backend is selected, the scheduler disables CUDA Graphs for both the Backbone and Action Head so the complete request runs eagerly. After Server is ready and listening appears, run the client from another terminal with the same exported variables:
Check the result:
--resume skips completed (task_id, episode) pairs after an interruption. The result records the server identity in server_info and the result group in backend.

Official baseline

To reproduce the official baseline, prepare LIBERO with Isaac-GR00T, then start the NVIDIA server:
Run the same simulator command with port 5555, --backend official, and result file /results/official.json. Use the remaining evaluation arguments shown above.