Template updates

GR00T N1.7 DROID

gr00t-droid · policy template by NVIDIA · 7 absolute joint positions and the gripper at 15 Hz · L4. Each version below is fixed once published, newest first.

seq init gr00t-droid gives the stable version, seq init gr00t-droid@beta the beta, and seq init gr00t-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. v7beta

    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 v6 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 v6's.
    Use v7
    gr00t-droid v7shell
    # start a policy from this version, then deploy it
    seq init gr00t-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 gr00t-droid@v7 my-policy
  2. v6

    The image installs Isaac-GR00T from third_party/Isaac-GR00T, the copy in your folder, and everything else only from this version's frozen files, which the platform keeps: v5'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 Isaac-GR00T's pyproject.toml, LICENSE and gr00t/ from third_party/Isaac-GR00T into the image and installs them, editable at /opt/Isaac-GR00T as before: change Isaac-GR00T there and deploy again, and your deployment runs your GR00T. third_party/README.md lists what goes into the image.
    • Everything else comes from /seq/frozen (.template_files("gr00t-droid", version=6)), with no index: the base nvidia/cuda:12.8.0-runtime-ubuntu22.04 by digest, the system packages as .deb files, and every Python package with its sha256 checked against requirements-policy.lock. frozen.toml says what is frozen.
    • The Python packages are the ones v5's image holds (pins-policy.txt): 146 from PyPI and PyTorch's index - the versions Isaac-GR00T's lock file names, torch 2.9.0 for CUDA 12.8 and TensorRT 10.15 among them - and flash-attn 2.8.3 from its release. typing-extensions is 4.16.0, as v5 put it forward over the lock's 4.15; uv, which v5 took at its newest when its image was built, is pinned at 0.13.0. The build installs nothing from PyPI or GitHub.
    • TensorRT's libraries are frozen as the wheel NVIDIA publishes (4.3 GB): PyPI holds only a stub that downloads that wheel while the image builds, as v5's build did.
    • uv installs them, as it did for v5: flash-attn's release wheel names a version in its file name (2.8.3+cu12torch2.9cxx11abiTRUE) that its metadata does not (2.8.3), and pip refuses it.
    • policy.py names the Isaac-GR00T commit in full, 51d4c89f72fda44cbf77285c6a8114b52676b8a1.
    • 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 v5.
    Use v6
    gr00t-droid v6shell
    # start a policy from this version, then deploy it
    seq init gr00t-droid@v6 my-policy
    seq deploy my-policy/policy.py
    
    # or move a deployment made from this template to it
    seq policy upgrade my-policy --to v6
    
    # on the robot's machine: this version's client.py and its README
    pip install -U sequence-ai
    seq init gr00t-droid@v6 my-policy
  3. v5

    The source the image builds from comes with the template: Isaac-GR00T at the commit the image pins, in third_party/, with its license.

    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/Isaac-GR00T/: https://github.com/NVIDIA/Isaac-GR00T at commit 51d4c89f72fda44cbf77285c6a8114b52676b8a1. Its submodules under external_dependencies/ are left out (the image clones without them); a file kept with Git LFS is its pointer; two links to folders are listed in third_party/README.md instead.
    • The image, its weights and what it installs are as in v4.
    Use v5
    gr00t-droid v5shell
    # start a policy from this version, then deploy it
    seq init gr00t-droid@v5 my-policy
    seq deploy my-policy/policy.py
    
    # or move a deployment made from this template to it
    seq policy upgrade my-policy --to v5
    
    # on the robot's machine: this version's client.py and its README
    pip install -U sequence-ai
    seq init gr00t-droid@v5 my-policy
  4. v4

    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, 320x180 with padding and bilinear filtering as NVIDIA's DROID client resizes, and the gripper's threshold, binarize={7: 0.5}. The same frames and steps give the same JPEGs and commands as v3.
    • preprocess takes the connected policy first: preprocess(policy, exterior=..., wrist=..., ...). One chunk at a time is policy.to_commands(policy.predict(...))[:OPEN_LOOP_HORIZON].
    • A deployment of this version checks every frame and never resizes one: a frame that is not 320x180 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 v4
    gr00t-droid v4shell
    # start a policy from this version, then deploy it
    seq init gr00t-droid@v4 my-policy
    seq deploy my-policy/policy.py
    
    # or move a deployment made from this template to it
    seq policy upgrade my-policy --to v4
    
    # on the robot's machine: this version's client.py and its README
    pip install -U sequence-ai
    seq init gr00t-droid@v4 my-policy
  5. v3stable

    client.py gains to_command(step) for run(). The policy declares no action bounds, so the platform passes the joint targets as the model gave them; the served code is unchanged.

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

    • client.py gains to_command(step): one step as run() hands it to act, the gripper made 0 or 1 at 0.5. 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 the first 15 steps of each chunk at 15 Hz and fetches the next chunk while they play, as NVIDIA's DROID loop does. predict() with to_commands stays as the one-chunk form.
    • With no bounds declared, your joint-position controller and its joint limits hold the joint targets, as the README now says. policy.py and the image are v2's.
    Use v3
    gr00t-droid v3shell
    # start a policy from this version, then deploy it
    seq init gr00t-droid@v3 my-policy
    seq deploy my-policy/policy.py
    
    # or move a deployment made from this template to it
    seq policy upgrade my-policy --to v3
    
    # on the robot's machine: this version's client.py and its README
    pip install -U sequence-ai
    seq init gr00t-droid@v3 my-policy

    In the console, Deploy deploys this version: the console deploys the stable one.

  6. v2

    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.31.0 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 v1's.
    Use v2
    gr00t-droid v2shell
    # start a policy from this version, then deploy it
    seq init gr00t-droid@v2 my-policy
    seq deploy my-policy/policy.py
    
    # or move a deployment made from this template to it
    seq policy upgrade my-policy --to v2
    
    # on the robot's machine: this version's client.py and its README
    pip install -U sequence-ai
    seq init gr00t-droid@v2 my-policy
  7. v1

    The first version: NVIDIA's GR00T N1.7 post-trained on DROID as a policy, an exterior and a wrist camera, the joints, gripper and end-effector pose in, a 40-step chunk of 7 joint positions and the gripper at 15 Hz out.

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

    • seq deploy policy.py deploys it on an L4, or an A100 40 GB when no L4 is free, as one worker (max_gpus=1: a second robot waits) with cpu=1.25 and memory=14. Its weights, NVIDIA's DROID checkpoint and the Cosmos-Reason2-2B backbone it is built on, are copied from the platform's own copy: no Hugging Face account needed.
    • client.py fits each frame to 320x180 with padding as NVIDIA's client does, turns DROID's cartesian_position (XYZ Euler angles) into the quaternion pose the observation carries, and makes the gripper 0 or 1 at 0.5 (to_commands). Run the first 15 steps of a chunk (OPEN_LOOP_HORIZON), then ask again.
    • On the worker the pose becomes GR00T's 9 numbers the way its DROID training data was built, and load checks that conversion against GR00T's own before the worker serves anyone.
    • On an L4 the model loads in 47 s and holds 6.3 GiB of the card; a warm call took 0.34-0.90 s from the robot, and a robot's first call waited about 80 s for its worker (measured on the platform).
    • Licensed by NVIDIA under the NVIDIA Open Model License (LICENSE), with the attributions in NOTICE; GR00T runs with NVIDIA's Isaac-GR00T code (Apache-2.0) at a pinned commit.
    Use v1
    gr00t-droid v1shell
    # start a policy from this version, then deploy it
    seq init gr00t-droid@v1 my-policy
    seq deploy my-policy/policy.py
    
    # or move a deployment made from this template to it
    seq policy upgrade my-policy --to v1
    
    # on the robot's machine: this version's client.py and its README
    pip install -U sequence-ai
    seq init gr00t-droid@v1 my-policy