{ "schema_version": "5.1", "name": "frnet-p150", "tt_metal_version": "0.65.2.dev11169+g44d66500520", "arch": "blackhole", "device_count": 1, "producer": { "tt_kernel_version": "0.1.0", "created_at": "2026-10-09T17:15:00.727135+00:00", "hostname": "hchang-bh" }, "weights": { "repo_id": "AutowareFoundation/lidar_frnet", "revision": "a53a1c11b0b28d31fd50a03abef5db0e830a5b3c", "allow_patterns": [ "frnet_*.onnx", "ml_package_frnet_*.param.yaml", "deploy_metadata.yaml" ], "ignore_patterns": null, "repo_type": "model" }, "mesh": null, "entrypoint": null, "resources": null, "capabilities": null, "env": {}, "bundled": null, "deps": null, "container": { "image": { "registry": "hf", "repository": "frnet-p150", "tag": "tt-model/frnet-p150:85cbf6cc72b9", "digest": "sha256:85cbf6cc72b9c535c2f44cec2b2145c8fb940d214874c23c918adfc66a51769c" }, "kind": "tt-dit-server", "runtime": { "app": "tt_frnet.server.app:app", "mesh_shape_env": "TT_MESH_SHAPE", "packages": [ "numpy>=1.24.4,<2", "huggingface_hub", "safetensors", "pyyaml", "onnx>=1.17,<2" ], "lock": "requirements.lock" }, "serve": { "hardware": "p150", "mesh_device": "P150", "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": "a53a1c11b0b28d31fd50a03abef5db0e830a5b3c", "TT_METAL_VISIBLE_DEVICES": "0", "HF_HUB_DISABLE_IMPLICIT_TOKEN": "1", "FRNET_DISPATCH": "eth", "FRNET_NUM_CQS": "1", "FRNET_VARIANT": "ot128", "FRNET_POINT_TERMS": "2", "FRNET_MAP_DTYPE": "float32", "FRNET_CONV_TERMS": "1" } }, "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": { "FRNET_VARIANT": "ot128" }, "name": "ot128", "description": "FRNet for the Hesai OT128 (Autoware's default sensor_model; 1024x128 frustum grid)" }, { "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": { "FRNET_VARIANT": "qt128" }, "name": "qt128", "description": "FRNet for the Hesai QT128 (256x128 frustum grid, +-52.6 deg FOV)" } ], "default_profile": "ot128", "code_dir": "code", "verify": [ "assert 'single_chip_arch_1cq_no_dispatch_s' in open('/opt/tt-metal/tt_metal/impl/dispatch/topology.cpp').read()", "from tt_frnet.ttaw.device import eth_dispatch_patch_present as p; assert p(), 'ttaw does not see the ETH patch'", "import tt_frnet.server.app as a; assert a.app", "from tt_frnet.server.app import parse_mesh_shape as p; assert p('1x1') == p('(1, 1)') == p('1,1') == (1, 1)", "import numpy; assert int(numpy.__version__.split('.')[0]) < 2, numpy.__version__", "import onnx, yaml, huggingface_hub, safetensors, PIL", "from tt_frnet.api import FRNet; assert FRNet.DEFAULT_REVISION == 'a53a1c11b0b28d31fd50a03abef5db0e830a5b3c'", "import ttnn; assert hasattr(ttnn, 'DispatchCoreConfig') and hasattr(ttnn, 'begin_trace_capture') and hasattr(ttnn, 'execute_trace') and hasattr(ttnn, 'release_trace')", "from pathlib import Path; d = Path('/opt/tt-metal/tt_frnet'); assert all((d / 'samples' / f'synthetic_{v}.npz').is_file() and (d / 'samples' / f'synthetic_{v}.{v}.reference.json').is_file() and (d / 'calib' / f'synthetic_{v}.json').is_file() for v in ('ot128', 'qt128'))", "from pathlib import Path; assert Path('/opt/tt-metal/tt_frnet/ttaw/ops/kernels/segment_reduce_dm.cpp').is_file()", "from tt_frnet.ttaw.ops import kernel_path; kernel_path('segment_reduce_dm.cpp')" ], "built": { "image": "tt-model/frnet-p150:85cbf6cc72b9", "repo": "changh95/frnet-p150", "tt_model_version": "0.1.0", "created_at": "2026-10-09T17:04:34+00:00", "tt_metal": { "sha": "44d66500520fda9f2c7060c0f6b41ec48f7ab37e", "describe": "v0.80.0-dev20261006-78-g44d6650052-dirty", "dirty": true, "scm_version": "0.65.2.dev11169+g44d66500520", "mode": "local", "remote": "https://github.com/tenstorrent/tt-metal.git", "branch": "main", "pushed": true }, "code_sha256": "f0b62790446a51a86fe941bb4367561fecd9c560adc4d02b9b25b1e364358ede", "image_digest": "sha256:85cbf6cc72b9c535c2f44cec2b2145c8fb940d214874c23c918adfc66a51769c" }, "card": { "description": "FRNet (Autoware lidar_frnet): the network Autoware deploys (autoware_lidar_frnet, weights AutowareFoundation/lidar_frnet v2.0) running on one Tenstorrent Blackhole p150 via tt-nn: one LiDAR sweep in the sensor frame (x, y, z, raw 0-255 intensity) in, a class id and probability for every point (27 T4 classes; Autoware's interpolated points included) out.\n", "quickstart": "The first start compiles the kernels and captures the traces (minutes on a cold cache, seconds later); the\nserver is ready when its log shows `Application startup complete`. Build a request from a file with\n`python3 code/tt_frnet/server/client.py --points code/tt_frnet/samples/synthetic_ot128.npz --calib-preset synthetic_ot128 --out req.json` (your own cloud: `--calib my_calib.json`); the QT128 network is the `qt128` profile (`tt-model serve --profile qt128 `), then\n`curl -s localhost:20000/predict -H 'Content-Type: application/json' -d @req.json`.\n", "architecture": "FRNet: frustum feature encoder (point MLP 8->64->128->256->256, per-cell max, 256->16) + frustum-range 2D CNN (stem, 4 residual stages with point-pixel fusion and attention, align-corners decoder) + per-point head (27-class softmax); one ONNX graph per sensor profile", "status": "Community port (first release, baseline; optimization pending), validated against the fp32 CPU reference on public driving data", "intended_use": "LiDAR 3D semantic segmentation for Autoware-style sensor setups (one Hesai OT128 or QT128 sweep in the sensor frame) on one Blackhole p150, as a drop-in for the TensorRT node's network.\n", "out_of_scope_use": "Safety-critical driving decisions (this is not a certified Autoware component); multi-chip meshes; batch > 1; inputs outside the Autoware sensor configuration the weights were trained for. \n", "usage": "`POST /predict` (JSON): `points` (base64 `.bin` / `.npy` / `.npz` / `.pcd`, sensor frame, fields x, y, z, intensity 0-255); `calibration` (`T_base_link_from_sensor` for the ego crop box, or `{\"preset\": name}`; optional `ego_crop_box`, `null` disables the box); optional `params` (`class_probability_threshold` 0.05, `filter_classes` \"drivable_surface\"), `output_format`. `GET /health`, `GET /info`, `GET /v1/models` (stub).\nFull request / response contract: `SERVING.md` section 3.\n", "performance": "| Metric | Performance |\n|---|---:|\n| Class agreement with the fp32 CPU reference, shipped sample | OT128 99.55 % · QT128 99.62 % of the points |\n| Class agreement, 113 public frames per profile (PandaSet 32, nuScenes mini_val 81) | OT128 99.66 % / 99.19 % pooled (worst frame 98.37 %) · QT128 99.29 % / 99.44 % (worst 98.10 %) |\n| Frozen device gates (17 OT128 / 5 QT128 frames; PCC >= 0.998, agreement >= 98.5 %) | all pass; OT128 min agreement 98.907 % (nuScenes 0916 kf40, 0.41 pt margin) |\n| Python `model()` call, shipped sample | OT128 292.6 ms · QT128 221.1 ms p50 |\n| Served `/predict` `timing_ms.total`, shipped sample | OT128 310.4 ms · QT128 228.9 ms median |\n| Device trace, one forward / back-to-back | OT128 210.02 / 209.95 ms · QT128 133.53 / 133.43 ms |\n| `from_pretrained` load, empty / warm JIT cache | OT128 156.6 / 7.5 s · QT128 151.9 / 6.6 s |\n\nETH dispatch, 1 CQ, 12x10 grid, batch 1, 2026-10-09; details in README.md \"Demo & Performances\".\n", "limitations": "- First release: baseline port, optimization pending (OPT_REPORT.md); the point-wise layers kept at two-term bf16 precision are 63 % (OT128) / 75 % (QT128) of the device time.\n- Narrow accuracy margin: 98.907 % agreement on the hardest gated frame (gate 98.5 %); 3 of 226 frame-profile pairs of the wider public set fall to 98.10-98.499 % (nuScenes scene-0916, out of domain).\n- FRNet is an opt-in, standalone Autoware node; this bundle is not a ROS 2 node and not a certified Autoware component.\n- Trained on T4 data from Hesai OT128 / QT128 sensors (not public); other sensors (PandaSet Pandar64, nuScenes HDL-32E) show a domain gap in the reference itself.\n- Batch 1, one sweep per request, one variant per process; fixed device shapes per profile (160,000 / 120,000 points, 60,000 cells).\n- Single p150 only (ETH dispatch patch; no multi-chip mesh); dispatch=worker is an A/B opt-in the numbers do not cover.\n- Not an OpenAI-compatible API; p150 power not measured.\n", "risks": "Device numerics: per-point probabilities differ slightly from the fp32 reference (see the agreement figures); points near a class boundary can change class. Validated against the fp32 reference on public driving data (no public OT128 / QT128 data exists); the mapped-label mIoU is a sanity check, not an accuracy claim.\n", "licensing": "- Weights: [AutowareFoundation/lidar_frnet](https://huggingface.co/AutowareFoundation/lidar_frnet) at tag `v2.0` (commit `a53a1c11b0b28d31fd50a03abef5db0e830a5b3c`), Apache-2.0 per its model card; not redistributed here. Trained by TIER IV with AWML on about 16,000 frames of the T4Dataset (Hesai OT128 / QT128 sensors; not public).\n- Pre-/post-processing ported from autoware_universe `perception/autoware_lidar_frnet` @ `9ceaccf026c31ffc5319bc9eeb4bd7bede0af3fd` (Apache-2.0).\n- Port and serving code (`code/`): Apache-2.0. Shipped samples: synthetic scans generated by `code/scripts/make_sample.py` (Apache-2.0).\n- Demo media: PandaSet renders (CC BY 4.0 + PandaSet Dataset Terms, attribution in media/ATTRIBUTION.md) and nuScenes renders (`*_NC`, CC BY-NC-SA 4.0, non-commercial).\n", "related": "Other Autoware models on Blackhole: the \"Autoware\" collection of https://huggingface.co/changh95\n", "license": { "id": "apache-2.0", "name": null, "link": null }, "pipeline_tag": "image-segmentation", "base_model": [ "AutowareFoundation/lidar_frnet" ] } } }