Run LLMs on Intel Arc (B60, B580, B570, B50, B70, A770) with llama.cpp Vulkan: benchmarks, tuning, agent reliability evals, raw data.
See the code
The fastest single-card Qwen3.8-27B decode we have found published for the Intel Arc Pro B60 24GB (comparison): 53 tok/s mean decode (47-58 across seven coding tasks) with a 64K context window allocated, 420 tok/s prompt reading at 32K, and 97/100 on a hidden-checker agent eval. Tuned llama.cpp on Vulkan, Intel's flash-attention prefill kernel and DFlash2 speculative decoding, plus local video generation (LTX-2.5), a phone control panel and a Claude Code bridge. Every number links to a raw log.
The fine print, up front. 53 tok/s is per-request server decode with short prompts and a 65,536-token KV window allocated (tune.txt). With 30-37K tokens of real conversation in the window, agent turns generate about 42 tok/s (bench-history.csv). On 17 October a 53K window on a contended desktop fell to 22 tok/s, and 50-60K without loss is not yet qualified (field report). Single runs on one workstation.
17 October field report: B60 throughput recovery, desktop-safe AUTO profiles and context trade-offs. Dated local observations; not a new benchmark headline or an installable runtime update.
Four things do almost all of the work. Each was measured on its own before it went in (tuning log).
| Step | What it buys | Evidence |
|---|---|---|
| 1. DFlash2 draft model, 7 tokens per round | Decode 16 -> 53 tok/s mean (47-58), coding still 7/7 correct | tune.txt, compare-f16.txt |
| 2. Intel FA prefill kernel with an f16 KV cache | Prompt reading at 32K 118 -> 420 tok/s (3.6x); a q4 KV cache gains nothing | compare-f16.txt, INTEL-FA |
3. -ub 256, q8 draft KV, auto-fit off | Frees 0.55 GiB at no speed cost: the difference between 57K and 64K context | vram-budget-64k.csv |
| 4. Keep the GPU to yourself | An idle Ollama model left resident cut decode from 52.7 to 22.2 tok/s; unloading it restored speed | field report |
The server line (Windows PowerShell; the full flag-by-flag explanation is in docs/TUNING-LOG.md):
$env:GGML_VK_FORCE_MMVQ = "1"
llama-server -m Qwen3.8-27B-UD-Q4_K_M.gguf -ngl 99 -fa on -c 65536 -ctk f16 -ctv f16 `
-md Qwen3.8-27B-DFlash2-Q4_K_M.gguf -ngld 99 --spec-type draft-dflash --spec-draft-n-max 7 `
-ub 256 -ctkd q8_0 -ctvd q8_0 -np 1 -fit off --no-context-shift --jinja
engine\build.ps1 (Quick start): the prefill speed-up needs the vendored Intel FA patches; the drafter alone works on stock llama.cpp b11524.-c to 57344 or 61440. The governor does this sizing for you at every load.ollama ps, then ollama stop <model> for anything listed, and close other GPU-heavy apps.--spec-draft-p-min 0.5 added a further 4.6% in eval-suite throughput (42.0 -> 43.94 tok/s, tuning log row 17).
ask_local (stand-alone qwen_mcp.py) hands first-pass code and review tasks to the local model; Claude stays the gate. See docs/LOCAL-LLM.md.All single runs on one Arc Pro B60 24GB (Ryzen 7 3700X, 32 GB RAM, Windows 11) unless noted. Raw logs are in data/raw/; "how to read these" is in Notes on the numbers.
| What | Figure | Source |
|---|---|---|
| Generation, eval-suite throughput (wall-clock) | 16.0 tok/s stock, no drafter -> 42.3 with DFlash2; 43.94 with --spec-draft-p-min 0.5 (+4.6%) | TUNING-LOG rows 1, 10, 17 |
| Per-request decode with the drafter | 47-58 tok/s, mean 53.3 (7 coding tasks, 64K KV window allocated, short prompts) | tune.txt, decode-per-request.csv |
| Decode at a 32K window, 17 Oct (ThinkingCap build) | 50.2 tok/s on a free card; 22.2 tok/s with an idle Ollama model still resident | field report, gpu-contention-20261017.csv |
| Reading new input at 32K context | 118 -> 420 tok/s (Intel FA kernel, f16 KV) | TUNING-LOG row 8 |
| Resume a 43K-token prompt after a restart | about 2 min -> 4.5 s (KV slot save/restore) | TUNING-LOG row 16 |
ThinkingCap vs base quant, 16 tasks at xhigh | 16/16 vs 15/16; 3.9x tasks per minute | TUNING-LOG row 20 |
| 100-task agent eval at a 32K window | 97/100 Claude Code, 95/100 Codex | CHANGELOG 2.1.0, RELIABILITY |
| Phone gateway eval | 10/10 | CHANGELOG 2.2.0 |
| LTX-2.5 clip, 768x512, 2 s, 49 frames, with sound | 188-219 s queued to clip, including ComfyUI start (about 4.5 s per sampling step) | VIDEO-GEN |
Not measured yet: render times for other sizes and lengths, the 1080p-4K finish step on the Arc box (docs/UPSCALE.md), and any card other than the B60.
This is a full local-AI stack, not a config gist: a portable engine build with vendored kernel patches (engine/), a governor that sizes context to free VRAM and protects live sessions (governor/), agent wrappers for Claude Code and Codex (agents/), a 100-task evaluation harness whose checkers are verified in CI (evalsuite/), a phone Studio and tool gateway (gateway/), local video generation (docs/VIDEO-GEN.md), voice (voice/) and an interactive benchmark site (docs/index.html). Counts are from the repository at the time of writing; python tools/make_hero.py regenerates the card.
powershell -ExecutionPolicy Bypass -File engine\build.ps1ask_local (LOCAL-LLM.md), the CLI wrappers in agents/, or the phone gateway (GATEWAY.md). Video setup is in VIDEO-GEN.md.Linux notes: engine/build-linux.sh builds the same engine (patch application is verified; not run end to end on an Arc GPU).
Setup · Tuning log · Video generation · Upscale / finish · Studio contracts · Phone tool gateway · Local LLM delegation (ask_local) · Token efficiency · Tool calling · Reliability · Chat UI, voice and tools · Intel FA · FAQ · Interactive benchmarks
If this is useful, a star helps other Arc owners find it. Questions or something wrong? Open an issue.
Jump to: Results · Which card? · Other B60 results · Full Windows setup · Versions · FAQ · Add your card
| Stock llama.cpp Vulkan | This repo | Raw data | |
|---|---|---|---|
| Generation speed | 16 tok/s ‡ (no drafter) | 42.3 tok/s ‡ (DFlash2 draft model, n=7; eval-suite throughput, wall-clock) | compare-f16.txt, tune.txt |
| Reading new input at 32K context | 118 tok/s | 420 tok/s | compare-f16.txt |
| 3 agent turns at 30–37K context | 201 s † | 55–57 s § | server-test.txt, bench-history.csv |
| Context window | n/a | up to 64K (57–61K typical while the PC is in use) ¶ | vram-budget-64k.csv |
| 100-task hidden-checker agent eval, 32K window | n/a | 97/100 Claude Code (1.54 completed tasks/min) · 95/100 Codex ¶¶ | RELIABILITY.md |
¶¶ Sustained 10-step sessions at 48K/64K: Codex 10/10 and 10/10, Claude Code 10/10 and 9/10. Single runs; 95% CI 91.5–99% for 97/100. Detail in Reliability.
All speed figures are single runs (-r 1) unless noted.
‡ 42.3 tok/s is eval-suite throughput (wall-clock, prompt processing included): generated tokens divided by total wall-clock across the 8 eval requests (7 coding tasks and 1 web page), in the n7 ub256 dkv-q8 row of tune.txt. The per-request server decode speeds in that run were 47–58 tok/s, mean 53.3. We quote 42.3 as the conservative headline. 16 tok/s is llama-bench tg32 on an empty context with no draft model (16.05 in compare-f16.txt), a different measurement, so the two are not like-for-like.
† Stock engine with the drafter, observed before logging was in place; the raw log was not retained. Re-run planned. Treat as an observation, not a reproducible measurement (what we have no raw log for).
§ 54.9 s on the first Intel FA build; 56.7 s on the final tuned configuration at 57,344 context; an intermediate run at 61,440 context took 52.2 s. All three are in the logs (agent-turns.csv).
¶ 64K (65,536) is the configured maximum and the VRAM budget in the CSV. Context is sized from the VRAM free at each load; the logged runs loaded 61,440 and 57,344 tokens.
Test PC: Ryzen 7 3700X, B550, 32 GB DDR4, Windows 11, Intel Arc Pro B60 24GB. B60 prices in Australia (a snapshot, not a recommendation): A$1,240 for an ASRock B60 Creator (gpuprix, updated 2026-10-07) and A$999 including GST for an ASRock Arc Pro B60 Passive 24GB OEM card (PCCaseGear, 2026-10-10; a passive card has no fan of its own and needs strong airflow).
Interactive benchmarks → hover any data point, replay the speed race, compare GPUs.
Build with the two commands at the top of this page. Then measure your own card with one more command (Windows or Linux, any Vulkan-capable Intel GPU, any GGUF):
powershell -ExecutionPolicy Bypass -File bench\arc-bench.ps1 -Model C:\path\model.gguf -VramGb 24 -Contributor "Your Name" -Mmvq
# Linux: bench/arc-bench.sh -m /path/model.gguf --vram-gb 24 --contributor "Your Name" --mmvq
The full Windows walkthrough (models, server, agents) is below and in docs/SETUP.md. On Linux, engine/build-linux.sh builds the same engine (patch application is verified; the script has not been run end to end on an Arc GPU, so tell us how it goes).
This repo's measurements are from one card, an Arc Pro B60. The other rows are specifications plus arithmetic, not benchmarks: everything marked ESTIMATE is computed from the numbers below, and none of it has been measured on those cards. Sources and method: data/gpu-comparison-notes.md. Bandwidth is from data/gpu-comparison.csv.
The model used here, Qwen3.8-27B UD-Q4_K_M, has a 16.46 GB weights file (about 15.3 GiB). The f16 KV cache costs 64.5 KiB per token for this model, which is 2.0 GiB at 32K and 4.0 GiB at 64K. Measured on the B60, the weights plus the DFlash2 drafter and buffers take 17.15 GiB (vram-budget-64k.csv).
| Card | VRAM | Bandwidth | Qwen3.8-27B Q4_K_M (this repo's model) | Largest GGUF file, rule of thumb (ESTIMATE) |
|---|---|---|---|---|
| Arc Pro B70 | 32 GB | 608 GB/s | Fits with room to spare (ESTIMATE). After 17.15 GiB for the model, drafter and buffers and about 1.1 GiB of headroom, roughly 11.5 GiB is left for KV, about 180K tokens of f16 (ESTIMATE; 32 GB = 29.8 GiB). An upstream issue reports instant end-of-sequence beyond about 130K tokens (llama.cpp #27756), so test before relying on it. No-drafter decode ceiling about 36.9 tok/s (ESTIMATE). Not measured here. | about 29 GiB |
| Arc Pro B60 | 24 GB | 456 GB/s | Fits, measured. 57–64K context, 42.3 tok/s with the drafter, about 16 without. | about 21 GiB |
| Arc A770 16GB | 16 GB | 560 GB/s | No. The weights alone are about 15.3 GiB, which leaves no room for a useful context (ESTIMATE). | about 13 GiB |
| Arc Pro B50 | 16 GB | 224 GB/s | No, for the same reason. It has the lowest bandwidth in this table, so expect the slowest decode per GB of model. | about 13 GiB |
| Arc B580 | 12 GB | 456 GB/s | No. | about 9 GiB |
| Arc B570 | 10 GB | 380 GB/s | No. | about 7 GiB |
The rule of thumb is that the model file should be no larger than your VRAM minus about 3 GiB, which leaves room for a short context, buffers and the desktop. Subtract more for long contexts: KV cost per token depends on the model, and the 64.5 KiB figure is for this one only. Check the real file size on the model page before you download. For any model without a draft model, decode speed is roughly bounded by bandwidth divided by file size; for this 27B file that is 27.7 tok/s on a B60 (ESTIMATE), and the draft model is how we got past it.
Everything else here applies to any Intel Arc card (the Vulkan flags, the -ub 256 and q8 draft KV tuning, --no-context-shift, the benchmark script). The Intel FA prefill shader was measured only on the B60. B580, B570, B50, B70 and A770 results are the most useful thing you can send us: bench/arc-bench.ps1, then the benchmark form or Test on my card.
Specs and prices are sourced; for cards we haven't measured, the generation figure is a clearly labelled theoretical ceiling (memory bandwidth divided by file size), not a benchmark.
| GPU | VRAM | Bandwidth | AU price (dated) | Fits 27B + 32K? | Gen ceiling (ESTIMATE) | Measured |
|---|---|---|---|---|---|---|
| Arc Pro B60 | 24 GB | 456 GB/s | A$1,240 (2026-10-07) | yes | 27.7 tok/s | about 16, and 42.3 with the drafter |
| Arc Pro B70 | 32 GB | 608 GB/s | no sourced price | yes | 36.9 tok/s | not measured |
| RTX 3090 | 24 GB | 936 GB/s | no sourced price | yes | 56.9 tok/s | not measured |
| RX 7900 XTX | 24 GB | 960 GB/s | no sourced price | yes | 58.3 tok/s | not measured |
| RTX 4090 | 24 GB | 1008 GB/s | no sourced price | yes | 61.2 tok/s | not measured |
| RTX 5090 | 32 GB | 1792 GB/s | A$5,999 (2026-03) | yes | 108.9 tok/s | not measured |
Smaller Intel cards are in the table above. Faster cards would gain from a drafter too; measured results for them are welcome.
Other people publish Qwen3.8-27B numbers for the same card, so we put them side by side in docs/PEERS.md (data: peer-benchmarks.csv). The honest summary:
-ub 256 plus a q8 draft KV cache frees 0.55 GiB at no speed cost. That is the difference between 57K and 64K of context.--no-context-shift explicitly (it is also the default in b11524), so a conversation that outgrows the server's context gets an HTTP 400 instead of quietly dropping old tokens, and the agent wrappers size their window to server context minus 8K so the client compacts first. Compaction is done by Claude Code or Codex, and a summary can still lose detail; the sustained-session test in docs/RELIABILITY.md checks for that.
New to local inference? How it works walks through two concept posters, with the corrections that make them match this exact model.
flowchart LR
subgraph Clients
CC[Claude Code<br/>claude-qwen]
CX[Codex CLI<br/>codex-qwen]
OW[Open WebUI<br/>chat, voice, tools]
API[Any OpenAI / Anthropic<br/>compatible app]
end
CC & CX & OW & API -->|"loopback or tailnet only"| SW[llama-swap :8090<br/>presets: code / plan / vision]
SW --> LA[launch.ps1<br/>sizes context from free VRAM]
GOV[governor<br/>AUTO profiles, watchdogs,<br/>session protection, power plan] -.-> LA
LA --> LS[llama-server<br/>Vulkan + Intel FA kernel<br/>Qwen3.8-27B + DFlash2 drafter]
LS --> GPU[(Arc Pro B60 24GB)]
| Part | What it does | Folder |
|---|---|---|
| Engine | Portable, no-admin build of llama.cpp b11524 plus Intel's FA prefill kernel (vendored patches with checksums) | engine/ |
| Governor | Picks a profile (MAX when you're away, BALANCED while you work, LEAN under load), sizes context to the VRAM actually free, keeps live agent sessions from being shrunk, switches the power plan, restarts anything that dies | governor/ |
| Presets | One loaded model, four behaviours chosen by model name: :code (no thinking, fast agent turns), :plan (16K thinking), :vision, default | llama-swap/ |
| Agents | Claude Code in "FAST mode" (a compact system prompt, about 6.6K tokens of fixed prefix in total against about 19K for the standard one; the figures were not logged) and Codex, with a live context window and early compaction | agents/, docs/AGENTS.md |
| Token efficiency | The settings that keep the prompt prefix stable and small, what each saves, and how to measure it | docs/TOKEN-EFFICIENCY.md |
| Tool calling | What tool schemas cost a local model, measured tool-bundle cache behaviour, and the loading rules that follow | docs/TOOL-CALLING.md |
| Phone tool gateway | About 100 PC, browser and desktop tools behind 7 pinned ones plus search, with phone approvals, file share links and live stats. Phone eval: 10/10, median 10.3 s | docs/GATEWAY.md |
| Platform | Open WebUI chat UI, voice in and out, MCP tools and phone access over Tailscale, without disturbing the prompt cache | docs/PLATFORM.md |
| Voice | Whisper speech-to-text and Kokoro neural voice, both on CPU, spoken sentence by sentence, with OpenAI-compatible routes | voice/, docs/VOICE.md |
| Benchmarks | A regression test (qwen bench, about 4 minutes, which includes the three-turn agent test), sweep scripts, the community benchmark script and the raw logs | bench/, data/ |
| Community results | Other people's numbers in one format, with credit | docs/COMMUNITY-RESULTS.md |
| Charts and site | Static charts, animated SVGs and the interactive Pages site, regenerated from the CSVs | tools/, docs/index.html |
| Reliability | 100 real tasks with hidden checkers, plus 48–64K sustained-session tests | evalsuite/, docs/RELIABILITY.md |
| Operations | qwen doctor (26 health checks), qwen snapshot/rollback (config history in git), nightly regression run | governor/ |
powershell -ExecutionPolicy Bypass -File engine\build.ps1. This builds llama.cpp with the Intel FA kernel into C:\AI\llama.cpp\vulkan-intelfa. It needs git and Python on PATH, but no Visual Studio or admin rights. Expect 5–20 minutes, mostly the one-time toolchain download (our own log shows 3 min 21 s with the toolchain already in place).UD-Q4_K_M and mmproj-F16.gguf (for vision) from the Unsloth GGUF repository, plus the DFlash2 draft model, in C:\AI\models\qwen3.8-27b\. See Versions used for the exact files.C:\AI\llama-swap\ with config.yaml, then copy governor/ to C:\AI\governor\. Set a key: setx LOCAL_QWEN_KEY <random string>.qwen doctor, then qwen bench. We measured 55–57 s for the three-turn test, with coding 7/7 and tools 3/3.%USERPROFILE%\bin and run claude-qwen or codex-qwen.The full walkthrough, including Tailscale remote access, is in docs/SETUP.md.
Fast tokens don't matter if the agent fails the task. evalsuite/ has 100 representative tasks across seven categories:
Each task is scored by a hidden checker that the agent never sees. selftest.py proves every checker fails an untouched workspace and passes a reference solution. The headline metric is completed tasks per minute, not tokens per second. The 97/100 (Claude Code @32K, single run, 95% CI 91.5–99%) and 1.54 tasks/min in the table above are one run at a 32K window, with 0 failures caused by timeouts (one passing task hit the 420 s soft timeout); results, the per-category autonomous / supervised / escalate tiers and the sustained-session tests are in docs/RELIABILITY.md. Sustained 10-step sessions at 48K and 64K scored Codex 10/10 and 10/10 and Claude Code 10/10 and 9/10 (single runs).
Treat a local agent like a fast, fallible junior colleague.
You can keep using them for smaller models and quick trials. They bundle their own copy of llama.cpp, so they do not include the Intel FA prefill patch or the DFlash2 draft-model path, and this exact setup can't be reproduced inside them. If you want this server's speed from the apps you already use, run llama-server or llama-swap from this repo and point those apps at its OpenAI-compatible (/v1/chat/completions, /v1/responses) or Anthropic-compatible (/v1/messages) endpoint. Ollama's native API is not emulated. A step-by-step guide is one of our good first issues; more in the FAQ.
Everything in the results above was produced with these exact versions, on 2026-10-10.
| Component | Version |
|---|---|
| GPU and driver | Intel Arc Pro B60 24GB, Intel Arc Pro Windows driver 32.0.101.8976 (Intel release 2026-09-25) |
| OS and test PC | Windows 11; Ryzen 7 3700X, B550, 32 GB DDR4 |
| llama.cpp, Intel FA build | build 11526, commit c85e6c598 (MinGW GNU 16.2.0): upstream b11524 (86a283532, tag dated 2026-10-09) plus commits 61cc4c25a6878bfcff2d2d76870ba1948ee0f3e2 and 1a5137a44fe7b2c921fe6b5f7d62704226bac599 (vendored) |
| llama.cpp, stock comparison | b11524 (Clang 20.1.8) |
| llama-swap | v262 (079c35a) |
| Claude Code | 2.1.295 |
| Codex CLI | 0.153.4 |
| Python | 3.14.6 |
| Model | unsloth/Qwen3.8-27B-GGUF, Qwen3.8-27B-UD-Q4_K_M.gguf (repository snapshot 4ca720788d1e01f1bff70c033e0d0028fd02e502) and mmproj-F16.gguf |
| Draft model | Qwen3.8-27B-DFlash2-Q4_K_M.gguf (we did not record where it was downloaded from; tell us if you know) |
| Architecture | Hybrid: 16 blocks of 3 Gated DeltaNet layers and 1 Gated Attention layer; f16 KV is 64.5 KiB per token |
Server flags and the reasons for each are in docs/TUNING-LOG.md. Raw logs, an index of what each one shows, and a list of the few figures that have no log are in data/raw/. The speed table above rests on those logs, with the exceptions marked † and ‡.
Submit an Intel Arc LLM benchmark for your card, and star the repo if the numbers help you.
Got an A770, B580, B570, B50, B70, B60 or another Intel GPU? Run bench/arc-bench.ps1 (Windows) or bench/arc-bench.sh (Linux) and open a benchmark result issue. Results go into docs/COMMUNITY-RESULTS.md with credit. Not sure where to start? Test on my card, or the five good first issues. Something wrong in this repo? Report a bug.
SYCL or Vulkan? For this model on the B60, Vulkan was faster in our testing. We didn't keep the SYCL log, so that is an observation you can't check; please submit yours. Intel's work on both backends continues upstream (FAQ).
Does it work on Linux? The engine flags and findings carry over, and there is a build script and a benchmark script for Linux. The governor and agent wrappers are PowerShell and Windows-first. Pull requests welcome.
What about IPEX-LLM or Intel's llm-scaler? intel/ipex-llm was archived on 2026-01-28. llm-scaler is Intel's vLLM route for Arc Pro cards, aimed at batching and multi-GPU serving; we have not benchmarked it. See the FAQ.
Built and measured by Elie Dagher, with Claude as engineering pair. MIT licensed (LICENSE). To cite this repository, use CITATION.cff (GitHub's "Cite this repository" button reads it).
This repository is about running local LLMs on Intel Arc GPUs (Arc Pro B60, B580, B570, B50, B70 and A770, Battlemage and Xe2) with llama.cpp on Vulkan: 24GB VRAM setups, Qwen 27B coding agents, benchmarks against Ollama and LM Studio, and flash-attention and speculative-decoding results.
Run LLMs on Intel Arc (B60, B580, B570, B50, B70, A770) with llama.cpp Vulkan: benchmarks, tuning, agent reliability evals, raw data.
See the code
The fastest single-card Qwen3.8-27B decode we have found published for the Intel Arc Pro B60 24GB (comparison): 53 tok/s mean decode (47-58 across seven coding tasks) with a 64K context window allocated, 420 tok/s prompt reading at 32K, and 97/100 on a hidden-checker agent eval. Tuned llama.cpp on Vulkan, Intel's flash-attention prefill kernel and DFlash2 speculative decoding, plus local video generation (LTX-2.5), a phone control panel and a Claude Code bridge. Every number links to a raw log.
The fine print, up front. 53 tok/s is per-request server decode with short prompts and a 65,536-token KV window allocated (tune.txt). With 30-37K tokens of real conversation in the window, agent turns generate about 42 tok/s (bench-history.csv). On 17 October a 53K window on a contended desktop fell to 22 tok/s, and 50-60K without loss is not yet qualified (field report). Single runs on one workstation.
17 October field report: B60 throughput recovery, desktop-safe AUTO profiles and context trade-offs. Dated local observations; not a new benchmark headline or an installable runtime update.
Four things do almost all of the work. Each was measured on its own before it went in (tuning log).
| Step | What it buys | Evidence |
|---|---|---|
| 1. DFlash2 draft model, 7 tokens per round | Decode 16 -> 53 tok/s mean (47-58), coding still 7/7 correct | tune.txt, compare-f16.txt |
| 2. Intel FA prefill kernel with an f16 KV cache | Prompt reading at 32K 118 -> 420 tok/s (3.6x); a q4 KV cache gains nothing | compare-f16.txt, INTEL-FA |
3. -ub 256, q8 draft KV, auto-fit off | Frees 0.55 GiB at no speed cost: the difference between 57K and 64K context | vram-budget-64k.csv |
| 4. Keep the GPU to yourself | An idle Ollama model left resident cut decode from 52.7 to 22.2 tok/s; unloading it restored speed | field report |
The server line (Windows PowerShell; the full flag-by-flag explanation is in docs/TUNING-LOG.md):
$env:GGML_VK_FORCE_MMVQ = "1"
llama-server -m Qwen3.8-27B-UD-Q4_K_M.gguf -ngl 99 -fa on -c 65536 -ctk f16 -ctv f16 `
-md Qwen3.8-27B-DFlash2-Q4_K_M.gguf -ngld 99 --spec-type draft-dflash --spec-draft-n-max 7 `
-ub 256 -ctkd q8_0 -ctvd q8_0 -np 1 -fit off --no-context-shift --jinja
engine\build.ps1 (Quick start): the prefill speed-up needs the vendored Intel FA patches; the drafter alone works on stock llama.cpp b11524.-c to 57344 or 61440. The governor does this sizing for you at every load.ollama ps, then ollama stop <model> for anything listed, and close other GPU-heavy apps.--spec-draft-p-min 0.5 added a further 4.6% in eval-suite throughput (42.0 -> 43.94 tok/s, tuning log row 17).
ask_local (stand-alone qwen_mcp.py) hands first-pass code and review tasks to the local model; Claude stays the gate. See docs/LOCAL-LLM.md.All single runs on one Arc Pro B60 24GB (Ryzen 7 3700X, 32 GB RAM, Windows 11) unless noted. Raw logs are in data/raw/; "how to read these" is in Notes on the numbers.
| What | Figure | Source |
|---|---|---|
| Generation, eval-suite throughput (wall-clock) | 16.0 tok/s stock, no drafter -> 42.3 with DFlash2; 43.94 with --spec-draft-p-min 0.5 (+4.6%) | TUNING-LOG rows 1, 10, 17 |
| Per-request decode with the drafter | 47-58 tok/s, mean 53.3 (7 coding tasks, 64K KV window allocated, short prompts) | tune.txt, decode-per-request.csv |
| Decode at a 32K window, 17 Oct (ThinkingCap build) | 50.2 tok/s on a free card; 22.2 tok/s with an idle Ollama model still resident | field report, gpu-contention-20261017.csv |
| Reading new input at 32K context | 118 -> 420 tok/s (Intel FA kernel, f16 KV) | TUNING-LOG row 8 |
| Resume a 43K-token prompt after a restart | about 2 min -> 4.5 s (KV slot save/restore) | TUNING-LOG row 16 |
ThinkingCap vs base quant, 16 tasks at xhigh | 16/16 vs 15/16; 3.9x tasks per minute | TUNING-LOG row 20 |
| 100-task agent eval at a 32K window | 97/100 Claude Code, 95/100 Codex | CHANGELOG 2.1.0, RELIABILITY |
| Phone gateway eval | 10/10 | CHANGELOG 2.2.0 |
| LTX-2.5 clip, 768x512, 2 s, 49 frames, with sound | 188-219 s queued to clip, including ComfyUI start (about 4.5 s per sampling step) | VIDEO-GEN |
Not measured yet: render times for other sizes and lengths, the 1080p-4K finish step on the Arc box (docs/UPSCALE.md), and any card other than the B60.
This is a full local-AI stack, not a config gist: a portable engine build with vendored kernel patches (engine/), a governor that sizes context to free VRAM and protects live sessions (governor/), agent wrappers for Claude Code and Codex (agents/), a 100-task evaluation harness whose checkers are verified in CI (evalsuite/), a phone Studio and tool gateway (gateway/), local video generation (docs/VIDEO-GEN.md), voice (voice/) and an interactive benchmark site (docs/index.html). Counts are from the repository at the time of writing; python tools/make_hero.py regenerates the card.
powershell -ExecutionPolicy Bypass -File engine\build.ps1ask_local (LOCAL-LLM.md), the CLI wrappers in agents/, or the phone gateway (GATEWAY.md). Video setup is in VIDEO-GEN.md.Linux notes: engine/build-linux.sh builds the same engine (patch application is verified; not run end to end on an Arc GPU).
Setup · Tuning log · Video generation · Upscale / finish · Studio contracts · Phone tool gateway · Local LLM delegation (ask_local) · Token efficiency · Tool calling · Reliability · Chat UI, voice and tools · Intel FA · FAQ · Interactive benchmarks
If this is useful, a star helps other Arc owners find it. Questions or something wrong? Open an issue.
Jump to: Results · Which card? · Other B60 results · Full Windows setup · Versions · FAQ · Add your card
| Stock llama.cpp Vulkan | This repo | Raw data | |
|---|---|---|---|
| Generation speed | 16 tok/s ‡ (no drafter) | 42.3 tok/s ‡ (DFlash2 draft model, n=7; eval-suite throughput, wall-clock) | compare-f16.txt, tune.txt |
| Reading new input at 32K context | 118 tok/s | 420 tok/s | compare-f16.txt |
| 3 agent turns at 30–37K context | 201 s † | 55–57 s § | server-test.txt, bench-history.csv |
| Context window | n/a | up to 64K (57–61K typical while the PC is in use) ¶ | vram-budget-64k.csv |
| 100-task hidden-checker agent eval, 32K window | n/a | 97/100 Claude Code (1.54 completed tasks/min) · 95/100 Codex ¶¶ | RELIABILITY.md |
¶¶ Sustained 10-step sessions at 48K/64K: Codex 10/10 and 10/10, Claude Code 10/10 and 9/10. Single runs; 95% CI 91.5–99% for 97/100. Detail in Reliability.
All speed figures are single runs (-r 1) unless noted.
‡ 42.3 tok/s is eval-suite throughput (wall-clock, prompt processing included): generated tokens divided by total wall-clock across the 8 eval requests (7 coding tasks and 1 web page), in the n7 ub256 dkv-q8 row of tune.txt. The per-request server decode speeds in that run were 47–58 tok/s, mean 53.3. We quote 42.3 as the conservative headline. 16 tok/s is llama-bench tg32 on an empty context with no draft model (16.05 in compare-f16.txt), a different measurement, so the two are not like-for-like.
† Stock engine with the drafter, observed before logging was in place; the raw log was not retained. Re-run planned. Treat as an observation, not a reproducible measurement (what we have no raw log for).
§ 54.9 s on the first Intel FA build; 56.7 s on the final tuned configuration at 57,344 context; an intermediate run at 61,440 context took 52.2 s. All three are in the logs (agent-turns.csv).
¶ 64K (65,536) is the configured maximum and the VRAM budget in the CSV. Context is sized from the VRAM free at each load; the logged runs loaded 61,440 and 57,344 tokens.
Test PC: Ryzen 7 3700X, B550, 32 GB DDR4, Windows 11, Intel Arc Pro B60 24GB. B60 prices in Australia (a snapshot, not a recommendation): A$1,240 for an ASRock B60 Creator (gpuprix, updated 2026-10-07) and A$999 including GST for an ASRock Arc Pro B60 Passive 24GB OEM card (PCCaseGear, 2026-10-10; a passive card has no fan of its own and needs strong airflow).
Interactive benchmarks → hover any data point, replay the speed race, compare GPUs.
Build with the two commands at the top of this page. Then measure your own card with one more command (Windows or Linux, any Vulkan-capable Intel GPU, any GGUF):
powershell -ExecutionPolicy Bypass -File bench\arc-bench.ps1 -Model C:\path\model.gguf -VramGb 24 -Contributor "Your Name" -Mmvq
# Linux: bench/arc-bench.sh -m /path/model.gguf --vram-gb 24 --contributor "Your Name" --mmvq
The full Windows walkthrough (models, server, agents) is below and in docs/SETUP.md. On Linux, engine/build-linux.sh builds the same engine (patch application is verified; the script has not been run end to end on an Arc GPU, so tell us how it goes).
This repo's measurements are from one card, an Arc Pro B60. The other rows are specifications plus arithmetic, not benchmarks: everything marked ESTIMATE is computed from the numbers below, and none of it has been measured on those cards. Sources and method: data/gpu-comparison-notes.md. Bandwidth is from data/gpu-comparison.csv.
The model used here, Qwen3.8-27B UD-Q4_K_M, has a 16.46 GB weights file (about 15.3 GiB). The f16 KV cache costs 64.5 KiB per token for this model, which is 2.0 GiB at 32K and 4.0 GiB at 64K. Measured on the B60, the weights plus the DFlash2 drafter and buffers take 17.15 GiB (vram-budget-64k.csv).
| Card | VRAM | Bandwidth | Qwen3.8-27B Q4_K_M (this repo's model) | Largest GGUF file, rule of thumb (ESTIMATE) |
|---|---|---|---|---|
| Arc Pro B70 | 32 GB | 608 GB/s | Fits with room to spare (ESTIMATE). After 17.15 GiB for the model, drafter and buffers and about 1.1 GiB of headroom, roughly 11.5 GiB is left for KV, about 180K tokens of f16 (ESTIMATE; 32 GB = 29.8 GiB). An upstream issue reports instant end-of-sequence beyond about 130K tokens (llama.cpp #27756), so test before relying on it. No-drafter decode ceiling about 36.9 tok/s (ESTIMATE). Not measured here. | about 29 GiB |
| Arc Pro B60 | 24 GB | 456 GB/s | Fits, measured. 57–64K context, 42.3 tok/s with the drafter, about 16 without. | about 21 GiB |
| Arc A770 16GB | 16 GB | 560 GB/s | No. The weights alone are about 15.3 GiB, which leaves no room for a useful context (ESTIMATE). | about 13 GiB |
| Arc Pro B50 | 16 GB | 224 GB/s | No, for the same reason. It has the lowest bandwidth in this table, so expect the slowest decode per GB of model. | about 13 GiB |
| Arc B580 | 12 GB | 456 GB/s | No. | about 9 GiB |
| Arc B570 | 10 GB | 380 GB/s | No. | about 7 GiB |
The rule of thumb is that the model file should be no larger than your VRAM minus about 3 GiB, which leaves room for a short context, buffers and the desktop. Subtract more for long contexts: KV cost per token depends on the model, and the 64.5 KiB figure is for this one only. Check the real file size on the model page before you download. For any model without a draft model, decode speed is roughly bounded by bandwidth divided by file size; for this 27B file that is 27.7 tok/s on a B60 (ESTIMATE), and the draft model is how we got past it.
Everything else here applies to any Intel Arc card (the Vulkan flags, the -ub 256 and q8 draft KV tuning, --no-context-shift, the benchmark script). The Intel FA prefill shader was measured only on the B60. B580, B570, B50, B70 and A770 results are the most useful thing you can send us: bench/arc-bench.ps1, then the benchmark form or Test on my card.
Specs and prices are sourced; for cards we haven't measured, the generation figure is a clearly labelled theoretical ceiling (memory bandwidth divided by file size), not a benchmark.
| GPU | VRAM | Bandwidth | AU price (dated) | Fits 27B + 32K? | Gen ceiling (ESTIMATE) | Measured |
|---|---|---|---|---|---|---|
| Arc Pro B60 | 24 GB | 456 GB/s | A$1,240 (2026-10-07) | yes | 27.7 tok/s | about 16, and 42.3 with the drafter |
| Arc Pro B70 | 32 GB | 608 GB/s | no sourced price | yes | 36.9 tok/s | not measured |
| RTX 3090 | 24 GB | 936 GB/s | no sourced price | yes | 56.9 tok/s | not measured |
| RX 7900 XTX | 24 GB | 960 GB/s | no sourced price | yes | 58.3 tok/s | not measured |
| RTX 4090 | 24 GB | 1008 GB/s | no sourced price | yes | 61.2 tok/s | not measured |
| RTX 5090 | 32 GB | 1792 GB/s | A$5,999 (2026-03) | yes | 108.9 tok/s | not measured |
Smaller Intel cards are in the table above. Faster cards would gain from a drafter too; measured results for them are welcome.
Other people publish Qwen3.8-27B numbers for the same card, so we put them side by side in docs/PEERS.md (data: peer-benchmarks.csv). The honest summary:
-ub 256 plus a q8 draft KV cache frees 0.55 GiB at no speed cost. That is the difference between 57K and 64K of context.--no-context-shift explicitly (it is also the default in b11524), so a conversation that outgrows the server's context gets an HTTP 400 instead of quietly dropping old tokens, and the agent wrappers size their window to server context minus 8K so the client compacts first. Compaction is done by Claude Code or Codex, and a summary can still lose detail; the sustained-session test in docs/RELIABILITY.md checks for that.
New to local inference? How it works walks through two concept posters, with the corrections that make them match this exact model.
flowchart LR
subgraph Clients
CC[Claude Code<br/>claude-qwen]
CX[Codex CLI<br/>codex-qwen]
OW[Open WebUI<br/>chat, voice, tools]
API[Any OpenAI / Anthropic<br/>compatible app]
end
CC & CX & OW & API -->|"loopback or tailnet only"| SW[llama-swap :8090<br/>presets: code / plan / vision]
SW --> LA[launch.ps1<br/>sizes context from free VRAM]
GOV[governor<br/>AUTO profiles, watchdogs,<br/>session protection, power plan] -.-> LA
LA --> LS[llama-server<br/>Vulkan + Intel FA kernel<br/>Qwen3.8-27B + DFlash2 drafter]
LS --> GPU[(Arc Pro B60 24GB)]
| Part | What it does | Folder |
|---|---|---|
| Engine | Portable, no-admin build of llama.cpp b11524 plus Intel's FA prefill kernel (vendored patches with checksums) | engine/ |
| Governor | Picks a profile (MAX when you're away, BALANCED while you work, LEAN under load), sizes context to the VRAM actually free, keeps live agent sessions from being shrunk, switches the power plan, restarts anything that dies | governor/ |
| Presets | One loaded model, four behaviours chosen by model name: :code (no thinking, fast agent turns), :plan (16K thinking), :vision, default | llama-swap/ |
| Agents | Claude Code in "FAST mode" (a compact system prompt, about 6.6K tokens of fixed prefix in total against about 19K for the standard one; the figures were not logged) and Codex, with a live context window and early compaction | agents/, docs/AGENTS.md |
| Token efficiency | The settings that keep the prompt prefix stable and small, what each saves, and how to measure it | docs/TOKEN-EFFICIENCY.md |
| Tool calling | What tool schemas cost a local model, measured tool-bundle cache behaviour, and the loading rules that follow | docs/TOOL-CALLING.md |
| Phone tool gateway | About 100 PC, browser and desktop tools behind 7 pinned ones plus search, with phone approvals, file share links and live stats. Phone eval: 10/10, median 10.3 s | docs/GATEWAY.md |
| Platform | Open WebUI chat UI, voice in and out, MCP tools and phone access over Tailscale, without disturbing the prompt cache | docs/PLATFORM.md |
| Voice | Whisper speech-to-text and Kokoro neural voice, both on CPU, spoken sentence by sentence, with OpenAI-compatible routes | voice/, docs/VOICE.md |
| Benchmarks | A regression test (qwen bench, about 4 minutes, which includes the three-turn agent test), sweep scripts, the community benchmark script and the raw logs | bench/, data/ |
| Community results | Other people's numbers in one format, with credit | docs/COMMUNITY-RESULTS.md |
| Charts and site | Static charts, animated SVGs and the interactive Pages site, regenerated from the CSVs | tools/, docs/index.html |
| Reliability | 100 real tasks with hidden checkers, plus 48–64K sustained-session tests | evalsuite/, docs/RELIABILITY.md |
| Operations | qwen doctor (26 health checks), qwen snapshot/rollback (config history in git), nightly regression run | governor/ |
powershell -ExecutionPolicy Bypass -File engine\build.ps1. This builds llama.cpp with the Intel FA kernel into C:\AI\llama.cpp\vulkan-intelfa. It needs git and Python on PATH, but no Visual Studio or admin rights. Expect 5–20 minutes, mostly the one-time toolchain download (our own log shows 3 min 21 s with the toolchain already in place).UD-Q4_K_M and mmproj-F16.gguf (for vision) from the Unsloth GGUF repository, plus the DFlash2 draft model, in C:\AI\models\qwen3.8-27b\. See Versions used for the exact files.C:\AI\llama-swap\ with config.yaml, then copy governor/ to C:\AI\governor\. Set a key: setx LOCAL_QWEN_KEY <random string>.qwen doctor, then qwen bench. We measured 55–57 s for the three-turn test, with coding 7/7 and tools 3/3.%USERPROFILE%\bin and run claude-qwen or codex-qwen.The full walkthrough, including Tailscale remote access, is in docs/SETUP.md.
Fast tokens don't matter if the agent fails the task. evalsuite/ has 100 representative tasks across seven categories:
Each task is scored by a hidden checker that the agent never sees. selftest.py proves every checker fails an untouched workspace and passes a reference solution. The headline metric is completed tasks per minute, not tokens per second. The 97/100 (Claude Code @32K, single run, 95% CI 91.5–99%) and 1.54 tasks/min in the table above are one run at a 32K window, with 0 failures caused by timeouts (one passing task hit the 420 s soft timeout); results, the per-category autonomous / supervised / escalate tiers and the sustained-session tests are in docs/RELIABILITY.md. Sustained 10-step sessions at 48K and 64K scored Codex 10/10 and 10/10 and Claude Code 10/10 and 9/10 (single runs).
Treat a local agent like a fast, fallible junior colleague.
You can keep using them for smaller models and quick trials. They bundle their own copy of llama.cpp, so they do not include the Intel FA prefill patch or the DFlash2 draft-model path, and this exact setup can't be reproduced inside them. If you want this server's speed from the apps you already use, run llama-server or llama-swap from this repo and point those apps at its OpenAI-compatible (/v1/chat/completions, /v1/responses) or Anthropic-compatible (/v1/messages) endpoint. Ollama's native API is not emulated. A step-by-step guide is one of our good first issues; more in the FAQ.
Everything in the results above was produced with these exact versions, on 2026-10-10.
| Component | Version |
|---|---|
| GPU and driver | Intel Arc Pro B60 24GB, Intel Arc Pro Windows driver 32.0.101.8976 (Intel release 2026-09-25) |
| OS and test PC | Windows 11; Ryzen 7 3700X, B550, 32 GB DDR4 |
| llama.cpp, Intel FA build | build 11526, commit c85e6c598 (MinGW GNU 16.2.0): upstream b11524 (86a283532, tag dated 2026-10-09) plus commits 61cc4c25a6878bfcff2d2d76870ba1948ee0f3e2 and 1a5137a44fe7b2c921fe6b5f7d62704226bac599 (vendored) |
| llama.cpp, stock comparison | b11524 (Clang 20.1.8) |
| llama-swap | v262 (079c35a) |
| Claude Code | 2.1.295 |
| Codex CLI | 0.153.4 |
| Python | 3.14.6 |
| Model | unsloth/Qwen3.8-27B-GGUF, Qwen3.8-27B-UD-Q4_K_M.gguf (repository snapshot 4ca720788d1e01f1bff70c033e0d0028fd02e502) and mmproj-F16.gguf |
| Draft model | Qwen3.8-27B-DFlash2-Q4_K_M.gguf (we did not record where it was downloaded from; tell us if you know) |
| Architecture | Hybrid: 16 blocks of 3 Gated DeltaNet layers and 1 Gated Attention layer; f16 KV is 64.5 KiB per token |
Server flags and the reasons for each are in docs/TUNING-LOG.md. Raw logs, an index of what each one shows, and a list of the few figures that have no log are in data/raw/. The speed table above rests on those logs, with the exceptions marked † and ‡.
Submit an Intel Arc LLM benchmark for your card, and star the repo if the numbers help you.
Got an A770, B580, B570, B50, B70, B60 or another Intel GPU? Run bench/arc-bench.ps1 (Windows) or bench/arc-bench.sh (Linux) and open a benchmark result issue. Results go into docs/COMMUNITY-RESULTS.md with credit. Not sure where to start? Test on my card, or the five good first issues. Something wrong in this repo? Report a bug.
SYCL or Vulkan? For this model on the B60, Vulkan was faster in our testing. We didn't keep the SYCL log, so that is an observation you can't check; please submit yours. Intel's work on both backends continues upstream (FAQ).
Does it work on Linux? The engine flags and findings carry over, and there is a build script and a benchmark script for Linux. The governor and agent wrappers are PowerShell and Windows-first. Pull requests welcome.
What about IPEX-LLM or Intel's llm-scaler? intel/ipex-llm was archived on 2026-01-28. llm-scaler is Intel's vLLM route for Arc Pro cards, aimed at batching and multi-GPU serving; we have not benchmarked it. See the FAQ.
Built and measured by Elie Dagher, with Claude as engineering pair. MIT licensed (LICENSE). To cite this repository, use CITATION.cff (GitHub's "Cite this repository" button reads it).
This repository is about running local LLMs on Intel Arc GPUs (Arc Pro B60, B580, B570, B50, B70 and A770, Battlemage and Xe2) with llama.cpp on Vulkan: 24GB VRAM setups, Qwen 27B coding agents, benchmarks against Ollama and LM Studio, and flash-attention and speculative-decoding results.