Workflows

Run Inference (Simulation)

Once you have a checkpoint, run the policy against the simulation. The same smolvla container runs inference on your local GPU or offloads to a remote GPU — you only flip one env var (SMOLVLA_SERVER_URL).

Step 1 — Start the simulation

docker compose up sim-tabletop moveit

This launches Gazebo (which publishes the /scene_camera/image and /wrist_camera/image feeds plus /joint_states) and the controllers the policy drives.

To preview what the policy sees, run rqt_image_view on your host (ros2 run rqt_image_view rqt_image_view) and use the topic dropdown at the top — you can easily toggle between /scene_camera/image and /wrist_camera/image.

Step 2 — Run the inference node (new terminal)

# Local GPU — auto-selects the latest checkpoint under ./data/checkpoints/
docker compose run --rm smolvla

That single command is the whole thing. On startup the node:

  • Locates the checkpoint — auto-discovers the newest pretrained_model under CHECKPOINT_SEARCH_ROOT (default /data/checkpoints). Set SMOLVLA_CHECKPOINT to pin a specific step instead.
  • Subscribes to the cameras — defaults to scene + wrist (what the moveit-trained model uses). The server checks the images it receives against the checkpoint's expected cameras and errors clearly if one is missing. For a wrist-only model, set SMOLVLA_CAMERAS (see below).
  • Sends the taskTASK defaults to the prompt the model was trained on; override it to steer the robot.

Options

VariableDefaultDescription
SMOLVLA_CHECKPOINT(empty → auto-discovers latest)Full path to pin a checkpoint, e.g. /data/checkpoints/smolvla_ar4_moveit/checkpoints/050000/pretrained_model
CHECKPOINT_SEARCH_ROOT/data/checkpointsWhere to search for the latest checkpoint when SMOLVLA_CHECKPOINT is empty
TASK(the model's training prompt)Natural-language instruction sent to the model
SMOLVLA_SERVER_URL(empty → run locally)Set to a remote server (e.g. http://localhost:8000) to offload to a remote GPU — see Remote GPU
DEVICEcudacpu / mps for local inference without an NVIDIA GPU
SMOLVLA_CAMERAS(empty → scene + wrist)Camera→topic map, e.g. wrist_camera:/wrist_camera/image for a wrist-only model, or scene_camera:/scene_camera/image,wrist_camera:/wrist_camera/image
HZ15.0Control frequency in Hz
USE_SIM_TIMEtruetrue for sim, false for real hardware
SPEED_SCALE1.0Scale all joint motions (lower = more cautious)
# Pin a specific checkpoint step
SMOLVLA_CHECKPOINT=/data/checkpoints/smolvla_ar4_moveit/checkpoints/050000/pretrained_model \
  docker compose run --rm smolvla
 
# Steer with a different task
TASK="pick up the red cylinder and place it on the middle shelf" \
  docker compose run --rm smolvla
 
# No local GPU? Offload to a remote server (see the Remote GPU page for the tunnel)
SMOLVLA_SERVER_URL=http://localhost:8000 docker compose run --rm smolvla

On this page