[ docs ] // Running models
GPU & performance
Backends#
ArcFlare finds every llama.cpp build on the machine and probes each one for devices:
arcflare backend OK vulkan:vulkan ~/llamacpp/vulkan <- active
Vulkan0 AMD Radeon(TM) 8060S Graphics (47.8 GB, 45.4 GB free)
-- rocm:rocm ~/llamacpp/rocm
build loads but enumerates no device (driver or runtime)
kernels present: gfx1010 ... gfx1151 ... gfx1250
the build is fine - the driver is not exposing the GPU to HIP.That last line is the useful part. The ROCm build above does contain kernels for this GPU, so reinstalling it would not help, and the driver is what needs updating. Select a backend with arcflare backend vulkan (or cuda, rocm), and re-probe with --probe.
PATH, in ~/llamacpp/{vulkan,cuda,rocm}, in $ARCFLARE_LLAMA_DIR, and at $ARCFLARE_LLAMA_SERVER. Each build is probed from its own folder: on Windows the DLL search path includes the current directory, so probing a ROCm build from a Vulkan folder would silently load the Vulkan backend.Memory profiles#
llama-server's stock defaults assume RAM to spare: an 8 GB host prompt cache and up to four resident models. On a machine whose RAM is mostly carved out for VRAM, that is the biggest avoidable cost.
arcflare memory balanced| Profile | Prompt cache | Models resident | Sleeps after |
|---|---|---|---|
| lean | 512 MiB | 1 | 5 min idle |
| balanced (default) | 2048 MiB | 1 | 15 min idle |
| max | 8192 MiB | 4 | never |
Batch size#
The physical batch (-ub) trades VRAM for prefill speed, and the trade goes both ways. Measured on a 35B-A3B at the full 262,144 context:
| Model | ubatch | ~1.4k prompt | ~8k prompt |
|---|---|---|---|
| 35B-A3B Q5 | 512 | 251 tok/s | 736 tok/s |
| 35B-A3B Q5 | 2048 | 349 tok/s (+39%) | 657 tok/s (−10.7%) |
| 35B-A3B Q6 | 512 | 321 tok/s | 814 tok/s |
| 35B-A3B Q6 | 2048 | 471 tok/s (+47%) | 613 tok/s (−25%) |
Agent turns skew short, because a cached session only re-prefills what changed. So the default is 2048. arcflare batch 512 reverses it if your work is long single prompts. The choices are 512, 1024, 2048 and 4096.
What fits, and what runs best#
What fits is arithmetic over the GGUF header and your free VRAM. It covers every model, instantly, with nothing loaded:
arcflare fitWhat fits 45.4 GB free on device + qwen3.6-35b-a3b:ud-q6_k_xl 30.4 GB 20 KiB/tok 256K full 256K context - 5.0 GB of cache, 8.7 GB left over + qwen3.8-27b:ud-q5_k_m 18.4 GB 64 KiB/tok 256K full 256K context - 16.0 GB of cache, 9.6 GB left over
What runs best can't be computed. --run loads each model at the context it would really use and times it:
arcflare fit --run qwen3.6-35b-a3b:ud-q5_k_xl 23.6 s 610 tok/s 57.5 tok/s 5/5 probes 256K ctx
qwen3.8-27b:ud-q5_k_m 31.8 s 176 tok/s 19.4 tok/s 5/5 probes 256K ctx
> use qwen3.6-35b-a3b:ud-q5_k_xl
fastest of the 4 that answered every probeA smaller model is not a faster model. The dense 27B above is the smallest file and generates at a third of the speed of a MoE twice its size. File size predicts whether a model fits. It says nothing about how fast it runs.
- Generation speed is reproducible run to run. Trust it.
- Prefill moves by ~10% between runs. Don't rank quants on a small gap.
- Load time mostly measures your disk cache.
Five probes then check that a model still works as a tool-caller: exact output format, clean JSON, arithmetic, a function that actually runs in a sandbox, and recall from 4k tokens back. The recommendation is the fastest model that passes all five. Speed never makes up for a failed probe.
| Flag | Does |
|---|---|
| --run [model] | Load and measure everything, or one model |
| --quick | A 2k prefill and a shorter sample |
| --no-probes | Timings only |
| --json | The same data, machine-readable |
| --clear | Forget every measurement |
Results are kept in ~/.arcflare/fit.json and saved after each model, so an interrupted run keeps what it measured.
// Not a real flag: ↑ ↑ ↓ ↓ ← → ← → B A on any page. Esc puts it back.