首次运行会从 Hub 下载模型及配套 draft,需预留磁盘空间;默认监听 127.0.0.1:8000 且无鉴权,换端口时启动代理要传相同 --port;不支持全 BF16/F16/F32 的 GGUF,安装器会拒绝。
splash
incoaiApache-2.0活跃维护面向 Apple Silicon 的本地大模型推理引擎,围绕模型本身做优化,让 Mac 上跑编码智能体和 LLM 推理更快更省资源。
A local inference engine for Apple silicon, built around the model.
brew install incoai/tap/splash
splash serve --model unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_M需要 Apple M3 或更新芯片的 Mac,桌面应用要求 macOS 26.4 及以上;显存未单独列出,可用 --max-memory 限制 Metal 内存占用,较小的 GGUF 变体可在 24 GB Mac 上运行。
面向 Apple 芯片的本地推理引擎,让编码代理和兼容 OpenAI、Anthropic 的应用在一台 Mac 上运行
面向 Apple Silicon 的本地大模型推理引擎,围绕模型本身做优化,让 Mac 上跑编码智能体和 LLM 推理更快更省资源。
核心能力
- 用 DFlash 2 投机解码加速生成
- 为各模型定制 Metal 内核,预编译免调优
- 自动规划内存与上下文,复用缓存前缀
- 自动批处理并发请求,支持视觉与工具调用
- 提供 OpenAI 与 Anthropic 兼容 API 及内置聊天页
容易踩的坑
- 1.6.0Splash 1.6.0最新正式版2026-11-06 · 2026-11-06 04:19 UTC
Splash 1.6.0
It's been longer than usual since 1.5.0. Sorry for the wait.
This release has few kernel changes. Most of the work went into the engine: how it uses memory, schedules requests, and recovers when something goes wrong. In real serving, with several requests, long contexts, and a memory limit, these decide whether Splash stays responsive. We think they matter more there than another few percent of decode speed.
Serving under a memory limit
Splash 1.6.0 fixes long stalls seen in 1.5.0 under a memory limit. On an M5 Max with 36 GB serving Qwen3.8-Flash-Next Q2_0 at
--max-memory 18G, the longest pause in a stream dropped from 300–406 s to 0.92 s. On the same load, prefill throughput rose 1.27x, decode throughput rose 1.25x, and TTFT fell 26%. On a 24 GB Mac serving Qwen3.8-27B UD-IQ3_XXS, TTFT fell 41%. These are concurrent serving results; single-request decode stays within 2% of 1.5.0.- One memory ledger. Every allocation goes through one ledger, with one order for what to free when memory runs short. Cached data the model can rebuild goes first; memory another request is using goes last.
/statusreports it undermemory_governor. - Idle KV no longer slows every command. 1.5.0 made all cached KV resident for every GPU command, so idle cache slowed decode by up to 5.8x near the GPU's memory limit. Each command now makes resident only the KV it reads. (#644)
- Elastic expert store. With
--expert-memory auto(the default), streamed experts grow as memory allows and give memory back when requests or other apps need it.--expert-memory SIZEstill fixes the size. - SSD cache keeps making room. A full cache replaces old copies instead of refusing new ones.
- Fairer scheduling. A request that has to wait for memory no longer holds up the requests behind it. A long prompt gets its turn after three commands have passed it, as in 1.5.0.
- More context, not less. Qwen3.6-35B-A3B no longer serves less context when given a larger memory budget.
- Smaller prefill chunks use a 64-row tile on M5/M6 and smaller M3/M4 GPUs. (#621)
Reliability
- Engine restarts. A failed engine restarts with a backoff. Restarts stop at once on model files that cannot be served, and after six quick failures in a row (1.5.0 stopped after three). A start that waits for memory keeps retrying.
- Quarantine. A request that crashes the engine twice is refused with
400 request_quarantinedinstead of crashing it again. - Sandboxed PDFs. PDFs render in a sandbox with no network access and no environment variables.
- A request whose KV spills to the SSD no longer fails with
capacity_exhaustedwhile memory is about to free up. (#622, fixes #613)
Models
- Split GGUFs at a repository's root install as one model.
- Qwen3.8-Flash-Next GGUFs with BF16 or F16 PLE tables load.
- Flint GGUFs from lmstudio-community, ggml-org, bartowski, mradermacher, and prithivMLmods install.
Splash for Mac
- Drawer: press ⌘J for terminals and live logs from the server and downloads.
- Smoother app: replies stream without redrawing, long chats scroll steadily, and the composer and controls move together.
- Clearer launch options: short names, an explanation beside each option, and only the options the selected model can use.
- Start failures say why. The server the app started also stops if the app crashes.
- Context ring: a ring beside Send shows how much of the context the prompt uses. (#642)
APIs
POST /v1/chat/completions/count_tokenscounts a Chat request's tokens without running it. (#642)/statusbreaks each request's time to first token down by cause. (#620)- A tool call without a function name is returned as text instead of being dropped. (#632)
- Stop sequences are matched as output arrives. Long stop sequences no longer slow generation.
Fixes
- Thinking budgets shrink with the remaining context to leave room for the answer. A budget cut
- One memory ledger. Every allocation goes through one ledger, with one order for what to free when memory runs short. Cached data the model can rebuild goes first; memory another request is using goes last.
- 1.5.0Splash 1.5.02026-10-28 · 2026-10-28 20:15 UTC
查看更新说明
Splash 1.5.0
Splash now has a desktop app: download and run models, chat with them, and connect coding agents from one window. This release also adds local model loading, custom tools in the Responses API, faster decode on M5 and M6, and a fix for image requests that could crash the engine.
Splash for Mac
The desktop app includes its own runtime, shares models with the CLI, and supports:
- Model downloads, switching, and launch settings.
- Streaming chat, saved conversations, images, and reasoning controls.
- Claude Code, Codex, OpenCode, Hermes, and Pi in your chosen project folder.
- Menu bar controls and automatic update checks.
Requires Apple M3 or newer and macOS 26.4 or later. Download Splash, open the DMG, and drag Splash into Applications. Or install with Homebrew:
brew install --cask incoai/tap/splash-appThe app uses the default Hugging Face cache and does not inherit
HF_HOME,HF_HUB_CACHE, orHF_TOKENfrom your shell. Quitting it stops the model. GGUF files added locally run text only; use the CLI for a separate vision projector or local draft. MLX folders retain their vision support. (#610)Speed and memory
- Faster decode on M5 and M6. On a 32-core M5 Max, Qwen3.8-27B MLX 4-bit takes 11.7% less time per decode cycle with one request and 7.5–8.3% less with two to four. The 27B UD-Q4_K_M takes 2.2–4.4% less. On a 12-core M6, the 35B UD-Q2_K_XL takes 0.4–1.8% less. These are decode-cycle measurements; per-token gains for the batched 27B MLX are 1–2 percentage points smaller at three and four requests. Other GPU core counts were not measured end to end. (#235)
- Lower MoE router memory. The 35B MLX 4-bit keeps its router quantized, saving 62 MB and reducing router reads from 84 MB to 22 MB per decode cycle. Quantized GGUF MoE routers also load; F16 routers remain unsupported. (#599)
- Faster quantized kernels on M3, M4, and M5, including MLX 4-bit and several GGUF formats. These are kernel-level improvements; whole-model gains vary. (#600, #602)
Models and APIs
-
Local model files: serve a GGUF file or MLX directory with
--model-dir, without contacting the Hub. Use--draft-modelfor a local DFlash2 draft and--mmprojfor a GGUF vision projector. Otherwise, the matching draft must already be cached. (#338)splash serve --model local/qwen \ --model-dir /models/Qwen3.8-27B-GGUF/Qwen3.8-27B-UD-Q4_K_M.gguf \ --draft-model /models/Qwen3.8-27B-DFlash2 -
Custom tools: Responses accepts freeform tools such as Codex's
apply_patchand returnscustom_tool_callitems. Tool grammars are described to the model, not enforced; streamed tool input arrives when the call closes. (#426) -
Request timings: Responses and Messages report prompt/decode counts, latency, rates, cached tokens, and draft counts. Messages also reports thinking-token usage. (#427)
-
Reasoning discovery:
/v1/modelsreports supported reasoning efforts and defaults. (#610) -
Pi prefix caching:
splash pienables later system messages when the model's template supports them, preserving reusable prefixes. (#609) -
Shell completion: expands to 11 suggested models and completes local model, draft, and projector paths. (#338, #610)
Fixes
- Image requests no longer trigger GPU timeouts on models whose experts stream from SSD. Image encoding runs before prefill in a separate GPU command, and image requests use Neural Engine prefill again. (#601, fixes #596)
- Ctrl+C stops model downloads promptly. The next download from that repository cleans up interrupted partial files. (#610)
- Browser chat asks for an API key only after a 401 response. (#610)
- Update filelock to 4.2.4. (#603)
Upgrade
brew upgrade splashKeep the CLI and desktop app on the same release.
- Use full CLI option names: abbreviations such as
--max-memare no lon
- 1.4.1Splash 1.4.12026-10-26 · 2026-10-26 07:56 UTC
查看更新说明
Splash 1.4.1
Splash 1.4.1 adds Ornith-1.5-122B and Flint, improves MoE performance on base M3/M4 Macs, and fixes startup and request stalls under memory pressure.
New models
Ornith-1.5-122B loads from GGUF or MLX with its matching DFlash2 draft selected automatically (#539, #560).
splash serve --model unsloth/Ornith-1.5-122B-GGUF:UD-Q4_K_XLGGUF supports vision.
ornith-ai/Ornith-1.5-122B-MLX-4bitalso includes its vision tower;--language-onlyis optional.Flint, RecursiveSI's 40B-A2.5B MoE, serves from GGUF with automatic
incoai/Flint-DFlash2selection, tool calling, structured output, and up to 262,144 tokens of context (#573–#576).splash serve --model unsloth/flint-GGUF:UD-Q4_K_XLFlint is text-only and decides when to reason itself; reasoning settings cannot force it on or off. MLX checkpoints are not supported.
Pruned-expert GGUFs now load, including ISTA's Flash-Next GSQ-RCO-Coder variants (#561).
Speed and memory
- Flint measured 190 tok/s across ten mixed prompts on an M5 Max with 36 GB, versus 89 tok/s for llama.cpp on the same Mac and UD-Q4_K_XL checkpoint. These are the pooled results from four runs (#576).
- Flint releases sliding-window K/V once it is no longer needed. With INT8 KV, cached pages beyond the window use 71% less memory; full-history attention is retained (#574).
- Faster MoE kernels on base M3/M4 GPUs with ten cores or fewer. On the ten-core M4, most tested formats took 12–45% less GPU time per MoE layer in small-batch benchmarks. This is a kernel measurement, not an end-to-end speedup (#578).
Fixes
- Low-memory startup: release idle warmup buffers before checking the host memory reserve, avoiding false startup refusals on 24 GB Macs. Startup failures also report their actual reason instead of a generic EOF error (#577, #563).
- Large images: fix GPU timeouts when the 27B's image encoding overlaps ANE prefill. Image-encoding commands run on the GPU; subsequent text chunks still use ANE (#593).
- Concurrent requests: fix queued requests stalling under memory pressure while another request grows its KV cache, while preserving capacity for long single requests (#579).
- Accept split GGUFs whose first file contains only metadata (#560).
- Report missing MLX vision shards clearly and suggest
--language-onlyfor affected checkpoints (#568). - Update Pillow to 13.0.0 and certifi to 2026.10.19 (#558).
- Improve model verification checks, including penalty and warmup-EOS checks, memory handling, and stale weight records (#562, #564–#567).
Upgrade
Existing GGUF installations refresh derived metadata locally on first start, reusing downloaded weights. Their persistent conversation cache starts fresh because the model identity changes. Existing MLX cache layouts remain compatible when model and draft identities are unchanged.
Thanks to @zhijian-liu, @ezoushen, @wmTJc9IK0Q, @linson007, @cresslank, @Litee and @realzop for contributions, reports and testing.
Full changelog: https://github.com/incoai/splash/compare/1.4.0...1.4.1
- 1.4.0Splash 1.4.02026-10-20 · 2026-10-20 22:35 UTC
查看更新说明
Splash 1.4.0 adds Qwen3.8-Flash-Next, SSD streaming for experts and PLE, active KV spill, and up to 1M context. Adaptive draft verification and mixed structured-output batching improve decode throughput.
Qwen3.8-Flash-Next
Flash-Next GGUFs now load with QSA sparse attention and an automatically selected DFlash2 draft (#467–#469):
splash serve --model ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF:Q2_0Unsloth's Flash-Next GGUFs also load. Flash-Next MLX checkpoints are not supported yet.
On an M5 Pro (20-core GPU, 64 GB), Q2_0 measured 95 tok/s decode, 1,312 tok/s prefill at 32K, 171 ms cached TTFT, and 171 tok/s aggregate decode with four concurrent requests. These use selected SPEED-Bench coding prompts over HTTP with 1,024-token outputs; prefill rate uses time to the first token, and all 16 replayed prompts hit the cache (#521).
SSD streaming
The planner shares one memory budget between weights, context and streaming caches (#463, #468, #474–#481, #495):
- MoE experts: GGUF and MLX targets keep experts resident when they fit, otherwise stream them from the SSD.
--expert-memory SIZEsets their RAM store;offloads every expert. - Flash-Next PLE: the n-gram table streams when it cannot fit, with a default 512 MiB row cache.
--ple-memory SIZEchanges that cache;offloads the whole table. - Active KV: Flash-Next can spill a running request's KV to the SSD, keeping its sparse index and hot blocks in RAM.
--sparse-kv-memory SIZEcontrols the hot cache. The 27B and 35B keep active KV resident.
Streaming is automatic and trades SSD reads for RAM. KV spill requires a writable SSD cache with available quota.
--max-memoryleaves room for other applications and shrinks the automatic stores. Streamed prefill runs in passes so other requests can decode and cancellations take effect between passes.Up to 1M context
All three families support static YaRN beyond their native 262,144-token window. Add
--max-context 1Mto enable it;1Mmeans 1,000,000 tokens, with an upper limit of 1,010,000 (#431, #469, #518).The requested context must fit available RAM and SSD resources. YaRN stays off within the native window and changes outputs even on short prompts when enabled, so request the longer window when needed.
Faster decode
MoE targets adapt how many draft tokens they verify, avoiding work on unlikely proposals (#487). Against verifying every row, Flash-Next Q2_0 with a 12G expert store gained 13–38% decode throughput at one to four concurrent requests on an M5 Max 36 GB. The 35B UD-Q2_K_XL with a 4G store gained 6.5–42% on an M6 24 GB.
JSON Schema and ordinary requests now share decode batches (#520). With two of each on an M5 Max 36 GB, aggregate throughput rose 349 → 457 tok/s for the 35B MLX 4-bit and 138 → 210 tok/s for the 27B MLX 4-bit. Single-request throughput was unchanged within noise.
These comparisons measure individual changes. Metal optimizations also improve MoE projections, gathering, low-bit decode and sparse attention.
Other changes
- Preserve conversation replay states during routine memory reclamation, and durable restart points when the SSD cache fills. Fix spill-resume accounting, pinned-cache lifetime errors and engine relaunch with spilled KV (#484, #512, #513, #524).
- A single unexpected exit no longer clears persistent cache; repeated failures or engine-reported execution faults during startup probation still can (#498).
- Honor explicit
--max-cache-disk SIZEquotas subject to the volume's free-space floor. Fix a host-step race that could cause GPU timeouts, and avoid watchdog restarts while streamed commands make progress (#479, #494, #515). - Load split GGUFs, Q2_0 and additional GGUF norm/router/gate tensor types. Add network-free
install.local.prepare_local_model()for local checkpoints (#451, #452, #500). - Normalize tool-schema type aliases and preserve untyped arguments as text. Bound schema/prompt cache
- MoE experts: GGUF and MLX targets keep experts resident when they fit, otherwise stream them from the SSD.
- 1.3.2Splash 1.3.22026-10-14 · 2026-10-14 09:58 UTC
查看更新说明
Splash 1.3.2 adds NVFP4 and FP8 checkpoints, more GGUF layouts, optional BF16 recurrent states and thinking budgets. The SSD prefix cache is now on by default, with faster prefill and lower TTFT.
Models
These changes apply to Qwen3.8-27B and Qwen3.6-35B-A3B checkpoints and compatible fine-tunes:
- Load MLX
nvfp4, NVIDIA Model Optimizer and compressed-tensors NVFP4/FP8 checkpoints, and llama.cpp NVFP4 GGUFs. For example:nvidia/Qwen3.8-27B-NVFP4andmlx-community/Qwen3.6-35B-A3B-nvfp4(#356). - Load more GGUF variants, including
UD-Q8_K_XL, Q5_0/Q5_1 weights, IQ1_M and IQ2_S token tables, other previously refused embedding types, fused MoE gate/up experts and mixed-type GDN alpha/beta tensors. Quantized checkpoints can now contain BF16 and F16 weights; whole BF16, F16 and F32 targets remain unsupported (#379, #403; fixes #375 and #394).
Memory and caching
--state-format bf16halves the GDN recurrent-state storage. A cached state shrinks from about 153 to 81 MiB on the 27B and from 64 to 34 MiB on the 35B. Computation stays FP32, with rounding when BF16 states are stored; FP32 remains the default (#385).- The SSD prefix cache defaults to
auto, with a quota up to 32 GiB that follows available space on its local volume.--max-cache-disk 0turns it off. The cache adjusts as the volume fills and can keep serving after a full-disk write; unused persistent caches are cleaned up after 14 days (#408). --persistent-cachekeeps the SSD cache across restarts and remains off by default. It now works without an explicit disk quota.--max-cache-disk-writes SIZEreduces optional writes to a daily budget; conversation resume states, their KV pages and the clean-stop flush can exceed it. Writes have no budget unless one is set (#408).- The RAM prefix cache grows only into spare memory and gives memory back when macOS warns. Idle reclaim avoids repeatedly discarding an extra recovery margin when no request needs it (#383, #418; fixes #325).
POST /v1/memory/releasefrees idle model weights on demand while keeping the prefix cache. It works with--idle-release off; the next request restores the weights. A busy engine or a restore in progress returns 409engine_busy, and 200 confirms the weights are released (#374, #416).cache_saltisolates KV and cached states between different salts, including on disk. Chat/text completion metrics and the Done log now report KV reused beyond a request's initial cached prefix asdeduplicated_tokens, including reuse after suspension (#382, #415; fixes #368).
Thinking and agent compatibility
- Limit reasoning with
thinking_token_budgetin Chat Completions and Responses, or set a server default with--thinking-token-budget N. The default is uncapped;-1disables the cap for a request. Messages honors enabled thinking's requiredbudget_tokens(at least 1024) and accepts budgets at or abovemax_tokens(#397, #411; fixes #373). --thinking-end-text TEXTcan turn the model toward its answer when the budget runs out. The text must end with</think>and fit within 64 tokens. With structured output or constrained tools, the cutoff waits for a complete character before closing thinking, avoiding grammar failures on split Unicode characters; reasoning can therefore run a few tokens past the budget (#405, #421).- Messages applies Claude Code's mid-session
tool_additionandtool_removalblocks in conversation order, including additions by reference. Later definitions replace tools of the same name (#391; fixes #389). - Tool names can contain dots, spaces, punctuation and Unicode, up to 256 characters within the call format's rules. Non-strict tools with unusable JSON Schema descriptions no longer reject the whole request; strict tools still require valid schemas (#400; fixes #392).
- Output limits larger than the remaining context now generate up to the window's end instead of returning 400. Optional null fields,
seed: -1, stop strings alongside tools o
- Load MLX
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Splash
A local inference engine for Apple silicon, built around the model.
Splash runs coding agents and OpenAI or Anthropic compatible applications on one Mac. It combines DFlash 2 speculative decoding, specialized Metal kernels, and automatic memory planning, with vision, tool calling, and a built-in chat page. It reuses cached prefixes and batches concurrent requests automatically.
Quick start
Download the Splash desktop app for an Apple M3 or newer on macOS 26.4 or later, open the disk image and drag Splash into Applications.
The command line needs the same Mac and Homebrew:
brew install incoai/tap/splash
splash serve --model unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_M
The first run downloads the model and its matching draft and starts serving
on 127.0.0.1:8000. Later starts reuse the downloads; leave room on disk for
them (storage requirements).
Once it prints Ready, leave this terminal open. Open http://127.0.0.1:8000
in your browser, or run an installed coding agent from another terminal:
splash opencode # or: splash claude / splash codex / splash hermes / splash pi
For a server started with another --port, pass the same --port to the agent.
Press Ctrl+C in the server terminal to stop Splash. For LM Studio Bionic, follow its Splash setup guide.
Use the API
OpenAI Chat Completions, Responses and Completions, and Anthropic Messages, with streaming, tool calls, JSON Schema output, and base64 images and PDFs:
curl http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_M",
"messages": [{"role": "user", "content": "Explain speculative decoding in one sentence."}]
}'
Reasoning follows the model default; "reasoning_effort": "none" turns it off
in Chat. Anthropic Messages requests reason only when they set thinking.
Reasoning settings ·
Tool calls ·
API details
Models
Splash supports these model families, with a matching DFlash2 draft selected automatically:
| Model | GGUF example | MLX 4-bit |
|---|---|---|
| Qwen3.8-27B | unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_M | mlx-community/Qwen3.8-27B-4bit |
| Qwen3.6-35B-A3B | unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q4_K_M | mlx-community/Qwen3.6-35B-A3B-4bit |
| Ornith-1.5-122B | unsloth/Ornith-1.5-122B-GGUF:UD-Q4_K_XL | ornith-ai/Ornith-1.5-122B-MLX-4bit |
| Qwen3.8-Flash-Next | ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF:Q2_0 | — |
| Flint | unsloth/flint-GGUF:UD-Q4_K_XL | — |
Unsloth GGUF variants span 1–8 bits, including mixed-precision UD formats
up to UD-Q8_K_XL, whose BF16 tensors load too. Whole-BF16 and F16 models are
not supported: the installer refuses a GGUF whose projections and experts are
all BF16, F16 or F32.
Prism ML Ternary Bonsai 2
is also supported in PQ2_0 (7.2 GB), including vision. Pass OWNER/REPO:VARIANT
to --model, as in the quick start. MLX targets can be affine 2–8-bit,
including mixed precision, mxfp4 or nvfp4. NVIDIA's and unsloth's NVFP4
checkpoints and NVFP4 GGUFs also load. Smaller variants run on
24 GB Macs.
27B variants ·
35B variants ·
Ornith-1.5-122B variants ·
Flash-Next variants
Vision and the tokenizer come from the target model's source. Model loading and compatibility · Supported formats
To serve files already on this Mac, pass the target's GGUF file or GGUF/MLX directory directly, and a compatible local DFlash2 draft:
splash serve --model local/qwen \
--model-dir /models/Qwen3.8-27B-GGUF/Qwen3.8-27B-UD-Q4_K_M.gguf \
--draft-model /models/Qwen3.8-27B-DFlash2
This prepares local files without contacting the Hub; --model is the name
reported by the API. Omit --draft-model to use the family's draft from the
Hub cache, or add --mmproj /models/mmproj-BF16.gguf for a GGUF's vision.
See local model files for details.
Settings
Memory and context are sized automatically, up to the model's native context
window. To set your own limits or cache options, add these to splash serve:
| Option | Purpose |
|---|---|
--max-memory 28G | Cap Metal memory use. |
--idle-release off | Keep the model in memory while idle (default: release after 10m). |
--max-context 100K | Set the context limit. Up to 1M tokens. |
--language-only | Skip vision; serve text only. |
--kv-format bf16 | Use BF16 KV cache. Default: 8-bit (INT8). |
--state-format bf16 | Use BF16 recurrent states, half the size. Default: FP32. |
--disable-ane | Prefill on the GPU alone. Default: the 27B also uses the Neural Engine. |
--max-cache-disk 16G | Cap the SSD cache (default: auto, up to 32 GiB; 0 turns it off). |
--persistent-cache | Keep the SSD cache across restarts. Off by default. |
Use --max-memory to leave room for other applications.
The server listens on localhost without authentication by default. For LAN
access, authentication, browser apps on other origins, and other options, see
server configuration or
splash serve --help.
KV precision ·
SSD cache ·
Advanced memory settings
Performance
Measured with Splash 1.0 on an M5 Pro (16-core GPU, 48 GB), using its model
packages and selected SPEED-Bench coding prompts over HTTP. Ratios compare
with the next-fastest engine measured in that benchmark. Qwen3.8-Flash-Next
(ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF:Q2_0) was measured the same way
with this release on an M5 Pro (20-core GPU, 64 GB); its ratios compare with
Strata serving the same GGUF on that Mac.
| Metric | Qwen3.6-35B-A3B | Qwen3.8-27B | Qwen3.8-Flash-Next |
|---|---|---|---|
| Decode · short prompt | 210 tok/s (1.7×) | 74 tok/s (2.0×) | 95 tok/s (1.3×) |
| Prefill · 32K prompt | 2,011 tok/s (1.3×) | 363 tok/s (1.2×) | 1,312 tok/s (1.3×) |
| Cached time to first token · 32K replay | 123 ms (6.6×) | 282 ms (7.3×) | 171 ms (212×) |
| Aggregate decode · 4 concurrent short prompts | 357 tok/s (2.0×) | 170 tok/s (3.9×) | 171 tok/s (2.4×) |
Launch benchmarks · Measurement details · Run benchmarks locally
GGUF against llama.cpp
Same Unsloth UD-Q4_K_M weights on Metal. Decode speed in tok/s:
| Model | Engine | M5 Pro, 20-core GPU | M3 Max, 40-core GPU |
|---|---|---|---|
| 27B | llama.cpp | 16 | 17 |
| llama.cpp with MTP | 27 | 20 | |
| Splash | 74 | 92 | |
| 35B-A3B | llama.cpp | 69 | 66 |
| Splash | 175 | 209 |
That is 2.5–3.2× as fast on the 35B and 4.5–5.3× on the 27B (2.7–4.6× against MTP).
Closely matches llama.cpp's predictions.
| Next-token agreement ↑ | 27B | 35B-A3B |
|---|---|---|
| llama.cpp: CPU vs. GPU | 97.8% | 96.5–96.9% |
| llama.cpp: single-token vs. batched | 99.65–99.75% | 97.95% |
| Splash vs. llama.cpp | 99.30–99.45% | 97.83–98.14% |
Splash uses BF16 KV and --disable-ane in this comparison.
Benchmark details
Design
Each supported model pairs a trained DFlash2 draft with Metal kernels for its shapes. The runtime, scheduler, cache, and API are shared. Weights are converted to the kernels' layouts as they load, with no copy on disk; kernels ship precompiled, with no Xcode or local tuning required. How Splash works
More
- Documentation: configuration, API, internals, building, and testing.
- Issues and feedback
- Apache-2.0. GGUF kernels include MIT-licensed material from llama.cpp; see third-party notices. Model weights keep their own licenses.