Local LLM inference, hand-tuned for one chip. The Ryzen AI Max+ 395.
- Model
- Qwen3.6-35B-A3B-FP8
- Machine
- Ryzen AI Max+ 395
- Shape
- 8K in / 1K out, one user
- Spec
- MTP depth 2, AL 2.371
- 4 users
- 128.4 tok/s total
- AIME 2026
- 91.7% avg@4, ±4.2 — Qwen reports 92.7 avg@8
One client, one server per arm, the same OpenAI request at the same five context
lengths. Prompts are real text (Project Gutenberg via PG-19) sized exactly by tokenizer,
not synthetic filler — see benchmarks/perf_sweep.sh. The rungs are
chosen lengths, drawn evenly spaced — the x axis has no scale.
A line is one (engine, model, drafter). Metrics sharing a unit share a chart; since
decode tok/s = AL × step/s, the gap between an arm's two lines there is
its acceptance.
Loading charts…
snowllm pull qwen3.6-35b-a3b-fp8 snowllm qwen3.6-35b-a3b-fp8
A recipe is one model at one precision, and snowllm recipes
lists them. The pull runs over several connections at once and resumes where it stopped,
checking every file against the sha256 the repository publishes. A local safetensors
directory works just as well.
A GGUF works too — snowllm pull qwen3.6-35b-a3b-q4-k-xl-dflash
gets the UD-Q4_K_XL quant with its DFlash drafter beside it: a smaller download, and
llama.cpp serves the same file.
Serves an OpenAI-compatible API. snowllm --help lists every flag.
If huggingface.co is slow from where you are, the pull honours the
HF_ENDPOINT environment variable — point it at a mirror you trust.
Read live off the catalogue snowllm recipes shows and
snowllm pull resolves — never fresher than your last page reload.
| Flag | What it does |
|---|---|
| --host --port | Where the OpenAI-compatible API listens. 127.0.0.1:8000 by default — loopback, so reaching it from another machine takes --host 0.0.0.0. |
| --max-num-seqs | Concurrency ceiling, up to 256. A memory choice: each request pins linear-attention state for its whole life. |
| --max-model-len | Context length. A per-request ceiling, not a reservation — the KV pool is shared, and a request that outgrows it is preempted and re-prefilled. |
| --gpu-memory-utilization | Fraction of the GPU the server may occupy, 0.9 by default. |
| --prefix-memory-ratio | Share of the memory budget spent remembering prompt prefixes, 0.08 by default, 0 to disable. A repeat behind a 16K prefix costs 0.36 s instead of 5.1 s. |
| --num-spec | Speculative depth. The optimum depends on the workload; 2 is a robust default. |
| --kv-cache-dtype | bf16 or int8. int8 halves KV bytes: more decode throughput at long context, less prefill. |
| --dflash PATH | Speculate with a block-diffusion drafter instead of the MTP head, given the draft's directory. A recipe that ships one sets this for you. |
| --device-map | Which weight groups live in pinned host memory instead of the carve-out, trading a slower decode step for KV pool. auto is what the DeepSeek recipes use to fit their context. |
| Environment | What it does |
|---|---|
| SNOWLLM_MODELS | Where checkpoints land and are looked for, ~/models by default. |
| HF_ENDPOINT | Mirror to pull from instead of huggingface.co. The token below goes to whatever host this names. |
| HF_TOKEN | For gated repositories. SNOWLLM_HF_TOKEN overrides it where you want one token for this and another for everything else. |
| SNOWLLM_RECIPES_URL | Catalogue to resolve recipe ids against. A local path works, which is how you serve a recipe that is not published yet. |
| SNOWLLM_HOME | Where install.sh puts the environment, ~/.local/share/snowllm by default; SNOWLLM_BIN_DIR and SNOWLLM_PYTHON move the launcher and pick the interpreter. |
- More models
- Tensor parallelism at any degree
- NPU/GPU co-working prefill
- Native INT4 quantization