gpt-oss-120b on Tenstorrent p150x4
Serves openai/gpt-oss-120b by OpenAI at revision b5c939de. See the original model card for training and evaluation details.
gpt-oss-120b, OpenAI's 117B-parameter mixture-of-experts reasoning model (5.1B active parameters), served with vLLM for chat, reasoning and function calling.
Runs on Tenstorrent p150x4 β see the serving profiles below.
Packaged and published with tt-model-manager 0.1.0 (manifest schema 5.1).
At a glance
| Hardware | p150x4 |
| Context | 131,072 tokens |
| License | apache-2.0 |
Intended use
Chat, reasoning, coding and function calling through an OpenAI-compatible API.
Prerequisites
- The Tenstorrent CLI,
tt:uv tool install tenstorrent(or use tt-model alone, see the Quickstart) - Docker
- Tenstorrent hardware: p150x4
- Four P150 chips: two P300C boards (a QuietBox 2) or four P150 boards
Quickstart
tt serve tt-hous/gpt-oss-120b
tt serve downloads the Docker image and the openai/gpt-oss-120b at b5c939de8f754692c1647ca79fbf85e8c1e70f8a weights (into your HF cache; they are not in the image), then starts an OpenAI-compatible server on port 20000 (or the next free port, if that one is busy). The first start compiles kernels for your device, which takes several minutes; the server is ready when it logs Application startup complete.
Without tt-cli: tt-model serve tt-hous/gpt-oss-120b.
Serving profiles
Select a different serving profile using --profile.
| profile | hardware | mesh | max_num_seqs | max_model_len | description |
|---|---|---|---|---|---|
default (default) |
p150x4 | P150x4 | 32 | 131072 | Interactive and agentic traffic: chat, multi-turn, agents, RAG, mixed prompt lengths. Long prompts are prefilled in 8,192-token steps with 8 decode steps for the running users between the steps of one prompt, so every user keeps receiving tokens; prefix caching on. |
throughput |
p150x4 | P150x4 | 32 | 131072 | Bulk work where only the time to finish a batch counts (evals at 32 concurrent requests, offline summarization or classification, batch document processing): prefill-first scheduling in 32,768-token steps, no decode steps between the steps of one prompt; prefix caching on. Lower time to finish a burst of long prompts, no streaming during another user's long prefill. |
Capabilities
The server speaks the OpenAI API at http://127.0.0.1:20000/v1 (or whichever port your serve command reported; chat completions, completions, and /v1/models). Pass "model": "openai/gpt-oss-120b" β the weights id, not this package's name.
Tool calling is enabled (--tool-call-parser openai): a request that passes tools comes back with tool_calls and finish_reason: tool_calls.
Pick a profile for the traffic. default prefills long prompts in 8,192-token steps and
keeps decoding running requests between the steps: use it for chat, agents and mixed prompt
lengths. throughput prefills first in 32,768-token steps and pauses decode for every
request while a long prompt prefills: use it for batch work. Where the speed table below
measures both profiles at the same point, throughput finishes 8 or 32 prompts of 16,384
tokens and 8 prompts of 32,768 tokens 7 to 9% sooner than default, and 32 prompts of
4,096 tokens about 1% sooner.
Reasoning comes back separately from the answer. max_tokens covers both. The server keeps
clamp(max_tokens // 8, 128, 1024) tokens of every chat completion's budget for the
answer, so a request that runs out of budget while reasoning still returns an answer
(finish_reason: "length" with non-null content). reasoning_effort (low, medium,
high) sets how much the model reasons, and
usage.completion_tokens_details.reasoning_tokens reports what it used.
Sampling: temperature 0, or top_k of 32 or lower, is sampled on the device. The request
fields that move a batch to host sampling are listed under Limitations.
Prefix caching is on in both profiles. The prefix-cache table under Expected performance shows what a cache hit saves.
Expected performance
| eval | this package | reference | prompts | notes |
|---|---|---|---|---|
| GPQA Diamond, CoT zero-shot | 78.3% | 80.1% | 198 | boxed-letter extraction |
| AIME 2025 | 90.0% | 92.5% | 30 | |
| AIME 2024 | 90.0% | 95.8% | 30 | |
| MMLU, generative | 85.3% | 90.0% | 3,529 (25% of each subject) | reference is the full set |
| MMMLU, 14 languages | 82.2% | 81.3% | 9,842 (5% of each) | reference is the full set |
| HLE, text-only | 13.2% | 14.9% | 500 | judge: gpt-oss-120b here, o3-mini for the reference |
| SWE-bench Verified | 50.0% | 62.4% | 50 (first 50 by id) | mini-swe-agent here; reference: 500 instances, OpenAI scaffold |
| IFEval, prompt-level strict | 85.8% | 78.2% | 541 | reference: frozebench run |
| IFEval, instruction-level strict | 90.2% | β | 541 | |
| IFEval, prompt-level / instruction-level loose | 88.9% / 92.2% | β | 541 | |
| AIME 2025, tt-inference-server release workflow | 76.67% | 92.5% | 30 | release-workflow recipe, see below |
| GPQA Diamond, tt-inference-server release workflow | 71.72% | 80.1% | 198 | release-workflow recipe, see below |
| MMLU, tt-inference-server release workflow | 86.06% | 85.9% | 14,042 | release-workflow recipe, see below |
The reference figures are from the
OpenAI model card
at reasoning effort high without tools, except IFEval. Evals run through the chat API:
reasoning_effort high, one sample per item, temperature 1.0, top_p 1.0, top_k 32,
output budgets of 65,536 tokens for GPQA Diamond and AIME, 32,768 for HLE and 8,192 for
MMLU and MMMLU. IFEval: reasoning_effort medium, greedy, 4,096 tokens, 32 concurrent
requests. The last three rows use the tt-inference-server release workflow
(lm-evaluation-harness over chat completions, temperature 1.0, seed 42; AIME 2025 and
GPQA Diamond at reasoning_effort high with 122,880 output tokens, MMLU at low with 65,536).
In the release-workflow AIME 2025 and GPQA Diamond rows, a response whose reasoning used the
whole 122,880-token budget returned no answer and counts as a miss.
| profile | ISL | OSL | concurrency | N | TTFT (ms) | prefill tok/s/u | decode tok/s/u | E2EL (s) |
|---|---|---|---|---|---|---|---|---|
| default | 128 | 128 | 1 | 1 | 247 | 518 | 65.4 | 2.19 |
| default | 128 | 128 | 8 | 1 | 559 | 229 | 30.7 | 4.70 |
| default | 128 | 128 | 32 | 1 | 991 | 129 | 20.1 | 7.32 |
| default | 1,024 | 256 | 1 | 1 | 291 | 3,515 | 64.6 | 4.24 |
| default | 1,024 | 256 | 8 | 1 | 1,564 | 655 | 30.4 | 9.95 |
| default | 1,024 | 256 | 32 | 1 | 4,344 | 236 | 18.5 | 18.10 |
| default | 2,048 | 128 | 1 | 1 | 590 | 3,469 | 64.2 | 2.57 |
| default | 2,048 | 128 | 8 | 1 | 2,768 | 740 | 29.1 | 7.13 |
| default | 2,048 | 128 | 32 | 1 | 6,731 | 304 | 13.2 | 16.36 |
| default | 4,096 | 256 | 1 | 1 | 724 | 5,661 | 63.8 | 4.72 |
| default | 4,096 | 256 | 8 | 1 | 4,572 | 896 | 26.3 | 14.25 |
| default | 4,096 | 256 | 32 | 1 | 13,488 | 304 | 11.6 | 35.56 |
| default | 16,384 | 256 | 1 | 1 | 2,668 | 6,140 | 62.1 | 6.78 |
| default | 16,384 | 256 | 8 | 1 | 9,384 | 1,746 | 12.2 | 30.29 |
| default | 16,384 | 256 | 32 | 1 | 58,837 | 278 | 4.8 | 112.07 |
| default | 32,768 | 256 | 1 | 1 | 5,649 | 5,800 | 59.9 | 9.91 |
| default | 32,768 | 256 | 8 | 1 | 28,265 | 1,159 | 9.4 | 55.44 |
| default | 32,768 | 256 | 32 | 1 | 112,215 | 292 | 5.3 | 160.06 |
| default | 65,536 | 256 | 1 | 1 | 12,417 | 5,278 | 56.0 | 16.97 |
| default | 65,536 | 256 | 8 | 1 | 62,762 | 1,044 | 7.7 | 95.79 |
| default | 65,536 | 256 | 32 | 1 | 238,147 | 275 | 6.4 | 277.85 |
| default | 130,816 | 256 | 1 | 1 | 30,010 | 4,359 | 49.8 | 35.13 |
| default | 130,816 | 256 | 8 | 1 | 152,025 | 860 | 8.1 | 183.51 |
| default | 130,816 | 256 | 32 | 1 | 569,790 | 230 | 7.5 | 603.93 |
| throughput | 4,096 | 256 | 16 | 1 | 10,999 | 372 | 16.7 | 26.31 |
| throughput | 4,096 | 256 | 32 | 1 | 18,117 | 226 | 15.0 | 35.15 |
| throughput | 16,384 | 256 | 1 | 1 | 2,810 | 5,831 | 62.0 | 6.92 |
| throughput | 16,384 | 256 | 8 | 1 | 15,432 | 1,062 | 20.0 | 28.16 |
| throughput | 16,384 | 256 | 16 | 1 | 25,921 | 632 | 8.6 | 55.59 |
| throughput | 16,384 | 256 | 32 | 1 | 68,592 | 239 | 7.7 | 101.56 |
| throughput | 32,768 | 256 | 1 | 1 | 5,616 | 5,834 | 59.9 | 9.88 |
| throughput | 32,768 | 256 | 4 | 1 | 16,576 | 1,977 | 25.3 | 26.66 |
| throughput | 32,768 | 256 | 8 | 1 | 27,399 | 1,196 | 11.1 | 50.33 |
| throughput | 65,536 | 256 | 1 | 1 | 11,552 | 5,673 | 55.9 | 16.11 |
| throughput | 65,536 | 256 | 2 | 1 | 19,865 | 3,299 | 25.4 | 29.92 |
| throughput | 65,536 | 256 | 4 | 1 | 32,628 | 2,009 | 12.5 | 52.96 |
| throughput | 130,816 | 256 | 2 | 1 | 46,100 | 2,838 | 12.9 | 65.83 |
Means over one run per row on a QuietBox 2 (two P300C boards), against this package's image,
with a closed-loop latency client: random-token prompts of exactly ISL tokens, output pinned
to OSL tokens, 4 requests per user up to 4,096 input tokens, 2 per user at 16,384 and 1 per
user above. The default rows are selected from a sweep at 1 to 32 concurrent users. Random
prompts never hit the prefix cache. Prefill tok/s/u is ISL divided by TTFT, so above
concurrency 1 it includes queueing time: at most 17 sequences of 16k tokens, 8 of 32k, 4 of
64k or 2 of 128k are resident at once, and later requests wait for admission.
Prefix cache, measured with vllm bench serve (a shared random prefix plus a 512-token
unique suffix, 64 output tokens, greedy, one user, 12 requests), median TTFT:
| shared prefix (tokens) | TTFT without a cache hit (ms) | TTFT with a cache hit (ms) |
|---|---|---|
| 16,384 | 3,024 | 820 |
| 32,768 | 6,059 | 929 |
| 65,536 | 13,150 | 1,161 |
A cache hit still prefills about 2,560 tokens plus the new suffix, at any prefix length. A shared prefix under about 5,000 tokens saves little.
Limitations
- Needs four P150 chips; P150 and P150x2 are not offered. Tested on one QuietBox 2 only.
- Not for workloads that need OpenAI's built-in Python or browser tools: none is provided,
so OpenAI's "with tools" results do not apply. A malformed tool-call JSON from the model
is passed through as is, and an empty final message ends with
finish_reason: "stop", so agent scaffolds need a retry for both. - Capacity is 296,960 tokens of context across all requests. Further requests wait for admission, and the wait is part of TTFT. Prompts above 2,048 tokens prefill one at a time, and the first prompt of a new length adds a few seconds. 9 to 16 concurrent requests decode at about 50 to 58 ms per token instead of 42.
- One request with
min_p,logit_bias,bad_words,allowed_token_ids,min_tokens, structured output, anylogprobs, or a non-zerotemperaturewithtop_kabove 32 or unset, moves the whole batch to host sampling and slows decode for every user until it finishes. max_tokenscovers reasoning and answer. A hard problem under a small budget gets a short, truncated answer. Requests withnabove 1, logprobs,ignore_eosor a required tool call have no answer reserve and can return nullcontentwithfinish_reason: "length".- With 8 or more concurrent requests at 16k tokens and up, one request per batch occasionally receives its own prompt streamed back as generated text, in one chunk of up to 725,000 characters. Clients should tolerate an oversized first chunk.
- Under sustained 32-user load with 122,880-token budgets, the server can fail with
no free device state slot. Submitting such work in fixed batches of 32 avoids it.
Licensing
Weights: Apache-2.0. Port and serving code: Apache-2.0, from public branches of tt-metal, vLLM and vllm-tt-plugin.
Feedback
Questions or problems with this package: open a discussion at https://huggingface.co/tt-hous/gpt-oss-120b/discussions β that is what reaches its author. A problem with the tt tooling itself: tt report issue (collects your environment and opens a prefilled issue against tenstorrent/tt-cli). Product feedback: support@tenstorrent.com.
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 | ee5703cefab26d5360728770800d48d442a048fd |
| vLLM | vllm-0.26.0.dev4+g2bbd2a6d9-cp310-cp310-linux_x86_64.whl β a wheel the author built |
| vllm-tt-plugin | 30e9b8ea4d38d1a2ca3cf7c2c7da542747bf91b2 |
code/ digest |
325798b898bb4c4a (sha256, first 16 hex digits) |
| built | 2026-09-29T16:02:28+00:00 by tt-model 0.1.0 |
Model tree for tt-hous/gpt-oss-120b
Base model
openai/gpt-oss-120b