depth-anything-3-p150

Depth Anything 3, metric branch (DA3Metric-Large: DINOv2-L backbone + DPT head, 0.35 B params) for metric monocular depth in metres, with the 24-block backbone running on one Tenstorrent Blackhole p150a via tt-nn: image in, 518×518 depth map in metres out. Weights: depth-anything/DA3Metric-Large · Paper: arXiv:2511.10647 · Upstream code: ByteDance-Seed/Depth-Anything-3 · Port: changh95/tt-Depth-Anything-3

Runs on p150 (mesh P150).

Packaged and published with tt-model-manager 0.1.0 (manifest schema 5.1).

Quickstart

tt-model pull  changh95/depth-anything-3-p150 --with-weights
tt-model serve changh95/depth-anything-3-p150
  • Weights depth-anything/DA3Metric-Large at 4010e39f3634 go to your HF cache; the image does not contain them.
  • Serves on port 20000 (or the next free port); ready when the log says Application startup complete.

Run with tt-cli

tt serve changh95/depth-anything-3-p150
printf '{"image":"%s"}' "$(base64 -w0 media/source_1.png)" > req.json
curl -s localhost:20000/predict -H 'Content-Type: application/json' -d @req.json
tt model stop changh95/depth-anything-3-p150
  • POST /predict: image (base64 PNG/JPEG); optional output_format (png 16-bit PNG default | npz float32 | json), resize_to_original (false), max_depth_m (null), png_scale (1000 = millimetres).
  • GET /health, GET /info.

Response

{"depth": {"format": "png16", "data": "...", "scale": 1000.0, "decode": "depth_m = uint16_value / scale",
           "saturation_m": 65.535, "saturated_pixels": 0},
 "shape": [518, 518], "original_size": [375, 1242], "model_input_size": [518, 518],
 "resized_to_original": false, "units": "metres", "max_depth_m": null,
 "stats_m": {"min": 1.64, "p05": 1.76, "median": 4.45, "p95": 20.09, "max": 42.52},
 "timing_ms": {"preprocess": 7.9, "infer": 217.8, "postprocess": 24.5, "total": 250.2}}
  • depth.data is a base64 16-bit grayscale PNG at the model's native 518×518 (shape is [H, W]); depth_m = uint16 / scale, saturating at 65535 / png_scale m.
  • output_format: "npz" returns a lossless float32 depth_m array instead; resize_to_original: true resizes to the input's original_size.

Demo

Input (KITTI Eigen test frames) Metric depth on p150a (turbo colormap, 1–50 m log-clipped; bright = near)

Accuracy and speed

Metric Value
KITTI Eigen AbsRel (697 images), chip vs fp32 CPU reference 0.0930 vs 0.0906 (δ<1.25: 95.88% vs 95.91%)
Pearson PCC vs canonical DA3-Metric output 0.999641
Inference, served over HTTP (warm, batch 1, 518×518, 16 torch threads) 202–245 ms infer · ~250–278 ms end-to-end (3.6–4 img/s)

Caveats

  • Every image is squashed (no letterbox) to 518×518 and ImageNet-normalised; one image per request, batch 1.
  • Split pipeline: the DINOv2-L backbone runs on chip in bf16 (HiFi4, fp32 accumulate); patch-embed and the DPT head run on the host CPU in bf16, so end-to-end latency depends on the host.
  • The port implements no sky head: depth = exp(raw), so far-sky pixels can exceed 80 m; pass max_depth_m (the KITTI eval caps at 80) or use npz, since the default 16-bit PNG saturates at 65.5 m.
  • Not an OpenAI-compatible API; GET /v1/models is a stub so the tt-model ready card does not 404.
  • Validated on tt-metal v0.78.0-dev20260820 (main 8b98410e730), single p150a only.

Licensing

Provenance

The exact sources the image was built from — code/ in this repo is byte-identical to the model code inside the image:

component built from
tt-metal 8b98410e730bb504fea43a88609756e34821d91d
code/ digest 049807d21fe970d4 (sha256, first 16 hex digits)
built 2026-09-12T13:30:07+00:00 by tt-model 0.1.0
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Paper for changh95/depth-anything-3-p150