Load the pi0.5 policy at the size it runs at - #871
Conversation
The two vocabulary heads no action chunk reads are dropped, and a checkpoint is built in host memory so what reaches the GPU is what runs there. On the shipped Kinova checkpoint the server holds 8593 MiB where it held 10103. An int8 knob in vla_serving.yaml holds the language backbone and the vision tower at eight bits, taking that to 5375 MiB for 0.14s per 50-step chunk against 0.13s, both inside the real-time budget at 10 fps. /health reports which of the two is running. What eight bits costs in success rate is unmeasured on this checkpoint. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JFNEZkKa2NN7LMWbzM37Nq
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
|
rlpratt12
left a comment
There was a problem hiding this comment.
Tried this on an RTX 4060 Laptop (8 GB) today, since it's exactly the case the PR unlocks. It works — but adding a dependency to this layer surfaced how expensive a rebuild is, and I think that's worth addressing while this file is already open.
--no-cache-dir makes every rebuild re-download the whole CUDA wheel set. Adding torchao invalidates the pip layer, so the rebuild pulled ~3.5 GB across 154 wheels — torch 530 MB, cublas 423 MB, cufft 214 MB, cusolver 201 MB, cusparse 146 MB, and the rest of nvidia-cu*. On wifi at ~8 MB/s that's ~7 minutes of pure download, and it saturated the link while it ran.
Two things came out of that:
-
pip's 15s default read timeout is too tight for this layer. My first attempt died at 565s with
ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443)— ten minutes of downloading thrown away, since the failed layer restarts from zero.ENV PIP_DEFAULT_TIMEOUT=120andPIP_RETRIES=10fixed it for me. Cheap insurance on a layer this large. -
A BuildKit cache mount would make rebuilds nearly free, and is the more interesting fix:
RUN --mount=type=cache,target=/root/.cache/pip \ pip install "lerobot[pi,smolvla]==0.6.0" ...
The cache lives outside the image, so image size is unchanged — which I assume is what
--no-cache-dirwas protecting. The difference is that the next version bump costs a few hundred KB instead of 3.5 GB.
Neither blocks the PR, and if you'd rather keep the diff tight I'd understand — but (1) in particular bit me on the first try and cost more time than the change would.
Separately, two notes from running it, not review comments:
-
The
/appbind mount is a trap for this change specifically.docker-compose.yamlmountssrc/vla_sim/docker:/app:ro, so the newvla_inference_server.pyruns against whatever image already exists. Anyone who pulls this branch and starts the server without forcing a rebuild getsModuleNotFoundError: No module named 'torchao'at line 85, which reads like a broken PR rather than a stale image. The launcher only builds that profile-gated image when it's missing, somoveit_pro run --only-inference-serveralone isn't enough — I had todocker rmithe old image first. Might be worth a line in the PR description. -
On the accuracy question you flagged in
vla_serving.yaml("What it costs in success rate is unmeasured on this checkpoint") — I'll be running the cube-stacking objective againstint8: trueon the 4060 and can report back what I see. Happy to have that data point live somewhere more durable than a PR thread if useful.
The two vocabulary heads no action chunk reads are dropped, and a checkpoint is built in host memory so what reaches the GPU is what runs there. On the shipped Kinova checkpoint the server holds 8593 MiB where it held 10103.
An int8 knob in vla_serving.yaml holds the language backbone and the vision tower at eight bits, taking that to 5375 MiB for 0.14s per 50-step chunk against 0.13s, both inside the real-time budget at 10 fps. /health reports which of the two is running. What eight bits costs in success rate is unmeasured on this checkpoint.