Instructions to use openhubresearch/ATLAS-OLMo-3-32B-Think-v4 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use openhubresearch/ATLAS-OLMo-3-32B-Think-v4 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="openhubresearch/ATLAS-OLMo-3-32B-Think-v4")# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("openhubresearch/ATLAS-OLMo-3-32B-Think-v4", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use openhubresearch/ATLAS-OLMo-3-32B-Think-v4 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "openhubresearch/ATLAS-OLMo-3-32B-Think-v4" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "openhubresearch/ATLAS-OLMo-3-32B-Think-v4", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/openhubresearch/ATLAS-OLMo-3-32B-Think-v4
- SGLang
How to use openhubresearch/ATLAS-OLMo-3-32B-Think-v4 with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "openhubresearch/ATLAS-OLMo-3-32B-Think-v4" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "openhubresearch/ATLAS-OLMo-3-32B-Think-v4", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "openhubresearch/ATLAS-OLMo-3-32B-Think-v4" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "openhubresearch/ATLAS-OLMo-3-32B-Think-v4", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use openhubresearch/ATLAS-OLMo-3-32B-Think-v4 with Docker Model Runner:
docker model run hf.co/openhubresearch/ATLAS-OLMo-3-32B-Think-v4
ATLAS-OLMo-3-32B-Think-v4
A 32B reasoning model on a single 40 GB GPU. OLMo-3-32B-Think (AI2) served by the ATLAS pure-Rust inference engine with AWQ 4-bit weight-only quantization β 27.2 GB VRAM on one A100-SXM4-40GB, through a zero-external-dependency Rust + custom-CUDA stack.
Status: β
In production. This 32B configuration is what the live endpoint (atlas.thebeastagi.com / demo.thebeastagi.com) serves today on a dedicated A100-40GB (astra-01). The W4 serving path is merged to main in web3guru888/ATLAS; 644/644 workspace tests green on main.
TL;DR
| Question | Answer |
|---|---|
| What is this? | The serving configuration + measured results for OLMo-3-32B-Think running through ATLAS's custom W4A32 CUDA path |
| Does 32B fit on a 40 GB A100? | Yes β 27.2 GB total @ 16K context, 13.8 GB headroom (nvidia-smi: 27,170 / 40,960 MiB) |
| Is it smarter than the 7B? | Yes, by a lot β GSM8K 100% vs 88%, MMLU 82% vs 54%, same harness |
| Is it fast? | Decode is usable (~14.6 tok/s); long-prompt TTFT improved ~5Γ with batched prefill (#22, deployed 2026-07-08) β kernel-occupancy work continues (see Limitations) |
| Are the weights here? | No β weights are the unmodified community AWQ quant (cyankiwi/Olmo-3-32B-Think-AWQ-4bit); ATLAS is the engine, not a fine-tune |
Benchmarks (measured on the A100-40GB, ATLAS stack)
Same harness and sampling as the 7B v4.2.0 numbers (temperature 0.6, top-p 0.95, AI2 reference system prompt, <think> primer):
| Benchmark | 32B AWQ-4bit (this config) | 7B BF16 baseline | Notes |
|---|---|---|---|
| GSM8K (25 problems, same rows) | 25/25 = 100% | 88% | 22.2K completion tokens total |
| MMLU (40 questions, 32 subjects) | 33/40 = 82% | 54% (MMLU-100, different sample) | 4 of 7 misses were output-length truncations at the 1,500-token cap β accuracy β 100% where reasoning completed |
| Code (5 tasks, execution-verified) | 5/5 = 100% | HumanEval-15: 73.3% pass@1 | fib, is_prime, reverse_words, two_sum, balanced-brackets β all pass their tests |
β οΈ Sample sizes are honest but small. These were prototype-validation runs. Expanded suites (GSM8K-100, MMLU-200, HumanEval-50) will be run in a scheduled maintenance window on the production box; this card will be updated with the results and per-item JSON when they complete.
Performance & footprint (A100-SXM4-40GB)
| Metric | 32B W4 (this config) | 7B BF16 (reference) |
|---|---|---|
| VRAM total @ 16K context | 27.2 / 40 GB | ~16 GB |
| Decode throughput (short ctx) | ~14.6 tok/s | ~50 tok/s |
| Decode @ ~1.2K ctx | 10.4 tok/s | ~45 tok/s |
| TTFT (short prompt) | ~2β4 s (measured 3.9 s pre-#22; short prompts see little change) | ~1.5 s |
| TTFT @ ~1.2K-token prompt | ~23β37 s (was ~100β122 s before batched prefill #22 landed β merged & deployed 2026-07-08, ~5Γ measured) | ~25 s |
| Model load time | ~75 s (19.6 GB checkpoint, incl. GPU upload) | ~200 s |
| Host RSS | ~11 GB (streaming loader) | β |
VRAM breakdown: W4 weights ~17.9 GB + BF16 lm_head ~1.0 GB + f32 KV cache ~8.6 GB (@16K) + scratch. Decode scales as expected for a memory-bandwidth-bound GEMV stack (4.6Γ params β 3.4Γ slower than 7B). The theoretical bandwidth ceiling for streaming ~19 GB of weights per token on an A100 is ~75 tok/s β closing the gap is kernel-occupancy work (#23).
Architecture deep-dive
OLMo-3-32B-Think is a dense decoder-only transformer with an unusually serving-friendly attention layout:
| Property | Value |
|---|---|
| Parameters | ~32.2B dense |
| Layers | 64, in a repeating [SWA, SWA, SWA, full] block Γ16 β 48 sliding-window + 16 full-attention layers |
| Sliding window | 4,096 tokens (SWA layers) |
| Attention | GQA β 40 query heads / 8 KV heads, head_dim 128 |
| Hidden / FFN | 5,120 / 27,648 (SwiGLU) |
| Norms | Post-norm + QK-norm (full-projection RMSNorm on Q and K) |
| RoPE | ΞΈ = 500,000; YaRN Γ8 (8,192 native β 65,536 max), attention_factor β 1.208 |
| Vocab | 100,278 (BPE; new-generation [["a","b"], β¦] merges format) |
Why the 3:1 SWA layout matters for serving
Full f32 KV across all 64 layers costs 512 KiB per token β 8 GB at 16K context. But only the 16 full-attention layers actually need KV for the whole context β the 48 SWA layers never look back more than 4,096 tokens. An SWA-aware KV cache needs only:
16 full Γ 16,384 tok + 48 SWA Γ 4,096 tok β 3.75 GB (f32) β vs 8 GB naive
16 full Γ 65,536 tok + 48 SWA Γ 4,096 tok β 5.1 GB (BF16) β full 64K context, still fits in 40 GB
That means the full 64K YaRN context is reachable on this same 40 GB card β tracked as #24 together with BF16 KV.
Quantization recipe
Weight-only int4, symmetric (no zero-points), group size 32, MSE observer, AWQ via llm-compressor; lm_head kept BF16. Stored in compressed-tensors "pack-quantized" layout β verified empirically against pack_to_int32 (col j β u32 word j/8, little-endian nibble, stored nibble = q+8). The layout is directly kernel-friendly: ATLAS ingests it with no repacking step, and dequantizes inline in a custom W4A32 GEMV kernel (warp-per-row, per-group BF16 scales hoisted per packed word). Runtime precision is W4 weights Γ f32 activations.
What ATLAS implements for the W4 path
gemv_w4_kernel/atlas_gemv_w4_f32β W4A32 GEMV CUDA kernel with inline int4 dequant- Direct
compressed-tensorsingestion β no repacking, no conversion step - Streaming W4 shard loader β each Linear uploaded to VRAM as soon as its packed + scale halves are seen; peak host RSS β 11 GB (a naive f32 init would need ~128 GB)
- Tokenizer fix for new-generation checkpoints β BPE merges as
[["a","b"], β¦]pairs now parse correctly (with regression tests) - Full GPU attention path plus HF-reference-fidelity fixes (YaRN correction range, layer-type RoPE split, full-projection QK-norm) β output is differential-tested against
transformers
How to use
Via the ATLAS API (OpenAI-compatible)
# Build ATLAS (W4/32B support is on main)
git clone https://github.com/web3guru888/ATLAS.git
cd ATLAS
cargo build --release -p atlas-cli
# Fetch the AWQ 4-bit checkpoint (~19.6 GB)
hf download cyankiwi/Olmo-3-32B-Think-AWQ-4bit --local-dir /models/olmo3-32b-think-w4
# Serve
./target/release/atlas api serve \
--weights /models/olmo3-32b-think-w4 \
--model olmo3-32b \
--port 8080 \
--max-tokens 3584
# Query (chain-of-thought is returned in message.reasoning,
# the visible answer in message.content)
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "olmo3-32b",
"messages": [{"role": "user", "content": "What is 17 + 25?"}],
"max_tokens": 2048,
"temperature": 0.6,
"top_p": 0.95
}'
Via HuggingFace Transformers (compressed-tensors loader)
# pip install transformers compressed-tensors accelerate
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "cyankiwi/Olmo-3-32B-Think-AWQ-4bit"
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_id)
messages = [{"role": "user", "content": "What is 17 + 25?"}]
inputs = tokenizer.apply_chat_template(
messages, add_generation_prompt=True,
return_tensors="pt", return_dict=True,
).to(model.device)
output = model.generate(**inputs, max_new_tokens=2048, temperature=0.6, top_p=0.95, do_sample=True)
print(tokenizer.decode(output[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
Prompting guide for Think models β read this before judging output quality
OLMo-3-Think is an RL-trained reasoning model: it emits a long hidden <think>β¦</think> chain-of-thought before the visible answer. Nearly every "the model gave me a broken/empty answer" report traces back to token-budget handling, not the model:
- Set a generous
max_tokensβ β₯ 2048 recommended. The think block routinely consumes 500β2,000+ tokens (hard code/planning prompts can need several thousand) before the first visible answer token. With a small budget the generation is cut off mid-think and the answer never appears. Most apparent "wrong answers" from Think models are actually truncations. - Server-side answer reserve (deployed on the live endpoint; ATLAS commit
cc7784a, branchfix/think-budget-answer-reserve). The ATLAS API now protects against exactly this failure: ifmax_tokensis exhausted while the model is still inside<think>, the server force-closes the think block with a wrap-up cue and continues decoding from the intact KV cache for up toATLAS_ANSWER_RESERVEextra tokens (default 512, env-tunable,0disables) β so a visible answer is always emitted. Measured on a 5-prompt battery: zero-answer rate 2/5 β 0/5, with byte-identical outputs on requests that don't trigger the reserve. The chat-endpoint defaultmax_tokensis also now 2048 (was 512). - Use the reference sampling: temperature 0.6, top-p 0.95, top-k 50, min-p 0.05,
repetition_penalty1.0 (AI2 reference; penalties above 1.0 measurably make the model ramble without concluding). - Prompt format: ChatML (
<|im_start|>role\nβ¦<|im_end|>), with the generation prompt ending inside a think block:<|im_start|>assistant\n<think>. The ATLAS chat endpoint applies this automatically; the chain-of-thought comes back asmessage.reasoning(OpenRouter reasoning-model convention) and the answer asmessage.content. If you use raw/v1/completions, you manage the template yourself. - Steer the thinking budget with a think-prefill. On open-ended prompts (especially code), free-form thinking can blow through even a 3,584-token cap. Via
/v1/completionswith a raw prompt, prime the trace: end your prompt with<think>Brief plan: β¦β the model completes a short plan and answers immediately and correctly. - Ask for structured finals ("End your reply with: Answer: ") β the visible answer after
</think>stays clean and parseable.
Key differentiator: J-space interpretability
Beyond raw serving, ATLAS exposes a Jacobian lens (J-space) over the model's forward computation β a first-class interpretability surface over the 5,120-dim residual stream for auditing what the model is doing internally during generation. Combined with the StigmergicHook trait (atlas-infer crate), inference hooks can read/write stigmergic memory in real time during token generation. Planned next: J-lens fit + validation on this 32B and a model-audit workflow (eval-awareness, fabrication, hidden-objective screening) that plain serving stacks don't offer.
Limitations & roadmap
We publish our weak spots on purpose. Current honest state:
| Limitation | Detail | Fix | Status |
|---|---|---|---|
| Prefill used to run token-by-token through the decode GEMV path | Batched/chunked prefill (GEMVβGEMM) | #22 β β merged & deployed 2026-07-08: ~5Γ measured on the live 32B (1.2K-token prompt ~122 s β ~23 s TTFT) | |
| Decode 14.6 tok/s vs ~75 tok/s bandwidth ceiling | Warp-per-row W4 GEMV at low occupancy | Kernel occupancy tuning (kernel_tuner / openevolve loop) | #23 β target 40+ tok/s |
| Served context 16K (model supports 64K) | f32 KV, not SWA-aware | BF16 + SWA-aware KV cache (see deep-dive) | #24 |
| Batch-1 serving | Single-request GEMV path | Batched decode after #22 | planned |
| 4-bit quality loss unmeasured for OLMo-3 | ~1β3% is the 32B-class community pattern, not OLMo-measured; our numbers exceed the 7B BF16 baseline by wide margins | W4-vs-BF16 study on identical benchmark sets (80 GB box) | planned |
| Small benchmark N | 25/40/5-item prototype validation | GSM8K-100 / MMLU-200 / HumanEval-50 in a scheduled window | planned β card update follows |
max_tokens exhausted inside <think> used to yield an empty visible answer |
Server-side answer reserve + max_tokens default 2048 (see prompting guide) |
β fixed & deployed 2026-07-08 (zero-answer rate 2/5 β 0/5 on the test battery) |
Community
- Found something interesting? Broke it? Open a Discussion β especially interested in: reasoning failures, quantization artifacts vs the BF16 base model, and long-context behavior reports.
- Engine work happens in the open: web3guru888/ATLAS β issues #22/#23/#24 are the current 32B performance campaign.
- Want to reproduce our numbers? The bench harnesses are simple single-file Python scripts against the OpenAI-compatible endpoint β ask in Discussions and we'll share them.
About ATLAS
ATLAS (Active-inference Training with Learned Adaptive Stigmergy) is a next-generation LLM framework built in pure Rust with zero external crate dependencies β the SQLite principle applied to AI infrastructure. It fuses:
- GraphPalace β Stigmergic memory palace with pheromone-guided navigation
- ASTRA β Live discovery engine hitting NASA, WHO, World Bank APIs
- TRM-CausalValidator β 7M-param recursive validator
- Champagnat n-Morphic Framework β biologically-grounded training dynamics
22 crates. 644 tests. One coherent system. Zero external Rust dependencies.
Website: atlasagi.org Β· 7B sibling: ATLAS-OLMo-3-7B-Think-v4 Β· Live API: atlas.thebeastagi.com Β· Organization: OpenHub Research Β· Author: Robin Dey
Citation
@software{atlas2026,
title = {ATLAS: Active-inference Training with Learned Adaptive Stigmergy},
author = {Robin Dey},
year = {2026},
institution = {OpenHub Research, Thailand},
url = {https://github.com/web3guru888/ATLAS},
note = {Pure Rust LLM framework. 32B chapter: OLMo-3-32B-Think served
via AWQ 4-bit (W4A32 custom CUDA GEMV) in 27.2 GB on a single
A100-40GB. GSM8K 100% (25/25), MMLU 82%, exec-verified code 5/5
through the ATLAS serving stack. Merged to main, 644 tests.}
}
Model tree for openhubresearch/ATLAS-OLMo-3-32B-Think-v4
Base model
allenai/Olmo-3-1125-32B