π0.5 DROID
pi05-droid · policy template by Physical Intelligence · 7 joint velocities and the gripper at 15 Hz · L4. Each version below is fixed once published, newest first.
seq init pi05-droid gives the stable version, seq init pi05-droid@beta the beta, and seq init pi05-droid@v<N> any version below that is not withdrawn. A deployment made from this template names the version it runs in seq policy versions and on its page in the console; seq policy upgrade moves it to the newer stable one.
-
v18beta
A deployment of this version runs on one card type, the L4: a worker starts only on an L4, never on an A100.
Needs sequence-ai 0.34.19 or later, on your machine and on the robot:
pip install -U sequence-ai, which brings Pillow for the robot.policy.pydeclaresgpu="L4", where v17 listed["L4", "A100-40GB"]: a deployment names one card type. To run on another card, name that one instead.README.mdsays so where it spoke of the A100.- The image, its frozen files, the weights, the contract and the serving code are v17's.
Use v18
# start a policy from this version, then deploy it seq init pi05-droid@v18 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v18 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v18 my-policy
-
The image installs openpi from
third_party/openpi, the copy in your folder, and everything else only from this version's frozen files, which the platform keeps: v16's packages, the same on any day.Needs sequence-ai 0.34.19 or later, on your machine and on the robot:
pip install -U sequence-ai, which brings Pillow for the robot.policy.pycopies openpi'spyproject.toml,README.md,LICENSE,src/andpackages/openpi-client/fromthird_party/openpiinto the image and installs them, editable at/opt/openpias before: change openpi there and deploy again, and your deployment runs your openpi.third_party/README.mdlists what goes into the image.- Everything else comes from
/seq/frozen(.template_files("pi05-droid", version=17)), with no index: the basenvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04by digest, the system packages as.debfiles, every Python package with its sha256 checked againstrequirements-policy.lock, and lerobot from its source.frozen.tomlsays what is frozen. - The Python packages are the 209 that v16's image holds (
pins-policy.txt), torch 2.7.1 and JAX 0.5.3 among them, and openpi, its client and lerobot from their sources: the build installs nothing from PyPI or GitHub. - openpi comes without its two submodules, which the image never used: LIBERO, and ALOHA's own code and hardware files.
client.pystops when it is imported, sayingpip install -U sequence-ai, if sequence-ai is older than 0.34.19 or Pillow is missing, instead of at the robot's first frame.- To add a package or change a version, add your own step after the template's (
.uv_pip_install(...)); it installs from PyPI as any image does. - The weights, the contract and the serving code are as in v16.
Use v17
# start a policy from this version, then deploy it seq init pi05-droid@v17 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v17 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v17 my-policy
-
The source the image builds from comes with the template: openpi at the commit the image pins, in third_party/, with its licenses; LICENSE and NOTICE come with the template too.
Needs sequence-ai 0.34.12 or later, on your machine and on the robot, with Pillow on the robot:
pip install -U sequence-aibrings both.third_party/openpi/: https://github.com/Physical-Intelligence/openpi at commit215abfb217dbac7d5f1273282331b9b1866c0479, with its submodulethird_party/aloha(MIT). Left out, asthird_party/README.mdsays: the LIBERO submodule (its assets include objects under non-commercial terms and with no license given) and ALOHA 2's hardware files (102 MB); this template uses neither.LICENSE(Apache-2.0, for the template's own files) andNOTICE(the checkpoint's terms - Gemma's notice first - and where the code comes from) come with the template.- The image, its weights and what it installs are as in v15.
Use v16
# start a policy from this version, then deploy it seq init pi05-droid@v16 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v16 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v16 my-policy
-
The robot fits each camera frame and makes each command with the SDK's own helpers, as policy.py declares them.
Needs sequence-ai 0.34.12 or later, on your machine and on the robot, with Pillow on the robot:
pip install -U sequence-aibrings both.client.pycallspolicy.prepare_imagefor each frame (resize="pad",filter="bilinear", as policy.py declares) andpolicy.to_commandfor each step, instead of its own copies of them: itsresize_with_pad,encode,to_commandandto_commandsare gone.policy.pydeclares how each camera's frame is fitted, openpi'sresize_with_padwith bilinear filtering, and the gripper's threshold,binarize={7: 0.5}. The same frames and steps give the same JPEGs and commands as v14.preprocesstakes the connected policy first:preprocess(policy, exterior=..., wrist=..., ...). One chunk at a time ispolicy.to_commands(policy.predict(...)).- A deployment of this version checks every frame and never resizes one: a frame that is not 224x224 is refused with a 400 that names the call that fits it.
- Under an older sequence-ai,
policy.pyandclient.pystop with a sentence that names 0.34.12, instead of an error about unknown fields.
Use v15
# start a policy from this version, then deploy it seq init pi05-droid@v15 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v15 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v15 my-policy
-
v14stable
The policy declares its action bounds, each joint velocity within [-1, 1] and the gripper within [0, 1], and the platform keeps every step inside them;
client.pygainsto_command(step)forrun().Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
policy.pydeclaresbounds: the 7 joint velocities within [-1, 1], where openpi's DROID example clips them, and the gripper position within [0, 1]. The worker clips each chunk into them before it leaves, naming each clipped value in the response'swarnings, andrun()andnext_action()clip again before a step reachesact.- Before, only
client.py'sto_commandsheld the steps, so a robot that calledrun()oract()without it was sent the model's raw velocities. client.pygainsto_command(step): one step asrun()hands it toact, the gripper made 0 or 1 at 0.5 and every value clipped to [-1, 1].to_commandsisto_commandon each step of a chunk.- The README's example is the
run()loop:connect,wait_until_ready(), thenrun(observe=..., act=lambda action: robot.step(to_command(action))), which plays each chunk's 8 steps at 15 Hz and fetches the next chunk while they play.predict()withto_commandsstays as the one-chunk form.
Use v14
# start a policy from this version, then deploy it seq init pi05-droid@v14 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v14 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v14 my-policy
In the console, Deploy deploys this version: the console deploys the stable one.
-
The README says to declare
cpuandmemoryfor all the copies when a worker runs several copies of the model.Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
- Each copy is a process of its own, with its own host memory: two pi05-libero copies on one L4 used up to 20.4 GiB, where one copy uses about 10 (measured on the platform).
- For two copies, declare
cpu=2.5, memory=24. The price shown at deploy counts the CPU one robot uses, and a worker with a robot on every copy is billed at the greater of request and use. - README only: the code and the image are v12's.
Use v13
# start a policy from this version, then deploy it seq init pi05-droid@v13 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v13 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v13 my-policy
-
A worker that runs several copies of the model starts in about the time of one: the copies share one bf16 copy of the params and warm a lone request only.
Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
- With
@seq.concurrent(replicas_per_gpu=N)under@seq.policy, the first load leaves the params as bf16 (about 6.7 GB) in the deployment's compile cache, and every later load maps them from there instead of each copy restoring the checkpoint into its own memory. - On such a worker the warmup compiles a lone request only. Each copy compiles a batch size the first time a batch of that size comes (an eval's): about 5 s each on a B200, once an earlier worker has compiled it.
- Eight pi05-libero copies on one B200 went from start to ready in 69-82 s, against 153-185 s before and 62 s for one copy alone (measured on the platform).
- The shared copy is billed as storage, like the rest of the compile cache. A worker of one copy keeps none, warms every batch size and loads as before.
Use v12
# start a policy from this version, then deploy it seq init pi05-droid@v12 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v12 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v12 my-policy
- With
-
The README says
client.pyneeds Pillow on the robot, which sequence-ai does not bring:pip install sequence-ai pillow.Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
client.pyimports Pillow to fit the camera frames before they are sent, so on a robot with sequence-ai alonefrom client import preprocessfailed withNo module named 'PIL'. The README's "Use it" now says what to install.- README only: the code and the image are v10's.
Use v11
# start a policy from this version, then deploy it seq init pi05-droid@v11 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v11 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v11 my-policy
-
The image installs openpi at one fixed commit and its dependencies as PyPI had them on 2026-10-03, so a rebuild on any day installs exactly the same packages.
Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
policy.pychecks out openpi at215abfb(openpi's main of 2026-08-24), installsuv0.12.22, and resolves openpi's dependencies with--exclude-newer 2026-10-03T03:32:00Z.- Earlier versions build openpi's latest commit with whatever PyPI has that day: on 2026-10-09 that was pyarrow 26.0.0, which needs NumPy 2, beside openpi's NumPy 1.26.4, and the policy no longer loaded.
- To take newer versions, move
_OPENPI_COMMITand_PYPI_AS_OFforward together. - The model, its weights and
client.pyare v9's.
Use v10
# start a policy from this version, then deploy it seq init pi05-droid@v10 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v10 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v10 my-policy
-
The policy declares its model family,
family="pi", which the console draws its icon from, and its README gives the CPU and memory it declares.Needs sequence-ai 0.33.50 or later; on the robot, Pillow.
@seq.policy(family="pi")names outright the model family that earlier versions left to be read from the image. It needs sequence-ai 0.33.50 or later, and the README now says so.- The README's "Cards, CPU and memory" gives the
cpu=1.25andmemory=11(GiB) declared since v6, where it still said nothing was declared: serving one robot a worker used 1.2 cores and 10.2 GiB, so the price shown at deploy is the price billed.
v9 is v8 without a note written for our own records, which a comment in v8's
policy.pycarried.Use v9
# start a policy from this version, then deploy it seq init pi05-droid@v9 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v9 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v9 my-policy
-
v8withdrawn
The policy declares its model family,
family="pi", which the console draws its icon from, and its README gives the CPU and memory it declares.Withdrawn on 2026-10-08: a comment in
policy.pycarried a note written for our own records. v9 is the same version without it. -
The policy has no batch wait of its own: an eval's acts are gathered until they stop coming, where a 5 ms wait cut a round into small padded batches. A robot's act never waits.
Needs sequence-ai 0.31.0 or later; on the robot, Pillow.
@seq.batched(max_batch_size=16)declares no wait: the platform gathers an eval's acts until none comes for 20 ms, 250 ms at most. The 5 ms of earlier versions cut a round into small batches, each padded up to a compiled size.- A robot on a connection of its own still holds a worker of its own, so robots are not batched with each other.
v7 is the oldest version
seq initgives, and the first whose files carry no notes written for our own records; it includes every change of v2-v6 below.Use v7
# start a policy from this version, then deploy it seq init pi05-droid@v7 my-policy seq deploy my-policy/policy.py # or move a deployment made from this template to it seq policy upgrade my-policy --to v7 # on the robot's machine: this version's client.py and its README pip install -U sequence-ai seq init pi05-droid@v7 my-policy
-
v6withdrawn
The policy declares
cpu=1.25andmemory=11(GiB): serving one robot a worker used 1.2 cores and 10.2 GiB (measured on the platform), so the price shown at deploy is the price billed.Withdrawn on 2026-10-08: its files carried notes written for our own records. v7 is the same template without them, with no batch wait of its own.
-
v5withdrawn
The policy declares
max_gpus=1: the deployment holds one card, a second robot waits for the first, andseq policy scale <name> --max-gpus Nraises the cap without a redeploy.Withdrawn on 2026-10-08: its files carried notes written for our own records. v7 is the template without them, with every change since.
- The README gains "Cards, CPU and memory": a worker holds one card, an L4, or an A100 (40 GB) when no L4 is free.
- The template's folder no longer includes a
tests/folder.
-
v4withdrawn
The same template as v3, published again: a README in its
tests/folder no longer names a storage location that is not public.Withdrawn on 2026-10-08: its files carried notes written for our own records. v7 is the template without them, with every change since.
-
v3withdrawn
Acts that reach a worker together run as one forward pass of up to 16, each with the noise of its own seed, so a request's chunk is the one it would get alone.
Withdrawn on 2026-10-04: a README in its
tests/folder named a storage location that is not public. v4 is the same template without it.@seq.batched(max_batch_size=16, wait_ms=5)batches an eval's environments, or concurrent requests on one connection. A robot on a connection of its own holds a worker of its own, so robots are not batched with each other.- A batch is padded to the next compiled size (1, 2, 4, 8 or 16), and the warmup compiles every size: on one L4 a version's first worker loaded in 274.7 s and was ready 408 s after the deploy, and the next loaded from the compile cache in 124.5 s (measured on the platform).
- The compile cache is per card: the first A100 worker of a version compiles every size again (291.5 s of load and warmup). Keep
gpu="L4"if that wait matters more than the fallback.
-
v2withdrawn
to_commandsinclient.pyreads each step of a returned chunk as the plain list sequence-ai hands the robot; v1's failed withAttributeErroron every chunk.Withdrawn on 2026-10-08: its files carried notes written for our own records. v7 is the template without them, with every change since.
-
v1withdrawn
The first version: openpi's π0.5 fine-tuned on DROID, as a policy you deploy, with
client.pyfor the robot.Withdrawn on 2026-10-08: its files carried notes written for our own records. v7 is the template without them, with every change since.
- Each call returns a chunk of 8 steps at 15 Hz, each 7 joint velocities and the gripper position.
client.pyfits both cameras to 224x224 with openpi'sresize_with_padand sends them as JPEG;to_commandsmakes the gripper 0 or 1 at 0.5 and clips every value to [-1, 1], as openpi's DROID example does.- The official weights,
seq.Weights.template("pi05-droid", version=1): openpi's pi05_droid checkpoint with the PaliGemma tokenizer it loads, 21 files, 12,433,752,621 bytes, provided under the Gemma Terms of Use.