Template updates

π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.

  1. 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.py declares gpu="L4", where v17 listed ["L4", "A100-40GB"]: a deployment names one card type. To run on another card, name that one instead.
    • README.md says 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
    pi05-droid v18shell
    # 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
  2. v17

    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.py copies openpi's pyproject.toml, README.md, LICENSE, src/ and packages/openpi-client/ from third_party/openpi into the image and installs them, editable at /opt/openpi as before: change openpi there and deploy again, and your deployment runs your openpi. third_party/README.md lists what goes into the image.
    • Everything else comes from /seq/frozen (.template_files("pi05-droid", version=17)), with no index: the base nvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04 by digest, the system packages as .deb files, every Python package with its sha256 checked against requirements-policy.lock, and lerobot from its source. frozen.toml says 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.py stops when it is imported, saying pip 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
    pi05-droid v17shell
    # 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
  3. v16

    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-ai brings both.

    • third_party/openpi/: https://github.com/Physical-Intelligence/openpi at commit 215abfb217dbac7d5f1273282331b9b1866c0479, with its submodule third_party/aloha (MIT). Left out, as third_party/README.md says: 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) and NOTICE (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
    pi05-droid v16shell
    # 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
  4. v15

    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-ai brings both.

    • client.py calls policy.prepare_image for each frame (resize="pad", filter="bilinear", as policy.py declares) and policy.to_command for each step, instead of its own copies of them: its resize_with_pad, encode, to_command and to_commands are gone.
    • policy.py declares how each camera's frame is fitted, openpi's resize_with_pad with bilinear filtering, and the gripper's threshold, binarize={7: 0.5}. The same frames and steps give the same JPEGs and commands as v14.
    • preprocess takes the connected policy first: preprocess(policy, exterior=..., wrist=..., ...). One chunk at a time is policy.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.py and client.py stop with a sentence that names 0.34.12, instead of an error about unknown fields.
    Use v15
    pi05-droid v15shell
    # 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
  5. 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.py gains to_command(step) for run().

    Needs sequence-ai 0.33.50 or later; on the robot, Pillow.

    • policy.py declares bounds: 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's warnings, and run() and next_action() clip again before a step reaches act.
    • Before, only client.py's to_commands held the steps, so a robot that called run() or act() without it was sent the model's raw velocities.
    • client.py gains to_command(step): one step as run() hands it to act, the gripper made 0 or 1 at 0.5 and every value clipped to [-1, 1]. to_commands is to_command on each step of a chunk.
    • The README's example is the run() loop: connect, wait_until_ready(), then run(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() with to_commands stays as the one-chunk form.
    Use v14
    pi05-droid v14shell
    # 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.

  6. v13

    The README says to declare cpu and memory for 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
    pi05-droid v13shell
    # 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
  7. v12

    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
    pi05-droid v12shell
    # 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
  8. v11

    The README says client.py needs 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.py imports Pillow to fit the camera frames before they are sent, so on a robot with sequence-ai alone from client import preprocess failed with No 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
    pi05-droid v11shell
    # 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
  9. v10

    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.py checks out openpi at 215abfb (openpi's main of 2026-08-24), installs uv 0.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_COMMIT and _PYPI_AS_OF forward together.
    • The model, its weights and client.py are v9's.
    Use v10
    pi05-droid v10shell
    # 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
  10. v9

    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.25 and memory=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.py carried.

    Use v9
    pi05-droid v9shell
    # 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
  11. 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.py carried a note written for our own records. v9 is the same version without it.

  12. v7

    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 init gives, and the first whose files carry no notes written for our own records; it includes every change of v2-v6 below.

    Use v7
    pi05-droid v7shell
    # 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
  13. v6withdrawn

    The policy declares cpu=1.25 and memory=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.

  14. v5withdrawn

    The policy declares max_gpus=1: the deployment holds one card, a second robot waits for the first, and seq policy scale <name> --max-gpus N raises 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.
  15. 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.

  16. 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.
  17. v2withdrawn

    to_commands in client.py reads each step of a returned chunk as the plain list sequence-ai hands the robot; v1's failed with AttributeError on 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.

  18. v1withdrawn

    The first version: openpi's π0.5 fine-tuned on DROID, as a policy you deploy, with client.py for 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.py fits both cameras to 224x224 with openpi's resize_with_pad and sends them as JPEG; to_commands makes 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.