Skip to content
André Borchert edited this page Sep 18, 2026 · 22 revisions
TinyTitan

FAQ

Which model should I install?

Start with Ornith 1.5 8-bit using standard responses and Thinking off. It is the default installer, launcher, benchmark, and real-inference baseline because it passed every 8-bit cell in the current coding/tooling qualification; its fastest correct cell also beat the passing 4-bit cell. Choose Ornith 4-bit when about 19.5 GB storage and faster raw decode matter more than that result. Qwen 3.6 remains available explicitly.

Can I still use 6-bit?

No. Six-bit support was withdrawn in 3.9. Existing files are historical and not necessarily corrupt, but current installers and runtimes support 4-bit and 8-bit.

Why does TinyTitan stream from SSD?

The routed expert pool is larger than the desired resident working set. TinyTitan keeps shared weights and a bounded expert cache resident, then reads only the experts selected for each token. This keeps memory use controlled at the cost of storage-dependent decode speed.

Why is the first token slow?

The prompt must be prefilled before decode begins. Large coding clients can send thousands of tokens of instructions and tools. Use prompt-state reuse for continued conversations, or the chat-only fast alias for direct questions.

What is the fast alias?

ornith-1.5-35b-a3b_8-Bit-fast uses the same model weights but removes known coding-CLI system prompts, tool definitions, and reminder scaffolding before prefill. It can answer direct questions much sooner, but it cannot perform the stripped agent tool loop. Use ornith-1.5-35b-a3b_8-Bit for tool-based work. A manually served Qwen 3.6 model exposes the equivalent qwen3.6-35b-a3b_8-Bit[-fast] IDs. Every id ends in the routed-expert width, so check /v1/models rather than assuming the bare name.

Why are cached tokens still zero?

The first request is a miss. A hit requires an exact compatible prefix and the same model, runtime profile, context, template, and tools. RAM entries disappear when the server restarts or unloads. Configure --prompt-cache-disk when compatible state must survive restarts.

Can more RAM make it faster?

Sometimes, when the expert cache is too small. Beyond that point, more slots add memory pressure without helping. The default is a shipped per-install entry, measured on that install rather than derived by a rule: 10 GiB (160 slots) at 4-bit and 12 GiB (96 slots) at 8-bit for the 35B families, and 12 GiB (96 slots) at 4-bit, 9.5 GiB (40 slots) at 8-bit for Qwen3.8-Flash-Next. The 35B families have flattened above a 90% hit rate, where extra slots buy little; Qwen3.8 is still climbing at 96 because 512 experts at top-10 spread far wider than 128 at top-8 — and on a 24 GB machine its 8-bit row ships the measured middle of the range, 40 slots, because 48 is faster but grows swap run over run. The budget is clamped to half of physical memory, so a smaller Mac falls back rather than over-committing. Benchmark before changing it with --ram-budget.

Does TinyTitan need MLX, or an MLX release of a model?

No to both. TinyTitan has no MLX dependency: inference is native Swift over hand-written Metal kernels, and the package depends only on a tokenizer and an HTTP server.

What it needs is a quantization layout — affine, group size 64, BF16 scale and bias, packed into u32. MLX happens to write exactly that, which is why an mlx-community release can be repacked directly. It is a convenient supply of checkpoints, not a requirement.

An ordinary bf16 or fp16 safetensors checkpoint works too, and is usually the better source: quantizing once from the original weights beats inheriting somebody else's quantization error. The quantizer is in this repository (quantize_affine() in tools/prepare_ornith_mtp.py). GGUF is the weakest source, because its k-quants would have to be dequantized and re-quantized — lossy twice.

The real cost of adding a model is the architecture, not the file format. A model that fits a family TinyTitan already implements is largely a conversion job; a new architecture needs kernels and a numerical parity pass.

Why is 8-bit slower?

It stores and reads more expert data per generated token. Its value is higher weight fidelity, not throughput.

How do I enable 512K or 1M context?

Enable YaRN with --rope-scaling yarn. It selects 1M by default; add --max-context 524288 for 512K. Native RoPE remains capped at 262,144 tokens. The KV cache defaults to 8-bit and is independent of the installed model's weight precision. At 1M, use --kv-bits 4 on a memory-constrained Mac. YaRN cannot currently be combined with MTP. See Runtime Controls for commands and memory estimates.

The model stopped loading after I moved it. Is it corrupt?

Usually not. The receipt is bound to the original absolute path. Reissue it in place:

swift run -c release TinyTitanRepack \
  --verify-install \
  --input-gturbo /new/path/to/model

Do not edit the receipt manually.

Can I run the CLI and the server together?

Do not run multiple model processes. Check with:

pgrep -fl 'TinyTitanServer|TinyTitanCLI|TinyTitanPackageTests|swiftpm-testing-helper|mlx_lm|mlx-lm'

Stop only a process you launched.

Does TinyTitan execute tool calls?

No. It can generate function-call requests, but the client decides whether to run them and applies its own permission policy.

Can I expose the server to another machine?

No. It has no remote authentication or TLS and must remain on 127.0.0.1. Do not proxy or tunnel it.

Is Ornith supported?

Yes, for text generation and function calls in 4-bit or 8-bit. TinyTitan imports the pinned official Ornith MLX text checkpoint into the same bounded, SSD-streamed Qwen3.5-MoE runtime used by Qwen 3.6. Ornith's own tokenizer and chat template are installed with the model. Vision is not supported. Ornith's native MTP layer can be prepared as an experimental sidecar, but measured M3 decode did not improve, so MTP is disabled by default. Qwen 3.6 remains available.

For installation problems, return to Getting Started. For server setup, use Local Server.

Clone this wiki locally