Remote Services and Parallel Runs#

By default, RPent starts and stops the environment, VLA, and SAM3 services with each LIBERO run. Keep that default for single-machine use. Configure external endpoints only when services live on different hosts, or when you want to reuse VLA and SAM3 models across tasks.

Three flags set the endpoints: --env-endpoint for the LIBERO environment, --vla-endpoint for the Pi0.5 VLA, and --sam3-endpoint for SAM3. Each takes [protocol://]HOST:PORT — HTTP when the protocol is omitted, or socket:// for socket RPC.

Dashboard Sessions do not support --env-endpoint because every TaskRun uses a fresh environment service. --vla-endpoint and --sam3-endpoint remain available in Dashboard mode.

LIBERO Environment Service#

One environment service is pinned to a suite, task, seed, and max episode steps; those values must match the RPent client exactly. On the env host:

export LIBERO_TYPE=pro
python -m robots.libero.env_server \
  --suite libero_object_swap --task 2 --seed 0 \
  --max-episode-steps 10000 \
  --cuda-device 0 \
  --transport http --host 0.0.0.0 --port ENV_PORT

The environment service is task-bound. To change any of those parameters, stop the old service and start a new one.

Pi0.5 VLA Service#

On the VLA host, set the checkpoint path and start the HTTP service:

export PI05_CHECKPOINT_PATH=/path/to/rlinf-pi05-libero-130-fullshot-sft
python -m rpent.robots.components.pi05_vla_server \
  --embodiment libero \
  --cuda-device 0 \
  --transport http --host 0.0.0.0 --port VLA_PORT

The VLA service loads the model once and can be reused by multiple RPent runs.

APXInf VLA Service (Optional)#

Use the APXInf adapter in place of the Pi0.5 service. Follow the APXinf-robo installation instructions in an environment with RPent installed. The libero and serve extras in the upstream instructions are not required for this RPent RPC endpoint. The planner and environment can keep their existing LIBERO installation, including its OpenPI dependency.

Prepare a compatible Pi0.5 LIBERO checkpoint, SentencePiece tokenizer and normalization statistics.

Start the service with that environment’s Python:

python -m rpent.robots.components.apxinf_vla_server \
  --embodiment libero \
  --model-path /path/to/pi05-libero \
  --tokenizer-path /path/to/tokenizer.model \
  --norm-stats-path /path/to/norm_stats.json \
  --precision bf16 \
  --transport http --host 127.0.0.1 --port 8220

Add --vla-endpoint http://127.0.0.1:8220 to the LIBERO command. For remote access, bind to a reachable interface and use the server’s address. Stop this external service yourself when finished. Omitting the endpoint starts OpenPI. APXInf-robo’s native OpenPI WebSocket server is not an RPent RPC endpoint; use the adapter above.

The adapter supports eval mode with these checkpoint configurations:

  • libero: two views, five flow steps, ten predicted actions; returns the first five as float32 in environment units.

  • dual_franka: body-frame delta TCP rot6d checkpoint, three views; returns 20 absolute-pose actions of width 20.

  • yam: delta-joint checkpoint, three views; returns 30 absolute qpos14 actions. The YAM tool executes five per call.

When changing --embodiment, select the matching APXInf-robo preset, checkpoint and statistics. Dual-Franka and YAM remain experimental; checkpoint export, numerical parity and real-robot execution still need validation. The adapter requires APXInf-compatible weights and does not convert raw RLinf actor/model_state_dict/full_weights.pt. Single-arm franka is not supported.

SAM3 Service#

On the SAM3 host, set the local checkpoint path and start the HTTP service:

export SAM3_CHECKPOINT_PATH=/path/to/sam3/sam3.pt
python -m rpent.robots.components.sam3_server \
  --cuda-device 0 \
  --transport http --host 0.0.0.0 --port SAM3_PORT

The SAM3 service loads the model once and can be reused by multiple RPent runs.

Connect RPent#

On the machine that runs RPent, point at the three endpoints. Suite, task, seed, and max episode steps must match the environment service:

rpent \
  --robot libero \
  --suite libero_object_swap --task 2 --seed 0 \
  --libero-type pro --max-episode-steps 10000 \
  --env-endpoint http://ENV_HOST:ENV_PORT \
  --vla-endpoint http://VLA_HOST:VLA_PORT \
  --sam3-endpoint http://SAM3_HOST:SAM3_PORT \
  --planner claude_code --model claude-opus-4-8

Replace each *_HOST with a reachable address of the machine that runs that service, and each *_PORT with the free port you chose at startup. Any of the three endpoint flags can be omitted; when one is unset, RPent spawns that service locally on a free port. All three default to HTTP when the protocol is omitted, and all three accept socket://HOST:PORT.

Custom RLinf Checkout#

The environment and VLA services import rlinf. When starting them manually against a development RLinf checkout instead of the installed package, point PYTHONPATH at the checkout first:

export PYTHONPATH=/path/to/rlinf:$PYTHONPATH

Servers spawned by RPent get this automatically: the checkout is resolved from RPENT_RLINF_ROOT (or RLINF_REPO_PATH), falling back to the rlinf directory next to the RPent checkout. A resolved path that does not exist is harmless — Python ignores invalid PYTHONPATH entries — so the servers import the installed rlinf package.

Parallel Evaluation#

The following example demonstrates parallel evaluation with LIBERO using Pi0.5 VLA and SAM3. Other robots or evaluation setups may use different services and endpoints.

To run the same LIBERO task concurrently, first start one Pi0.5 VLA service and one SAM3 service as described above. After both services report the log line RPC server listening on ..., pass the same endpoints — http://VLA_HOST:VLA_PORT and http://SAM3_HOST:SAM3_PORT — to every concurrent rpent process, replacing the placeholders with the host addresses and ports of the corresponding services.

When the services and RPent run on the same machine, the hosts can be 127.0.0.1. All processes then use the same VLA and SAM3 services. Leave --env-endpoint unset: each process starts its own env_server and keeps its evaluation environment independent. The VLA and SAM3 models are loaded once, so their services do not need to be started again for each run.

pids=()

for i in $(seq 1 10); do
  rpent --robot libero --libero-type pro \
    --suite libero_object_swap --task 2 --seed 0 \
    --planner claude_code --model claude-opus-4-8 \
    --vla-endpoint http://VLA_HOST:VLA_PORT \
    --sam3-endpoint http://SAM3_HOST:SAM3_PORT \
    --output-dir logs/parallel_object_swap_t2_s0/run_$i &
  pids+=($!)
done

wait "${pids[@]}"

Note

For long-running evaluations over SSH, start the shared services with nohup or in a tmux / screen session; a bare & may stop them when the SSH shell exits.

Access a Remote Dashboard#

Start the Dashboard on the server with a fixed port:

rpent --robot libero --dashboard --dashboard-port 8000 \
  --planner claude_code --model claude-opus-4-8

In a local terminal, forward the port, replacing USER@HOST with the server login:

ssh -N -L 8000:127.0.0.1:8000 USER@HOST

Open http://127.0.0.1:8000 in your local browser. Keep the SSH connection and server-side RPent process running; see Interactive Usage for task controls.

Code as Policy (Optional)#

This mode lets the model write Python code to control the robot through robo.<tool_name>(). Code can combine actions with loops and conditions, and variables persist within a session.

Once a normal task runs successfully, add --policy-mode code to your command. For example:

rpent --robot libero --libero-type pro \
  --suite libero_object_swap --task 2 --seed 0 \
  --planner claude_code --model claude-opus-4-8 \
  --policy-mode code

Each code snippet allows up to 120 seconds and 100 robot tool calls by default. Adjust these with --code-timeout-s and --code-max-calls. Code and results are saved in code_policy/ under the run’s output directory.

The model ends the task with robo.finish(...); code after a successful finish does not run. Operator requests such as request_scene_reset and request_operator_verdict stay separate tools outside Python, because waiting for the operator can exceed the per-snippet time limit.

This mode uses separate prompts, skips task memory, and does not generate recipes. It supports the api, claude_code, and codex planners, but not flash, and it cannot be combined with --explore. Omit the flag to use the default tool-calling mode.