{ "schema_version": "5.1", "name": "pi05-base-p300x2", "tt_metal_version": "0.0.0.dev0", "arch": "blackhole", "device_count": 4, "producer": { "tt_kernel_version": "0.1.0", "created_at": "2026-10-13T11:18:24.594841+00:00", "hostname": "tt-quietbox" }, "weights": { "repo_id": "lerobot/pi05_base", "revision": "b211f3d44c36b6acfcf7ae94a64e8e96f75a64ba", "allow_patterns": [ "model.safetensors", "config.json", "policy_preprocessor.json", "policy_postprocessor.json" ], "ignore_patterns": null, "repo_type": "model" }, "mesh": null, "entrypoint": null, "resources": null, "capabilities": null, "env": {}, "bundled": null, "deps": null, "container": { "image": { "registry": "hf", "repository": "pi05-base-p300x2", "tag": "tt-model/pi05-base-p300x2:d918b7cb130a", "digest": "sha256:d918b7cb130afd2e3428f16d668a9ac3e21f9f061b0428ca3f3bb645de434d51" }, "kind": "tt-dit-server", "runtime": { "app": "models.experimental.pi0_5.server.app:app", "mesh_shape_env": "TT_MESH_SHAPE", "packages": [ "numpy>=1.24.4,<2", "safetensors", "huggingface_hub", "transformers==5.12.1", "sentencepiece", "protobuf" ], "lock": "requirements.lock" }, "serve": { "hardware": "p300x2", "mesh_device": "P300x2", "port": 20000, "max_model_len": null, "max_num_seqs": null, "block_size": null, "server_timeout": null, "capabilities": null, "additional_config": {}, "args": [], "env": { "TT_WEIGHTS_REVISION": "b211f3d44c36b6acfcf7ae94a64e8e96f75a64ba", "PI05_MEGAKERNEL": "mc", "PI05_NUM_IMAGES": "2", "PI05_ACTION_HORIZON": "50", "PI05_NUM_STEPS": "10", "PI05_TOKEN_LEN": "224", "PI05_TOKENIZER_REQUIRED": "1", "PI05_BATCH_WINDOW_MS": "0", "PI05_MODEL_NAME": "pi05-base-p300x2", "PI05_HANG_S": "10", "PI05_HANG_ACTION": "degrade", "PI05_RESET_ON_START": "auto", "PI05_HANG_MARKER": "/cache/pi05_hang_marker" } }, "serve_profiles": [ { "hardware": null, "mesh_device": null, "port": null, "max_model_len": null, "max_num_seqs": null, "block_size": null, "server_timeout": null, "capabilities": null, "additional_config": {}, "args": [], "env": { "PI05_PROFILE": "multi-robot", "TT_MESH_SHAPE": "1x4", "PI05_LAYOUT": "dp", "PI05_SLO_MS": "100", "PI05_SLO_P99_MS": "110", "PI05_SLO_CLOCK_GUARD": "1.69" }, "name": "multi-robot", "description": "All 4 chips, each the whole model; each robot (request field robot_id) is bound to one chip. At start the server times every chip's cycle and derives the robots per chip and R_max from the SLO (p50 100 ms, p99 110 ms, clock guard 1.69 for chips clamped to 800 MHz when hot); a new robot beyond R_max gets HTTP 503. Hang watchdog: a stuck chip is quarantined, its robots move to the healthy chips (PI05_HANG_ACTION=exit: exit 75 for a supervisor restart). Measured in-process, 4 robots at 2 cameras / H 50 / N 10: p50 53 ms cool, p50 83.0 / p99 84.1 ms at thermal steady state, 52 req/s, 6.65 J per request." }, { "hardware": null, "mesh_device": null, "port": null, "max_model_len": null, "max_num_seqs": null, "block_size": null, "server_timeout": null, "capabilities": null, "additional_config": {}, "args": [], "env": { "PI05_PROFILE": "single-robot", "TT_MESH_SHAPE": "1x4", "PI05_LAYOUT": "sp" }, "name": "single-robot", "description": "All 4 chips as ONE model (1x4 FABRIC_1D_RING mesh): camera-parallel VISION, sequence-parallel PREFIX, EXPERT on a cool chip (thermal placement); actions bit-identical to one chip. Host-to-host p50 at 2 cameras / 224 tokens / H 50: 38.5 ms cool (one chip: 52.6 ms). Per call at thermal steady state (trace replay, one chip at 800 MHz): 42.1 ms vs 38.0 ms cool; the legacy placement: 61.4 ms. On a hang the server exits 75 for a supervisor restart (the next start resets the chips)." }, { "hardware": null, "mesh_device": null, "port": null, "max_model_len": null, "max_num_seqs": null, "block_size": null, "server_timeout": null, "capabilities": null, "additional_config": {}, "args": [], "env": { "PI05_PROFILE": "disaggregated", "TT_MESH_SHAPE": "1x4", "PI05_LAYOUT": "pd", "PI05_MAX_BATCH": "4" }, "name": "disaggregated", "description": "Prefix / expert disaggregation: chips 0-2 run VISION + PREFIX, chip 3 the batched action expert on up to 4 requests (K / V caches copied through the host). Requests are accepted at any time; same config for every request. No SLO or admission control; per-request heterogeneous configs and LLM-style join/leave serving are future work. Measured below multi-robot on this model (see the card). On a hang the server exits 75 for a supervisor restart." } ], "default_profile": "multi-robot", "code_dir": "code", "verify": [ "import models.experimental.pi0.tt.ttnn_pi05_model as m; assert m.PI05MegakernelTTNN and m.PI05_DEVICE_PARAMS['worker_l1_size'] == 1395712, m.PI05_DEVICE_PARAMS", "from models.experimental.pi0.tt.megakernel import presets as PS; assert len(PS.PRESETS) == 38 and PS.CAMERAS == (1, 2, 3, 4) and PS.PROMPT_BUCKETS == (32, 64, 128, 224) and PS.SUFFIX_BUCKETS == (32, 64) and PS.EXTRA_BUCKETS == {1: (192,), 2: (160,), 4: (96,)}, (len(PS.PRESETS), PS.EXTRA_BUCKETS)", "from models.experimental.pi0.tt.megakernel import program_b as pb; assert pb.NB_MAX == 8 and pb.BatchedExpertMegakernel and pb.KVSlab", "import models.experimental.pi0.tt.ttnn_pi05_batched as b, models.experimental.pi0.tt.ttnn_pi05_multichip as mc; assert b.PI05BatchedTTNN and mc.PI05MultiChip", "import models.experimental.pi0.tt.ttnn_pi05_sp as sp, models.experimental.pi0.tt.sp_thermal as T, models.experimental.pi0.tt.mr_sched as R; assert sp.PI05SingleRobotMesh and T.ENV_PLACEMENT == 'PI05_SP_PLACEMENT' and T.ENV_HOT == 'PI05_SP_HOT' and T.ENV_MR_GUARD == 'PI05_MR_GUARD' and R.AdmissionRefused", "from models.experimental.pi0_5.server.mcx_backend import max_batch_for as f; assert (f(2, 50), f(4, 50), f(2, 10)) == (6, 4, 8), (f(2, 50), f(4, 50), f(2, 10))", "import os; [os.environ.pop(k, None) for k in ('PI05_NUM_IMAGES', 'PI05_ACTION_HORIZON', 'PI05_NUM_STEPS', 'PI05_SLO_MS', 'PI05_SLO_P99_MS', 'PI05_PROFILE')]; os.environ.update(PI05_MEGAKERNEL='mc', TT_MESH_SHAPE='1x4', PI05_LAYOUT='dp', PI05_MAX_BATCH='4'); from models.experimental.pi0_5.server import app as a; c = a.load_config(); assert (c.backend, c.layout, c.chips, c.max_batch) == ('mcx', 'dp', 4, 4), c", "import os; [os.environ.pop(k, None) for k in ('PI05_NUM_IMAGES', 'PI05_ACTION_HORIZON', 'PI05_NUM_STEPS', 'PI05_MAX_BATCH', 'PI05_PROFILE')]; os.environ.update(PI05_MEGAKERNEL='mc', TT_MESH_SHAPE='1x4', PI05_LAYOUT='dp', PI05_SLO_MS='100', PI05_SLO_P99_MS='110', PI05_SLO_CLOCK_GUARD='1.69'); from models.experimental.pi0_5.server import app as a; c = a.load_config(); assert (c.backend, c.layout, c.routing, c.slo_ms, c.slo_p99_ms, c.slo_clock_guard, c.max_batch) == ('mcx', 'dp', 'robot', 100.0, 110.0, 1.69, 6), c", "import os; [os.environ.pop(k, None) for k in ('PI05_NUM_IMAGES', 'PI05_ACTION_HORIZON', 'PI05_NUM_STEPS', 'PI05_SLO_MS', 'PI05_SLO_P99_MS', 'PI05_MAX_BATCH', 'PI05_PROFILE')]; os.environ.update(PI05_MEGAKERNEL='mc', TT_MESH_SHAPE='1x4', PI05_LAYOUT='sp'); from models.experimental.pi0_5.server import app as a; c = a.load_config(); assert (c.backend, c.layout, c.chips, c.profile) == ('mc', 'sp', 4, 'single-robot'), c", "import os; [os.environ.pop(k, None) for k in ('PI05_LAYOUT', 'PI05_SLO_MS', 'PI05_SLO_P99_MS', 'PI05_MAX_BATCH')]; os.environ.update(PI05_MEGAKERNEL='mc', TT_MESH_SHAPE='1x1'); from models.experimental.pi0_5.server import app as a; c = a.load_config(); assert c.backend == 'mc' and c.layout == 'mesh', c", "import re; from pathlib import Path; T = Path('/opt/tt-metal'); R = T / 'models/experimental/pi0'; inc = T / 'tt_metal/hw/inc'; ks = sorted(k for k in R.rglob('*') if k.suffix in ('.cpp', '.hpp', '.h')); assert len(ks) == 21, ks; pairs = [(k, i) for k in ks for i in re.findall(r'#include\\s+\"([^\"]+)\"', k.read_text())]; bad = [(str(k), i) for k, i in pairs if not ((k.parent / i).is_file() or (inc / i).is_file() or (T / i).is_file())]; assert not bad, bad", "import os; [os.environ.pop(k, None) for k in ('PI05_HANG_S', 'PI05_HANG_ACTION', 'PI05_RESET_ON_START', 'PI05_HANG_MARKER', 'PI05_LAYOUT', 'PI05_SLO_MS', 'PI05_SLO_P99_MS', 'PI05_MAX_BATCH', 'PI05_PROFILE')]; os.environ.update(PI05_MEGAKERNEL='mc', TT_MESH_SHAPE='1x4', PI05_LAYOUT='dp'); from models.experimental.pi0_5.server import app as a; from models.experimental.pi0.tt import mr_sched as R; c = a.load_config(); assert (c.hang_s, c.hang_action, c.hang_exit_code, c.reset_on_start) == (10.0, 'degrade', 75, 'auto') and R.ChipHung, c", "import ttnn; assert hasattr(ttnn, 'generic_op') and hasattr(ttnn, 'CreateDevices') and hasattr(ttnn, 'set_fabric_config') and hasattr(ttnn.FabricConfig, 'FABRIC_1D_RING') and hasattr(ttnn, 'open_mesh_device')", "import safetensors, huggingface_hub, sentencepiece, google.protobuf", "import transformers; assert transformers.__version__ == '5.12.1', transformers.__version__", "import numpy; assert numpy.__version__.startswith('1.'), numpy.__version__", "from pathlib import Path; assert Path('/opt/tt-metal/models/experimental/pi0_5/server/smoke_test.py').is_file()" ], "built": { "image": "tt-model/pi05-base-p300x2:d918b7cb130a", "repo": "changh95/pi05-base-p300x2", "tt_model_version": "0.1.0", "created_at": "2026-10-13T11:14:44+00:00", "tt_metal": { "sha": "f856a38a361939888f92d88f9e69b2f8a83fb713", "describe": null, "dirty": false, "scm_version": "0.0.0.dev0", "mode": "git", "remote": "https://github.com/tenstorrent/tt-metal", "branch": null, "pushed": null }, "code_sha256": "c4bb2adbbf40468c0e877a97e23cb20b1cbfeb50ad6834ead87df8c9b57326f1", "image_digest": "sha256:d918b7cb130afd2e3428f16d668a9ac3e21f9f061b0428ca3f3bb645de434d51" } } }