Remote GPU (Inference Server)
If you don't have a local GPU but have access to a remote GPU server, run inference there and stream actions back to your machine over an SSH tunnel. Your local smolvla node captures the cameras + joint states and sends them to the server; the server runs the model and returns joint targets.
Step 1 — Start the inference server on the GPU machine
DATA_DIR is the host directory mounted to /data in the container — point it at the checkpoint output dir. The server auto-selects the latest checkpoint under /data/checkpoints; set SMOLVLA_CHECKPOINT to pin a step. It reads the expected cameras from the checkpoint and validates incoming frames.
If the GPU server has the repo cloned (it will if you trained there, Workflow 2 Option B), start the server from the repo root with the infer-server profile:
To pin a specific checkpoint step (here DATA_DIR maps to /data, so the path is relative to it):
Prefer that form. It puts the container in the ar4-physical-ai Compose project, so ./scripts/down.sh tears it down with everything else. The older -p ar4 -f docker-compose.infer-server.yaml invocation put it in a project of its own that no teardown from the repo root ever matched, which is how a policy server once stayed up for four days after the stack around it was stopped.
On a machine that has only the gpu-server/ar4-infer/ bundle rather than the whole repo, run it directly instead:
Check it loaded: curl localhost:8000/health → {"loaded":true,"task":"..."}.
Step 2 — Open an SSH tunnel (keep this terminal open)
Step 3 — Start the sim and point inference at the tunnel
The local node sends observations to the server over HTTP and receives joint targets back — the arm moves as if the GPU were local. The TASK you set locally is forwarded to the server, so steer it the same way as local inference:
When you're done, stop the server on the GPU machine with ./scripts/down.sh, which also catches anything else the stack left running.