<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jovan Chan</title>
    <description>The latest articles on DEV Community by Jovan Chan (@jovan_chan_9500711396d4e6).</description>
    <link>https://dev.to/jovan_chan_9500711396d4e6</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3945669%2Fa08789e6-d856-4f19-ae91-169593c75a9c.png</url>
      <title>DEV Community: Jovan Chan</title>
      <link>https://dev.to/jovan_chan_9500711396d4e6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jovan_chan_9500711396d4e6"/>
    <language>en</language>
    <item>
      <title>WWDC 2026 Home Lab Verdict: What Apple's Foundation Models, Core AI, and Siri Actually Deliver for Local AI</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Tue, 07 Jul 2026 07:03:54 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/wwdc-2026-home-lab-verdict-what-apples-foundation-models-core-ai-and-siri-actually-deliver-for-400i</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/wwdc-2026-home-lab-verdict-what-apples-foundation-models-core-ai-and-siri-actually-deliver-for-400i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/wwdc-2026-apple-ai-home-lab-verdict-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Apple's WWDC 2026 delivered the AI do-over it promised in 2024 — a 20B sparse on-device model (AFM 3 Core Advanced), a Gemini-powered Siri routed through Private Cloud Compute, and Xcode 27 agents. For home lab builders the practical change is narrow: if you write Swift apps, free on-device inference and provider-agnostic agents are real. If you run Ollama or llama.cpp, none of it touches your stack — a used RTX 3090 still wins on tokens/sec and model choice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Apple Foundation Models (AFM 3)&lt;/th&gt;
&lt;th&gt;Open models on Apple Silicon&lt;/th&gt;
&lt;th&gt;Used RTX 3090 + Ollama&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;iOS/macOS app developers&lt;/td&gt;
&lt;td&gt;7B–70B open models on a Mac&lt;/td&gt;
&lt;td&gt;Max tok/s, widest model choice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Free on-device inference&lt;/td&gt;
&lt;td&gt;Device cost only&lt;/td&gt;
&lt;td&gt;~$1,070 used + ~$0.034/hr power&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;~30 tok/s (20B sparse)&lt;/td&gt;
&lt;td&gt;28.4 tok/s on 70B Q4 (M4 Max)&lt;/td&gt;
&lt;td&gt;~95 tok/s on a 7B model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The catch&lt;/td&gt;
&lt;td&gt;Apple's model only, 12GB+ RAM, Apple devices&lt;/td&gt;
&lt;td&gt;546 GB/s bandwidth ceiling&lt;/td&gt;
&lt;td&gt;24GB VRAM ceiling, 350W draw&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: WWDC 2026 makes Apple Silicon a better &lt;em&gt;app development&lt;/em&gt; platform, not a better &lt;em&gt;open-model&lt;/em&gt; platform. If you run Llama, Qwen, or Gemma locally, your RTX tower or Mac Studio works exactly as it did on June 7.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;In &lt;a href="https://dev.to/blog/wwdc-2026-apple-foundation-models-core-ai-home-lab-2026/"&gt;our June 2 preview&lt;/a&gt; we laid out what the rumor mill expected from Apple's keynote. The keynote happened June 8, and most of it landed. This is the follow-up: what Apple actually shipped, with the real numbers, and a verdict for anyone who builds or runs AI at home rather than just shipping iOS apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Apple actually announced
&lt;/h2&gt;

&lt;p&gt;The headline is &lt;strong&gt;AFM 3&lt;/strong&gt; — the third generation of Apple Foundation Models. The model that matters for hardware discussion is &lt;strong&gt;AFM 3 Core Advanced&lt;/strong&gt;: a 20-billion-parameter model that runs entirely on-device.&lt;/p&gt;

&lt;p&gt;The interesting part is &lt;em&gt;how&lt;/em&gt; it fits. AFM 3 Core Advanced uses a sparse architecture that activates only 1 to 4 billion parameters per request. Apple stores the full 20B weights in flash storage and loads just the relevant expert set into RAM once per prompt, through a lightweight dense routing block. That is a deliberate workaround to the RAM wall that has bottlenecked on-device models for years — you get the quality headroom of a 20B model without needing 20B parameters resident in DRAM.&lt;/p&gt;

&lt;p&gt;Performance is roughly &lt;strong&gt;30 tokens per second&lt;/strong&gt; on iPhone 15 Pro and iPhone 17 Pro class hardware. That's the same ballpark as the previous 3B on-device model, which tells you the sparse routing is doing its job: a much larger model, similar latency.&lt;/p&gt;

&lt;p&gt;The catch is the device floor. AFM 3 Core Advanced runs only on hardware with &lt;strong&gt;at least 12GB of RAM&lt;/strong&gt; — iPhone Air, iPhone 17 Pro and Pro Max, iPads with M4 or later, Vision Pro (M5), and Macs with M3 or later. Older 8GB devices fall back to the smaller AFM 3 Core model. If your home server is an M1 Mac mini with 8GB, the flagship on-device model isn't for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  The three-tier stack
&lt;/h3&gt;

&lt;p&gt;Apple settled on a clear three-layer architecture, and it's worth understanding because it determines what touches your hardware and what doesn't:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;On-device (AFM 3 Core / Core Advanced)&lt;/strong&gt; — expressive voices, dictation, on-screen awareness, structured extraction, and quick personal-context lookups. Runs on the Neural Engine and GPU of your Apple Silicon device. No network, no API key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Cloud Compute&lt;/strong&gt; — heavier requests that still need Apple's privacy guarantees, run on Apple Silicon servers where Apple says data isn't stored or made readable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AFM Cloud Pro&lt;/strong&gt; — the top tier for world-knowledge and complex reasoning. Apple says it matches Gemini Frontier quality and runs on &lt;strong&gt;NVIDIA GPUs in Google's cloud&lt;/strong&gt;, custom-built in collaboration with Google's Gemini program.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So the new Siri is a hybrid: simple, personal, on-device work stays local; the chatbot-grade reasoning routes out to Gemini-class infrastructure. AppleInsider's reporting is worth noting here — Apple was explicit that the &lt;em&gt;on-device&lt;/em&gt; models contain no Gemini weights. The Google collaboration lives in the cloud tier, not on your phone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Foundation Models framework: the developer angle
&lt;/h3&gt;

&lt;p&gt;For anyone writing apps, the framework got the upgrades that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal image input&lt;/strong&gt; — you can now send images alongside text. The on-device model identifies objects, extracts text, and reads screenshots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A single API surface&lt;/strong&gt; that unifies on-device, server-side, and third-party provider access. You can swap the underlying provider without rewriting your code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open source this summer&lt;/strong&gt;, with Linux server support — which is the genuinely surprising one, and the only WWDC item that reaches beyond Apple's own walled garden.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Xcode 27 agents
&lt;/h3&gt;

&lt;p&gt;Xcode 27 ships a dual-engine agentic coding system: a local Neural Engine model for real-time Swift completion that never sends your source off-device, plus a cloud routing layer to Anthropic Claude, Google Gemini, or OpenAI GPT for heavier analysis. Xcode is now an MCP host (via a &lt;code&gt;mcpbridge&lt;/code&gt; binary), so any agent that speaks the Model Context Protocol can read diagnostics, symbol info, SwiftUI previews, and the Swift REPL live. The agent can run test suites, drive the iOS Simulator through a new Device Hub, and pull crash reports from Organizer to fix the underlying code.&lt;/p&gt;

&lt;p&gt;If your interest is AI &lt;em&gt;coding&lt;/em&gt; rather than AI &lt;em&gt;hardware&lt;/em&gt;, our sister site covers the agentic-IDE landscape in depth at &lt;a href="https://aicoderscope.com/" rel="noopener noreferrer"&gt;aicoderscope.com&lt;/a&gt; — the Xcode 27 model is conceptually close to what Cursor and Cline already do, now first-party on the Mac.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this changes for home lab builders (and what it doesn't)
&lt;/h2&gt;

&lt;p&gt;Here's the part the keynote glosses over. There are two completely separate things people mean by "local AI on a Mac," and WWDC 2026 only moves one of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track 1: Apple's own AI stack.&lt;/strong&gt; Foundation Models, Core AI (Apple's modernized successor to Core ML), AFM 3, Siri. This is for shipping features inside iOS/macOS apps. It got materially better. The free on-device inference is real, the privacy story is solid, and the framework going open source could matter for cross-platform developers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track 2: running open-weight models yourself.&lt;/strong&gt; Ollama, llama.cpp, LM Studio, vLLM, ComfyUI — Llama 4, Qwen3.6, Gemma 4, DeepSeek, Mistral. WWDC 2026 changed &lt;em&gt;nothing&lt;/em&gt; here. Apple did not open the Neural Engine to third-party LLM runtimes, did not ship a faster Metal inference path as a headline feature, and AFM 3 is not a model you can pull into Ollama. Your &lt;code&gt;ollama run&lt;/code&gt; workflow on June 17 is identical to June 7.&lt;/p&gt;

&lt;p&gt;This distinction is the whole verdict. If you bought a Mac Studio to run Qwen3.6 and Llama 3.3 70B, the WWDC announcements are interesting news but not an upgrade to your rig.&lt;/p&gt;

&lt;h3&gt;
  
  
  The numbers that actually decide your hardware
&lt;/h3&gt;

&lt;p&gt;For Track 2 — the thing this site is about — the bandwidth and tok/s reality is unchanged:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hardware&lt;/th&gt;
&lt;th&gt;Memory bandwidth&lt;/th&gt;
&lt;th&gt;Llama 3.3 70B Q4_K_M&lt;/th&gt;
&lt;th&gt;7B model&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mac Studio M4 Max&lt;/td&gt;
&lt;td&gt;546 GB/s&lt;/td&gt;
&lt;td&gt;~28.4 tok/s&lt;/td&gt;
&lt;td&gt;~87 tok/s&lt;/td&gt;
&lt;td&gt;Unified memory, quiet, low power&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Used RTX 3090&lt;/td&gt;
&lt;td&gt;936 GB/s&lt;/td&gt;
&lt;td&gt;offload needed (24GB)&lt;/td&gt;
&lt;td&gt;~95 tok/s&lt;/td&gt;
&lt;td&gt;CUDA ecosystem, ~350W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AFM 3 Core Advanced&lt;/td&gt;
&lt;td&gt;(flash-routed)&lt;/td&gt;
&lt;td&gt;n/a — Apple model only&lt;/td&gt;
&lt;td&gt;~30 tok/s&lt;/td&gt;
&lt;td&gt;20B sparse, 12GB+ RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A used &lt;a href="https://www.amazon.com/s?k=RTX+3090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 3090&lt;/a&gt; still has the highest memory bandwidth in this comparison at 936 GB/s, and bandwidth is what governs decode speed for local LLMs. In June 2026 it averages around &lt;strong&gt;$1,070&lt;/strong&gt; used (range $966–$1,189), which is remarkable staying power for a card this old — and a direct consequence of the &lt;a href="https://dev.to/blog/nvidia-no-new-consumer-gpus-2026-home-lab-buying-guide/"&gt;GDDR7 shortage squeezing new GPU supply&lt;/a&gt;. The 24GB ceiling and ~350W draw (about $0.034/hour at $0.12/kWh) are the trade-offs.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.amazon.com/s?k=Mac+Studio+M4+Max&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;Mac Studio M4 Max&lt;/a&gt; at 546 GB/s wins on capacity and noise: its unified memory le&lt;/p&gt;

</description>
      <category>apple</category>
      <category>wwdc2026</category>
      <category>foundationmodels</category>
      <category>ondeviceai</category>
    </item>
    <item>
      <title>WSL 3 GPU Passthrough for Local AI on Windows in 2026: Near-Native Ollama, llama.cpp, and PyTorch</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Mon, 06 Jul 2026 07:05:36 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/wsl-3-gpu-passthrough-for-local-ai-on-windows-in-2026-near-native-ollama-llamacpp-and-pytorch-59eg</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/wsl-3-gpu-passthrough-for-local-ai-on-windows-in-2026-near-native-ollama-llamacpp-and-pytorch-59eg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/wsl3-gpu-passthrough-local-ai-windows-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: WSL 3, previewed at Microsoft Build 2026, swaps the heavy Hyper-V backend for a paravirtualized machine that gives Linux apps GPU and NPU access at within 3-5% of bare-metal Linux speed. If you already run Ollama in WSL 2 on an NVIDIA card, the practical gain is small — WSL 2 was already within ~5%. The real story is NPU passthrough, and that ships Intel/Qualcomm-only at launch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you'll be able to do after this guide:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run Ollama, llama.cpp, and PyTorch inside Linux on Windows with full GPU acceleration and no separate Linux driver install.&lt;/li&gt;
&lt;li&gt;Understand whether WSL 3 is worth chasing on the Insider channel, or whether your current WSL 2 setup is already fast enough.&lt;/li&gt;
&lt;li&gt;Avoid the single most common mistake that drops you to CPU-only inference (and costs you ~10× the tokens/sec).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: For an NVIDIA GPU owner, WSL 2 today already runs Ollama within 5% of native — WSL 3 is a nice-to-have, not a reason to flash an Insider build. The people who should actually care are Copilot+ laptop owners who finally get NPU passthrough.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Microsoft actually announced
&lt;/h2&gt;

&lt;p&gt;At Build 2026 (June 2, 2026), Microsoft previewed WSL 3. The headline change is architectural: it replaces the Hyper-V VM backend that WSL 2 has used since 2020 with a lighter paravirtualized machine, and routes GPU and NPU access through DirectML 2.0. Microsoft's claim is that PyTorch, CUDA, and JAX workloads run inside WSL 3 at within 3-5% of bare-metal Linux speed.&lt;/p&gt;

&lt;p&gt;That 3-5% number is the one to anchor on, because it reframes the whole pitch. WSL 2's GPU passthrough was never the bottleneck people assumed it was — for GPU-accelerated inference, WSL 2 already lands within roughly 5% of native Windows Ollama. So for a discrete NVIDIA GPU, WSL 3 is closing a gap that was already small. The genuinely new capability is NPU passthrough, which WSL 2 never had at all.&lt;/p&gt;

&lt;p&gt;WSL 3 is available now through the Windows Insiders program and will roll out via Windows Update later, the same way WSL 2 updates have always shipped.&lt;/p&gt;

&lt;h3&gt;
  
  
  NPU passthrough is the real change — and it's not for everyone yet
&lt;/h3&gt;

&lt;p&gt;NPU passthrough at launch is limited to Copilot+ class silicon:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qualcomm Snapdragon X Elite / X Elite 2&lt;/strong&gt; — Hexagon NPU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intel Meteor Lake / Lunar Lake&lt;/strong&gt; — Core Ultra NPU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AMD Ryzen AI support is deferred to a later date. The minimum bar for NPU passthrough is a 40 TOPS NPU, which matches the Copilot+ hardware floor. Machines below that, or with no qualifying NPU, still get the GPU improvements — they just don't get NPU access.&lt;/p&gt;

&lt;p&gt;Alongside WSL 3, Microsoft shipped &lt;strong&gt;DirectML 2.0&lt;/strong&gt;, which adds better use of AMD's XDNA 2 architecture, brings Intel Core Ultra Series 3 (50 TOPS) support, and tunes the Phi Silica model across AMD, Intel, and Qualcomm NPUs. The XDNA 2 work in DirectML 2.0 is the hint that AMD NPU passthrough in WSL is a "when," not an "if."&lt;/p&gt;

&lt;p&gt;One reality check before you get excited about NPU inference: an NPU is not a shortcut to GPU-class tokens/sec. Decode throughput on local LLMs is bound by memory bandwidth, not raw TOPS, which is why Copilot+ laptops post single-digit-to-low-double-digit tokens/sec on 8B models while a discrete card clears 30+. We covered exactly why in &lt;a href="https://dev.to/blog/npu-vs-gpu-local-llm-2026/"&gt;NPU vs Discrete GPU for Local LLMs&lt;/a&gt; — read it before assuming the NPU in your new laptop replaces a GPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does the 3-5% number matter for your hardware?
&lt;/h2&gt;

&lt;p&gt;Here's the comparison that actually decides whether WSL 3 is worth chasing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;WSL 2 today&lt;/th&gt;
&lt;th&gt;WSL 3 (Insider)&lt;/th&gt;
&lt;th&gt;Bare-metal Linux&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA GPU (CUDA)&lt;/td&gt;
&lt;td&gt;~5% slower than native&lt;/td&gt;
&lt;td&gt;within 3-5%&lt;/td&gt;
&lt;td&gt;baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NPU access&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;Intel/Qualcomm only&lt;/td&gt;
&lt;td&gt;vendor-dependent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup effort&lt;/td&gt;
&lt;td&gt;mature, well-documented&lt;/td&gt;
&lt;td&gt;preview, expect rough edges&lt;/td&gt;
&lt;td&gt;dual-boot or separate machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;anyone with an NVIDIA card now&lt;/td&gt;
&lt;td&gt;Copilot+ laptop NPU users&lt;/td&gt;
&lt;td&gt;absolute max throughput&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you own a discrete NVIDIA GPU, you are in the top row, and the difference between "~5% slower" and "3-5% slower" is inside the noise of run-to-run variance. There is no compelling reason to move to an Insider build for inference speed alone. Keep your stable WSL 2 setup.&lt;/p&gt;

&lt;p&gt;If you own a Copilot+ laptop with a qualifying Intel or Qualcomm NPU, WSL 3 is the first time you can drive that NPU from Linux tooling. That's the upgrade worth the Insider risk — with the caveat above about what NPU throughput actually looks like.&lt;/p&gt;

&lt;p&gt;For context on what GPU throughput you're protecting with that "within 5%" figure: a correctly-loaded 8B model clears about 95 tok/s on a used &lt;a href="https://www.amazon.com/s?k=RTX+3090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 3090&lt;/a&gt; and roughly 104 tok/s on an &lt;a href="https://www.amazon.com/s?k=RTX+4090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 4090&lt;/a&gt; under llama.cpp. The 3090 lands about 16.6% behind the 4090 on these workloads. A 5% WSL tax on top of either is a few tokens/sec — real, but not workflow-changing. (llama.cpp itself runs about 3-10% faster than Ollama on NVIDIA GPUs, so your engine choice matters more than your virtualization layer.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting it up: WSL 2 today, WSL 3 on Insider
&lt;/h2&gt;

&lt;p&gt;The setup flow is nearly identical between WSL 2 and WSL 3 — the passthrough plumbing changed underneath, but the user-facing commands didn't. This is the path that works on a stable Windows 11 machine right now with WSL 2, and the same steps apply once WSL 3 reaches your channel.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install WSL and a distro
&lt;/h3&gt;

&lt;p&gt;From an elevated PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Ubuntu-24.04&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--update&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--status&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;wsl --update&lt;/code&gt; pulls the latest kernel. On the Insider channel with WSL 3 available, the same &lt;code&gt;--update&lt;/code&gt; is what flips you onto the new backend; check &lt;code&gt;wsl --version&lt;/code&gt; afterward to confirm.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Install the Windows GPU driver — and ONLY the Windows driver
&lt;/h3&gt;

&lt;p&gt;This is the step that trips up almost everyone. The CUDA libraries are exposed inside Linux automatically through &lt;code&gt;/usr/lib/wsl/lib/&lt;/code&gt;. You do &lt;strong&gt;not&lt;/strong&gt; install a Linux NVIDIA driver inside the distro. Installing a separate Linux driver inside WSL is the most common way people break passthrough and silently fall back to CPU.&lt;/p&gt;

&lt;p&gt;Install the normal NVIDIA Windows driver (a recent Game Ready or Studio driver is fine — WSL-specific CUDA drivers are no longer required), then verify from inside WSL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see your GPU and its VRAM, passthrough is live. If &lt;code&gt;nvidia-smi&lt;/code&gt; is missing or errors, you either skipped the Windows driver or installed a Linux driver on top of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Install the CUDA toolkit (only if you compile)
&lt;/h3&gt;

&lt;p&gt;For Ollama you don't need the full toolkit — its bundled runtime is enough. If you compile llama.cpp or build PyTorch extensions, install the WSL-Ubuntu CUDA toolkit, which is the keyring package that does &lt;strong&gt;not&lt;/strong&gt; ship a display driver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; cuda-keyring_1.1-1_all.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;cuda-toolkit-12-6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Run Ollama and confirm it's on the GPU
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
ollama run llama3.1:8b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a second terminal, while a prompt is generating:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output on a working GPU setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME           ID            SIZE     PROCESSOR    UNTIL
llama3.1:8b    365c0bd3c000  6.2 GB   100% GPU     4 minutes from now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;100% GPU&lt;/code&gt; is the goal. If you see &lt;code&gt;100% CPU&lt;/code&gt; or a CPU/GPU split, the model didn't fully offload. A correctly offloaded 8B model should clear 30 tok/s on any modern card and much more on a 3090/4090.&lt;/p&gt;

&lt;h2&gt;
  
  
  The error you'll actually hit, and the fix
&lt;/h2&gt;

&lt;p&gt;The single most common failure isn't exotic — it's the GPU disappearing from WSL after a Windows update or a sleep cycle, leaving Ollama on CPU at a tenth of the speed. The symptom in &lt;code&gt;ollama ps&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME           ID            SIZE     PROCESSOR    UNTIL
llama3.1:8b    365c0bd3c000  6.2 GB   100% CPU     4 minutes from now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Walk it in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;**&lt;code&gt;nvidia-smi&lt;/code&gt; inside WSL returns noth&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>wsl</category>
      <category>windows</category>
      <category>localllm</category>
      <category>ollama</category>
    </item>
    <item>
      <title>Why Local LLMs Got Good in 2026: Multi-Token Prediction, Speculative Decoding, and the MoE Efficiency Leap</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Mon, 06 Jul 2026 07:04:50 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/why-local-llms-got-good-in-2026-multi-token-prediction-speculative-decoding-and-the-moe-c29</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/why-local-llms-got-good-in-2026-multi-token-prediction-speculative-decoding-and-the-moe-c29</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/why-local-llms-got-good-mid-2026-speculative-decoding-moe/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Local models didn't just get bigger in 2026 — they got faster at the same quality. Three techniques did the heavy lifting: multi-token prediction (~1.8× throughput, lossless), speculative decoding (1.5–3× on consumer GPUs), and sparse MoE routing (35B of weights, only 3B active per token). Together they put GPT-4-class output on a single 24GB GPU at usable speeds.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Multi-token prediction&lt;/th&gt;
&lt;th&gt;Speculative decoding&lt;/th&gt;
&lt;th&gt;Sparse MoE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it speeds up&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Decode (built into the model)&lt;/td&gt;
&lt;td&gt;Decode (runtime trick, any model)&lt;/td&gt;
&lt;td&gt;Decode + memory pressure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typical gain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1.8× (85–90% accept rate)&lt;/td&gt;
&lt;td&gt;1.5–3× depending on accept rate&lt;/td&gt;
&lt;td&gt;3B active vs 35B total → ~30B-dense feel at 3B-dense speed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The catch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Model must be trained with it&lt;/td&gt;
&lt;td&gt;Needs a good small draft model + extra VRAM&lt;/td&gt;
&lt;td&gt;Still needs VRAM for all weights&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: None of these are magic — they all trade extra compute or memory for fewer sequential steps. But stacked together on a model like Qwen3.6 35B-A3B, they're the reason a used &lt;a href="https://www.amazon.com/s?k=RTX+3090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 3090&lt;/a&gt; now does everyday coding and writing that needed a cloud API call 18 months ago.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The thing that actually changed
&lt;/h2&gt;

&lt;p&gt;Ask anyone who ran local models in 2024 and they'll tell you the same story: a 7B model was fast but dumb, and a 70B model was smart but unusably slow on consumer hardware. You picked your poison. The honest answer to "should I run this locally or just call an API?" was usually "call the API."&lt;/p&gt;

&lt;p&gt;That tradeoff broke in 2026, and it broke for a specific, technical reason. The models people run at home — Qwen3.6, Gemma 4, GPT-OSS, Nemotron-Cascade — aren't just bigger or better-trained than their predecessors. They're architected so the &lt;em&gt;expensive&lt;/em&gt; part of generation (decoding one token at a time) costs far less per token than the raw parameter count suggests.&lt;/p&gt;

&lt;p&gt;There are three distinct techniques doing this, and they're often confused because they all attack the same bottleneck. This article separates them, shows what each one actually buys you, and explains why the combination — not any single one — is what closed the gap to cloud.&lt;/p&gt;

&lt;p&gt;If you just want to know which model to pull for your GPU, the &lt;a href="https://dev.to/blog/open-source-llm-consumer-gpu-shootout-2026/"&gt;open-source LLM shootout&lt;/a&gt; has the picks by VRAM tier. This article is the &lt;em&gt;why&lt;/em&gt; behind those picks.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bottleneck: why decoding is slow in the first place
&lt;/h2&gt;

&lt;p&gt;Every autoregressive LLM generates text one token at a time. To produce token N, the model runs a full forward pass using tokens 1 through N−1 as context. Then it appends token N and runs &lt;em&gt;another&lt;/em&gt; full forward pass for token N+1. The passes are strictly sequential — you can't start computing token N+1 until you know token N.&lt;/p&gt;

&lt;p&gt;Here's the part that surprises people: that forward pass is &lt;strong&gt;memory-bandwidth-bound, not compute-bound&lt;/strong&gt;. For a single user generating one token, the GPU spends most of its time reading the model's weights out of VRAM, not doing math. A dense 32B model at Q4 has roughly 18GB of weights, and the GPU has to stream a large fraction of those through its memory bus for every single token.&lt;/p&gt;

&lt;p&gt;That's why a used RTX 3090, with 936 GB/s of memory bandwidth, does roughly 95 tok/s on a 7B model but only a fraction of that on a dense 32B — the model is the same architecture, there are just more weights to read each step. The short version, which the &lt;a href="https://dev.to/blog/best-local-ai-models-by-vram/"&gt;VRAM-tier guide&lt;/a&gt; leans on throughout: decode speed tracks bandwidth ÷ active-weight-size far more than it tracks raw TFLOPS.&lt;/p&gt;

&lt;p&gt;All three 2026 techniques are different answers to one question: &lt;strong&gt;how do we produce more tokens without reading all the weights that many times in sequence?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Technique 1: Sparse MoE — read fewer weights per token
&lt;/h2&gt;

&lt;p&gt;Mixture-of-Experts is the most consequential of the three, and it's the easiest to understand once you frame it around bandwidth.&lt;/p&gt;

&lt;p&gt;A dense 32B model reads ~32B parameters' worth of weights for every token. A Mixture-of-Experts model splits most of its parameters into "expert" sub-networks and adds a small router that picks which experts to use for each token. The model still &lt;em&gt;stores&lt;/em&gt; all the weights, but it only &lt;em&gt;reads&lt;/em&gt; the active ones per token.&lt;/p&gt;

&lt;p&gt;Two of the most-run local models in 2026 are built this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3.6 35B-A3B&lt;/strong&gt;: 35 billion total parameters, but only ~3 billion active per token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4 26B-A4B&lt;/strong&gt;: 26 billion total, ~4 billion active per token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The "A3B" / "A4B" suffix literally means "active 3 billion / active 4 billion." That naming convention is itself a sign of how central this idea became.&lt;/p&gt;

&lt;p&gt;The payoff shows up directly in benchmarks. On an RTX 4090, a dense 32B model at Q4 lands near &lt;strong&gt;60 tok/s&lt;/strong&gt;, while a ~30B MoE model with 3B active runs around &lt;strong&gt;110 tok/s&lt;/strong&gt; at 32K context — nearly double, from a model with &lt;em&gt;more&lt;/em&gt; total parameters. Reported numbers vary by runtime and context length (one careful Q4_K_M measurement put Qwen3.5 35B-A3B at ~78 tok/s decode on a 4090), but the direction is consistent: you get the throughput of a ~3B model with the knowledge capacity of a much larger one.&lt;/p&gt;

&lt;p&gt;The catch — and it's a real one — is VRAM. MoE saves &lt;em&gt;bandwidth&lt;/em&gt;, not &lt;em&gt;capacity&lt;/em&gt;. You still have to hold all 35B parameters in memory, so Qwen3.6 35B-A3B needs a 24GB card just like a dense model of that size would. MoE makes the smart model &lt;em&gt;fast&lt;/em&gt;; it doesn't make it &lt;em&gt;fit on less&lt;/em&gt;. That distinction trips up a lot of buyers, which is why the &lt;a href="https://dev.to/blog/best-local-ai-models-by-vram/"&gt;VRAM-tier guide&lt;/a&gt; leads with total size, not active size.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technique 2: Speculative decoding — guess ahead, verify in parallel
&lt;/h2&gt;

&lt;p&gt;Speculative decoding is a pure runtime trick. It doesn't change the model's weights or quality at all — it changes how you &lt;em&gt;run&lt;/em&gt; inference.&lt;/p&gt;

&lt;p&gt;The idea: pair your big "target" model with a small, fast "draft" model. The draft model cheaply generates a short run of candidate tokens — say the next 4. Then the target model does &lt;strong&gt;one&lt;/strong&gt; forward pass that verifies all 4 candidates at once (verification is parallel; generation is not). Every candidate the target agrees with is accepted for free; the first disagreement is corrected, and you start the next round from there.&lt;/p&gt;

&lt;p&gt;The crucial property is that &lt;strong&gt;the output is bit-for-bit identical to what the target model would have produced alone&lt;/strong&gt;. Speculative decoding is &lt;em&gt;lossless&lt;/em&gt; — tuning how many tokens the draft proposes changes speed only, never the text. That's what separates it from quantization or distillation, which trade quality for speed.&lt;/p&gt;

&lt;p&gt;Real-world gains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;General reports put speculative decoding at &lt;strong&gt;2–3× speedup with no quality change&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;llama.cpp&lt;/strong&gt; specifically, users see &lt;strong&gt;1.5×–3× tokens/sec&lt;/strong&gt; depending on how often the draft model's guesses are accepted.&lt;/li&gt;
&lt;li&gt;NVIDIA has demonstrated up to &lt;strong&gt;3.6× throughput&lt;/strong&gt; on H200-class hardware with tuned draft models.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The acceptance rate is everything. If your draft model agrees with the target 80% of the time, most of your speculative tokens stick and you get a big speedup. If the draft is poorly matched and only agrees 30% of the time, you've paid for draft passes that get thrown away and you might even go &lt;em&gt;slower&lt;/em&gt;. This is why picking a draft model from the same family (e.g. a 0.5B Qwen drafting for a 32B Qwen) matters — they make similar predictions.&lt;/p&gt;

&lt;p&gt;By late 2025 this moved from research curiosity to production default: &lt;strong&gt;vLLM&lt;/strong&gt; and &lt;strong&gt;TensorRT-LLM&lt;/strong&gt; ship native support, and &lt;strong&gt;llama-server&lt;/strong&gt; (the &lt;a href="https://dev.to/blog/vllm-vs-ollama-when-each-wins-2026/"&gt;backbone of many local setups&lt;/a&gt;) supports several implementations. The cost is extra VRAM for the draft model and some tuning of the speculative length — a small price for a free 1.5–3×.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technique 3: Multi-token prediction — bake the drafting into the model
&lt;/h2&gt;

&lt;p&gt;Multi-token prediction (MTP) is the technique people most often confuse with speculative decoding, because the &lt;em&gt;mechanism&lt;/em&gt; at inference time looks similar. The difference is where&lt;/p&gt;

</description>
      <category>localllm</category>
      <category>moe</category>
      <category>speculativedecoding</category>
      <category>multitokenprediction</category>
    </item>
    <item>
      <title>RTX PRO 6000 Blackwell for Local AI in 2026: 96GB GDDR7, the 120B+ MoE Threshold, and Whether a Workstation Card Makes Sense for Home Labs</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Mon, 06 Jul 2026 07:04:07 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/rtx-pro-6000-blackwell-for-local-ai-in-2026-96gb-gddr7-the-120b-moe-threshold-and-whether-a-k2</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/rtx-pro-6000-blackwell-for-local-ai-in-2026-96gb-gddr7-the-120b-moe-threshold-and-whether-a-k2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/rtx-pro-6000-blackwell-local-ai-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: The RTX PRO 6000 Blackwell gives you 96GB of GDDR7 in a single PCIe slot, enough to run gpt-oss 120B or Llama 3.3 70B at FP8 with KV-cache headroom to spare — at ~193 tok/s on the 120B. But at roughly $8,500, it costs more than three used RTX 3090s and shares the exact same 1.79 TB/s bandwidth as a $3,000 RTX 5090. You pay for capacity and a single-slot footprint, not raw speed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;RTX PRO 6000 Blackwell&lt;/th&gt;
&lt;th&gt;RTX 5090&lt;/th&gt;
&lt;th&gt;3× Used RTX 3090&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;70B–120B models on one card&lt;/td&gt;
&lt;td&gt;Single-GPU 32GB workloads&lt;/td&gt;
&lt;td&gt;Max VRAM-per-dollar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price (Jun 2026)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$8,000–$9,400&lt;/td&gt;
&lt;td&gt;~$2,900–$4,300&lt;/td&gt;
&lt;td&gt;~$2,100–$2,400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VRAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;96GB GDDR7 ECC&lt;/td&gt;
&lt;td&gt;32GB GDDR7&lt;/td&gt;
&lt;td&gt;72GB pooled GDDR6X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.79 TB/s&lt;/td&gt;
&lt;td&gt;1.79 TB/s&lt;/td&gt;
&lt;td&gt;~930 GB/s each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Power&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;600W (300W Max-Q)&lt;/td&gt;
&lt;td&gt;575W&lt;/td&gt;
&lt;td&gt;~1,050W combined&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The catch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3× the price of a 5090&lt;/td&gt;
&lt;td&gt;32GB caps you at ~32B&lt;/td&gt;
&lt;td&gt;PCIe overhead, 3 slots, heat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: If you genuinely need a single 70B+ model resident 24/7 in one quiet slot — for an agentic coding rig, a shared family server, or fine-tuning — the PRO 6000 is the cleanest answer that exists short of an H100. For everything else, the same money buys more usable VRAM as multiple consumer cards.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What you're actually buying with 96GB
&lt;/h2&gt;

&lt;p&gt;The RTX PRO 6000 Blackwell Workstation Edition is built on the same GB202 Blackwell die as the RTX 5090, but NVIDIA enables a fuller configuration: 24,064 CUDA cores versus the 5090's 21,760, paired with 96GB of GDDR7 ECC memory on a 512-bit bus. Memory bandwidth lands at 1.79 TB/s — identical to the RTX 5090. It uses 5th-generation Tensor Cores with native FP4 support and runs on PCIe 5.0 x16.&lt;/p&gt;

&lt;p&gt;That bandwidth parity is the single most important fact in this entire article, and most buyers miss it. Token generation in LLM inference is a memory-bandwidth problem: the GPU streams every weight out of VRAM to produce each token. Two cards with the same bandwidth produce roughly the same tokens-per-second on a model that fits in both. The PRO 6000 does &lt;strong&gt;not&lt;/strong&gt; make a 14B model faster than a 5090. What it does is let you load models the 5090 physically cannot hold.&lt;/p&gt;

&lt;p&gt;The standard Workstation Edition draws up to 600W. There's also a &lt;strong&gt;Max-Q variant&lt;/strong&gt; with identical 96GB / 1.79 TB/s specs capped at 300W with a blower-style cooler — meaningfully relevant for home labs where two-slot blower cards and a 300W ceiling make a multi-card or rack build far more thermally sane. You give up some peak throughput for half the power envelope.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benchmarks that justify it (and the ones that don't)
&lt;/h2&gt;

&lt;p&gt;Here's where the 96GB earns its keep. On &lt;a href="https://dev.to/blog/gpt-oss-20b-local-ai-hardware-guide-2026/"&gt;gpt-oss 120B&lt;/a&gt;, the PRO 6000 hits &lt;strong&gt;193.30 tok/s&lt;/strong&gt; on token generation (tg128) at Q8_0 in llama.cpp, peaking above 200 tok/s with full GPU offload and GQA optimization. The Q4_K_M weights for that 120B model occupy roughly &lt;strong&gt;59.4 GB&lt;/strong&gt; of VRAM — leaving over 30GB free for a long context window. At 12k context, generation runs around 134 tok/s, tapering to about 48 tok/s near the model's maximum context. That entire workload is impossible on a 32GB card without offloading to system RAM, which would crater throughput.&lt;/p&gt;

&lt;p&gt;For batched serving — the real workstation use case — the gap widens. On Llama 3.3 70B (AWQ INT4), a single PRO 6000 delivered &lt;strong&gt;8,425 tok/s&lt;/strong&gt; aggregate throughput versus 4,570 tok/s on a single RTX 5090, a 1.8× lead, because the extra capacity lets it run far larger batches. On a 30B AWQ model, a single PRO 6000 pushed roughly 8,400 tok/s — nearly matching a 4× RTX 4090 rig at 8,900 tok/s, in one slot.&lt;/p&gt;

&lt;p&gt;Now the unflattering number. For &lt;strong&gt;single-stream&lt;/strong&gt; inference of a model that fits on both cards, the PRO 6000's advantage largely evaporates. On Llama 3.3 70B Q4_K_M under vLLM, a single PRO 6000 streams roughly 30–45 tok/s for one request — fine, but not a multiple of what a 5090 manages on models it can hold. If your workload is one user, one prompt at a time, on models ≤32GB, you are paying $5,500 extra over a 5090 for VRAM you won't touch.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;RTX PRO 6000&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss 120B Q8_0, tg128&lt;/td&gt;
&lt;td&gt;193 tok/s&lt;/td&gt;
&lt;td&gt;Flagship MoE runs on one card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss 120B @ 12k ctx&lt;/td&gt;
&lt;td&gt;~134 tok/s&lt;/td&gt;
&lt;td&gt;Long context stays fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama 3.3 70B AWQ, batched&lt;/td&gt;
&lt;td&gt;8,425 tok/s&lt;/td&gt;
&lt;td&gt;1.8× a single 5090&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama 3.3 70B Q4, single stream&lt;/td&gt;
&lt;td&gt;30–45 tok/s&lt;/td&gt;
&lt;td&gt;5090-class for one user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30B AWQ, batched&lt;/td&gt;
&lt;td&gt;~8,400 tok/s&lt;/td&gt;
&lt;td&gt;Matches 4× RTX 4090&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Price reality in June 2026
&lt;/h2&gt;

&lt;p&gt;NVIDIA launched the PRO 6000 Blackwell with an ~$8,565 MSRP in early 2025. As of June 2026, street pricing has stabilized into the &lt;strong&gt;$8,000–$9,400&lt;/strong&gt; band, with wide retailer spread: Newegg around $9,349, Amazon around $9,449, and B&amp;amp;H as high as $11,500, while Micro Center has listed it near $10,000 with a $1,000 instant discount. VideoCardz reported the desktop card dipping to $7,999 at one point — still the floor, not the norm. If renting beats buying for your duty cycle, the card is available on cloud providers like Spheron from around $0.90/hr; do the math on a &lt;a href="https://dev.to/blog/runpod-vs-local-gpu-rent-or-buy/"&gt;rent-vs-buy basis&lt;/a&gt; before committing $8,500 of capital, and remember you can spin up a comparable card on &lt;a href="https://runpod.io?ref=cjrwwd27" rel="noopener noreferrer"&gt;RunPod&lt;/a&gt; for short fine-tuning bursts instead of owning one.&lt;/p&gt;

&lt;p&gt;For context, the &lt;a href="https://www.amazon.com/s?k=RTX+5090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 5090&lt;/a&gt; sits at roughly $2,900 (ASUS TUF) to $4,329 (Amazon) depending on model and the ongoing GDDR7-driven price pressure. A used &lt;a href="https://www.amazon.com/s?k=RTX+3090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 3090&lt;/a&gt; runs $600–$800 on eBay. That spread frames the entire decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the PRO 6000 actually wins over multi-GPU
&lt;/h2&gt;

&lt;p&gt;The honest competitor isn't the H100 — it's three used 3090s. Three &lt;a href="https://www.amazon.com/s?k=RTX+3090+24GB&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 3090s&lt;/a&gt; give you 72GB of pooled VRAM for about $2,100–$2,400, roughly a quarter of the PRO 6000's price. With a framework that shards models across cards, that rig runs the same 70B-class models. So why pay 3.5× more?&lt;/p&gt;

&lt;p&gt;Four reasons, and you need at least one to be real for you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single-slot capacity.&lt;/strong&gt; 96GB contiguous in one card means no tensor-parallel PCIe overhead, no NUMA tuning, no per-layer split. A 120B MoE loads as one device. Multi-GPU always pays a coordination tax that grows with model size and context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power and noise.&lt;/strong&gt; The Max-Q variant pulls 300W. Three 3090s pull north of 1,000W under load, dump that heat into your office, and need a 1500W PSU plus serious airflow. For a card that runs 24/7 in a home, this is not a footnote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECC memory.&lt;/strong&gt; GDDR7 with ECC matters for long fine-tuning runs where a single bit-flip silently corrupts a checkpoint. Consumer cards have no ECC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One slot, one warranty, one driver.&lt;/strong&gt; For a &lt;a href="https://dev.to/blog/llama-33-70b-cost-vs-cloud-api-2026/"&gt;shared family or team server&lt;/a&gt; you want to forget about, three used cards with no warranty is a different reliability story than one new pro card.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If none of those four matter — you have the PCIe lanes, the PSU, the cooling, and the patience — multi-GPU wins on pure dollars-per-usable-GB. That's the whole trade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it sits against the 5090 and the H100
&lt;/h2&gt;

&lt;p&gt;Against the &lt;a href="https://dev.to/blog/rtx-5090-vs-rtx-4090-local-ai/"&gt;RTX 5090&lt;/a&gt;, the PRO 6000 is the same architecture with 3× the VRAM and 10% more cores at 3× the price. The decision is binary: do your target models exceed 32GB? If yes, the 5090 can't do the job at full speed and the PRO 6000 is the consumer-adjacent answer. If no, buy the 5090 and pocket $5,500.&lt;/p&gt;

&lt;p&gt;Against a datacenter H100 (80GB HBM3, ~3.35 TB/s), the PRO 6000 has &lt;em&gt;more&lt;/em&gt; VRAM (96GB vs 80GB) but roughly half the bandwidth and no NVLink. For single-card inference of large MoE models, the extra 16GB and the far lower price make the PRO 6000 the smarter home-lab pick. The H100 pulls ahead on raw bandwidth-bound throughput and multi-GPU scaling — but you're not putting an SXM H100 in a desktop, and the PCIe H100 still costs roughly 2–3× more.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest
&lt;/h2&gt;

</description>
      <category>gpu</category>
      <category>rtxpro6000</category>
      <category>blackwell</category>
      <category>localai</category>
    </item>
    <item>
      <title>Open WebUI Can't Connect to Ollama? Every Fix for the Server Connection Error (2026)</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Sun, 05 Jul 2026 07:05:24 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/open-webui-cant-connect-to-ollama-every-fix-for-the-server-connection-error-2026-3nkh</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/open-webui-cant-connect-to-ollama-every-fix-for-the-server-connection-error-2026-3nkh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/open-webui-cannot-connect-to-ollama-fix-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: 90% of "Open WebUI can't reach Ollama" failures are one of two things: Open WebUI runs in a Docker container where &lt;code&gt;localhost&lt;/code&gt; means the container, not your machine — or Ollama is bound to &lt;code&gt;127.0.0.1&lt;/code&gt; and refuses outside connections. Fix the URL with &lt;code&gt;host.docker.internal&lt;/code&gt;, bind Ollama with &lt;code&gt;OLLAMA_HOST=0.0.0.0&lt;/code&gt;, and check the saved URL in Settings hasn't overridden your env var.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you'll be able to do after this:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diagnose whether the break is on the Open WebUI side (Docker networking) or the Ollama side (bind address) in under two minutes with one &lt;code&gt;curl&lt;/code&gt; and one &lt;code&gt;ss&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;Apply the exact fix for your setup — Docker on Linux, Docker Desktop on Mac/Windows, or &lt;code&gt;--network=host&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Stop the error from coming back after a reboot or a settings change.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: Don't start editing config files. Run &lt;code&gt;curl http://localhost:11434&lt;/code&gt; first. If it answers, the problem is how the container is &lt;em&gt;addressing&lt;/em&gt; Ollama; if it doesn't, Ollama itself isn't reachable. That one check tells you which half of this guide to read.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The two error messages, and what each one means
&lt;/h2&gt;

&lt;p&gt;Open WebUI surfaces this failure in a couple of ways. In the chat box you'll see a red &lt;strong&gt;"Open WebUI: Server Connection Error"&lt;/strong&gt; toast, or the model dropdown is simply empty with no models to pick. In the admin panel under &lt;strong&gt;Settings → Connections&lt;/strong&gt;, a "Verify Connection" click returns &lt;strong&gt;"WebUI could not connect to Ollama."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both mean the same thing: the Open WebUI backend tried to reach the Ollama API at the URL it has configured (default &lt;code&gt;http://localhost:11434&lt;/code&gt;) and got nothing back. The question is &lt;em&gt;why&lt;/em&gt;, and there are exactly three common causes. Work them in order — they're sorted from most to least likely.&lt;/p&gt;

&lt;p&gt;This guide assumes Open WebUI &lt;strong&gt;v0.9.6&lt;/strong&gt; (released June 2, 2026) and Ollama &lt;strong&gt;v0.30.x&lt;/strong&gt; (current as of June 2026). The mechanics below have been stable across the 0.x line of both projects, but the version tags matter when you're reading older forum threads — pre-0.2 Open WebUI used &lt;code&gt;OLLAMA_API_BASE_URL&lt;/code&gt;, which was renamed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0: Is Ollama even running?
&lt;/h2&gt;

&lt;p&gt;Before touching Open WebUI, confirm Ollama answers on the host where it's installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://localhost:11434
Ollama is running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you get &lt;code&gt;Ollama is running&lt;/code&gt;, the server is up and serving on the local interface. Good — skip to Cause 1, because your problem is almost certainly Docker networking.&lt;/p&gt;

&lt;p&gt;If you get &lt;code&gt;curl: (7) Failed to connect to localhost port 11434: Connection refused&lt;/code&gt;, Ollama isn't running at all (or crashed on startup). Start it (&lt;code&gt;ollama serve&lt;/code&gt;, or start the desktop app), then re-run the curl. If it &lt;em&gt;still&lt;/em&gt; refuses after the app says it's running, that's a different class of failure — see our guide on &lt;a href="https://dev.to/blog/ollama-not-using-gpu-fix-cpu-2026/"&gt;Ollama not using the GPU and falling back to CPU&lt;/a&gt; and the &lt;a href="https://dev.to/blog/ollama-llama-runner-process-terminated-fix-2026/"&gt;llama runner process terminated&lt;/a&gt; walkthrough for crash-on-load cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause 1: Docker's &lt;code&gt;localhost&lt;/code&gt; is not your &lt;code&gt;localhost&lt;/code&gt; (the #1 cause)
&lt;/h2&gt;

&lt;p&gt;This is the single most common reason, and it trips up almost everyone running the recommended Docker install.&lt;/p&gt;

&lt;p&gt;Here's the trap. You install Ollama natively on your machine, it listens on &lt;code&gt;localhost:11434&lt;/code&gt;, and &lt;code&gt;curl http://localhost:11434&lt;/code&gt; works perfectly from your terminal. Then you run Open WebUI in Docker and point it at &lt;code&gt;http://localhost:11434&lt;/code&gt; — and it fails.&lt;/p&gt;

&lt;p&gt;The reason: &lt;strong&gt;inside a Docker container, &lt;code&gt;localhost&lt;/code&gt; (and &lt;code&gt;127.0.0.1&lt;/code&gt;) refers to the container itself, not the host machine.&lt;/strong&gt; Ollama is running on the host. From the container's point of view, nothing is listening on its own &lt;code&gt;localhost:11434&lt;/code&gt;. The official troubleshooting docs state it plainly — the failure is "the WebUI docker container not being able to reach the Ollama server at 127.0.0.1:11434 (host.docker.internal:11434) inside the container."&lt;/p&gt;

&lt;p&gt;There are two clean fixes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix 1a: Use &lt;code&gt;host.docker.internal&lt;/code&gt; (recommended)
&lt;/h3&gt;

&lt;p&gt;Docker provides a special hostname, &lt;code&gt;host.docker.internal&lt;/code&gt;, that resolves to the host machine from inside a container. Point Open WebUI at that instead of &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;Docker Desktop&lt;/strong&gt; (Mac and Windows), &lt;code&gt;host.docker.internal&lt;/code&gt; works automatically. On &lt;strong&gt;Linux&lt;/strong&gt;, it does not exist by default — you have to add it with &lt;code&gt;--add-host&lt;/code&gt;. This is the line most Linux tutorials get wrong.&lt;/p&gt;

&lt;p&gt;The correct Linux command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--add-host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host.docker.internal:host-gateway &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; open-webui:/app/backend/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; open-webui &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--restart&lt;/span&gt; always &lt;span class="se"&gt;\&lt;/span&gt;
  ghcr.io/open-webui/open-webui:main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then set the Ollama URL inside Open WebUI to &lt;code&gt;http://host.docker.internal:11434&lt;/code&gt; (either via the env var below or in the admin panel — see Cause 3 for why the panel can win).&lt;/p&gt;

&lt;p&gt;You can also bake the URL into the container at launch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--add-host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host.docker.internal:host-gateway &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;OLLAMA_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://host.docker.internal:11434 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; open-webui:/app/backend/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; open-webui &lt;span class="nt"&gt;--restart&lt;/span&gt; always &lt;span class="se"&gt;\&lt;/span&gt;
  ghcr.io/open-webui/open-webui:main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After this, Open WebUI is at &lt;code&gt;http://localhost:3000&lt;/code&gt; (the &lt;code&gt;3000:8080&lt;/code&gt; mapping sends host port 3000 to the container's internal port 8080).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;OLLAMA_BASE_URL&lt;/code&gt; is the environment variable Open WebUI reads to decide where to forward Ollama API calls. Note it's &lt;code&gt;OLLAMA_BASE_URL&lt;/code&gt; in current versions — older guides referencing &lt;code&gt;OLLAMA_API_BASE_URL&lt;/code&gt; are pre-0.2 and will silently do nothing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix 1b: Use &lt;code&gt;--network=host&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The blunter option is to share the host's network stack directly, so &lt;code&gt;localhost&lt;/code&gt; inside the container points where you'd expect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--network&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; open-webui:/app/backend/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;OLLAMA_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:11434 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; open-webui &lt;span class="nt"&gt;--restart&lt;/span&gt; always &lt;span class="se"&gt;\&lt;/span&gt;
  ghcr.io/open-webui/open-webui:main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Watch the port change.&lt;/strong&gt; With &lt;code&gt;--network=host&lt;/code&gt;, the &lt;code&gt;-p 3000:8080&lt;/code&gt; mapping is ignored — the container binds the host's port 8080 directly. So Open WebUI is now at &lt;strong&gt;&lt;code&gt;http://localhost:8080&lt;/code&gt;, not 3000.&lt;/strong&gt; People apply this fix, see the old URL stop working, and assume it failed. It didn't; the address moved.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--network=host&lt;/code&gt; is the less-preferred fix because it throws away Docker's network isolation. Use &lt;code&gt;host.docker.internal&lt;/code&gt; unless you have a specific reason not to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause 2: Ollama is bound to 127.0.0.1 and rejecting the container
&lt;/h2&gt;

&lt;p&gt;If &lt;code&gt;curl http://localhost:11434&lt;/code&gt; works &lt;em&gt;on the host&lt;/em&gt; but Open WebUI still can't connect even after fixing the address, the problem flips to the Ollama side. By default Ollama binds only to the loopback interface &lt;code&gt;127.0.0.1&lt;/code&gt;, which accepts connections from the same machine but not from the Docker bridge network the container lives on.&lt;/p&gt;

&lt;p&gt;Confirm what it's actually bound to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;11434
LISTEN 0  4096  127.0.0.1:11434  0.0.0.0:&lt;span class="k"&gt;*&lt;/span&gt;  &lt;span class="nb"&gt;users&lt;/span&gt;:&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;"ollama"&lt;/span&gt;,pid&lt;span class="o"&gt;=&lt;/span&gt;1234,fd&lt;span class="o"&gt;=&lt;/span&gt;3&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;127.0.0.1:11434&lt;/code&gt; = local only. You want to see &lt;code&gt;0.0.0.0:11434&lt;/code&gt; (all IPv4 interfaces) or &lt;code&gt;*:11434&lt;/code&gt;. The fix is to set &lt;code&gt;OLLAMA_HOST=0.0.0.0&lt;/code&gt;, and &lt;em&gt;how&lt;/em&gt; you set it depends on the platform — this is where most people go wrong, because Ollama reads its environment &lt;strong&gt;once at startup&lt;/strong&gt; and a variable exported in your shell often isn't the environment the service actually runs under.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux (systemd)
&lt;/h3&gt;

&lt;p&gt;If Ollama was installed via the official script, it runs as a systemd service — and &lt;strong&gt;your shell's &lt;code&gt;export OLLAMA_HOST=0.0.0.0&lt;/code&gt; does nothing&lt;/strong&gt;, because systemd uses its own environment, not your terminal's. You have to edit the unit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl edit ollama.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add, under the &lt;code&gt;[Service]&lt;/code&gt; section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"OLLAMA_HOST=0.0.0.0"&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"OLLAMA_ORIGINS=*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then reload and restart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;OLLAMA_ORIGINS=*&lt;/code&gt; relaxes the CORS origin check, which matters when a browser-based front end on a different host/port talks to the API. Re-run the &lt;code&gt;ss&lt;/code&gt; check; you should now see &lt;code&gt;0.0.0.0:11434&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  macOS (desktop app)
&lt;/h3&gt;

&lt;p&gt;The Ollama menu-bar ap&lt;/p&gt;

</description>
      <category>ollama</category>
      <category>openwebui</category>
      <category>docker</category>
      <category>localllm</category>
    </item>
    <item>
      <title>Open-Source LLM Shootout 2026: Qwen3.6 vs Gemma 4 vs Llama 4 vs GLM-5.1 vs DeepSeek V4 — Which Fits Your GPU?</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Sun, 05 Jul 2026 07:04:43 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/open-source-llm-shootout-2026-qwen36-vs-gemma-4-vs-llama-4-vs-glm-51-vs-deepseek-v4-which-fits-56nn</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/open-source-llm-shootout-2026-qwen36-vs-gemma-4-vs-llama-4-vs-glm-51-vs-deepseek-v4-which-fits-56nn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/open-source-llm-consumer-gpu-shootout-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Of the five open-weight families everyone is benchmarking in 2026, only two — Qwen3.6 and Gemma 4 — actually run well on a single consumer GPU. Llama 4 Maverick, GLM-5.1, and DeepSeek V4 Pro are server-class MoEs that need 200 GB+ of VRAM at usable quantization. The headline "five-way shootout" collapses to a two-horse race on the hardware most home labs own, with DeepSeek V4 Flash and Llama 4 Scout sitting in an awkward middle.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Qwen3.6 35B-A3B&lt;/th&gt;
&lt;th&gt;Gemma 4 (12B–31B)&lt;/th&gt;
&lt;th&gt;Llama 4 Scout 109B&lt;/th&gt;
&lt;th&gt;DeepSeek V4 Flash 284B&lt;/th&gt;
&lt;th&gt;GLM-5.1 754B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Single RTX 3090, speed&lt;/td&gt;
&lt;td&gt;Quality per GB, 8–24 GB&lt;/td&gt;
&lt;td&gt;Gray-zone, 24 GB at 1.78-bit&lt;/td&gt;
&lt;td&gt;2× RTX 4090 minimum&lt;/td&gt;
&lt;td&gt;Server / API only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Min usable VRAM&lt;/td&gt;
&lt;td&gt;~23 GB (Q3)&lt;/td&gt;
&lt;td&gt;6.6 GB (12B Q4) → 24 GB (31B Q4)&lt;/td&gt;
&lt;td&gt;~24 GB (1.78-bit, degraded)&lt;/td&gt;
&lt;td&gt;~33 GB (heavy quant)&lt;/td&gt;
&lt;td&gt;~860 GB (FP8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 3090 speed&lt;/td&gt;
&lt;td&gt;~120 tok/s&lt;/td&gt;
&lt;td&gt;30–119 tok/s&lt;/td&gt;
&lt;td&gt;~20 tok/s&lt;/td&gt;
&lt;td&gt;Not viable&lt;/td&gt;
&lt;td&gt;Not viable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Gemma custom&lt;/td&gt;
&lt;td&gt;Llama 4 Community&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: If you have one 24 GB GPU, run Qwen3.6 35B-A3B for speed or Gemma 4 31B for reasoning depth — pick by license and task, not by leaderboard rank. The 1T-class models (GLM-5.1, DeepSeek V4 Pro, Llama 4 Maverick) are API models you should use as APIs, not local builds.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The five families, and what they actually are
&lt;/h2&gt;

&lt;p&gt;Every "open-source LLM comparison" article in mid-2026 lists the same five names. The problem is that they treat a 12B dense model and a 1.6T MoE as if they belong in the same buying decision. They don't. Here is what each family ships, and the size of the gap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qwen3.6 (Alibaba).&lt;/strong&gt; The Qwen3.6-35B-A3B dropped April 16, 2026 — a 35B-total MoE that activates just 3B parameters per token. There are also dense 8B and 14B members carried over from the Qwen3 line. Everything is Apache 2.0, which matters more than people admit. Qwen optimized this family explicitly for consumer hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 (Google).&lt;/strong&gt; A dense-and-MoE family spanning E2B up to a 31B dense flagship, plus a 26B-A4B MoE. Google's June 5 QAT (quantization-aware training) checkpoints cut VRAM roughly 72% versus BF16 with near-original quality, which is why a 26B now fits 16 GB. License is Google's custom Gemma terms — permissive for most use, but not OSI-approved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Llama 4 (Meta).&lt;/strong&gt; Scout is 109B total / 17B active; Maverick is 402B total / 17B active. Both are MoE, and both load &lt;em&gt;all&lt;/em&gt; parameters into memory regardless of how few activate per token — which is the trap. The Llama 4 Community License carries a 700M-MAU clause, a "Built with Llama" attribution requirement, and a ban on multimodal use by entities domiciled in the EU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DeepSeek V4.&lt;/strong&gt; Two checkpoints: V4 Flash (284B total / 13B active) and V4 Pro (1.6T total / ~49B active), released April 2026 under MIT. Flash is the only one with any home-lab pathway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GLM-5.1 (Z.ai).&lt;/strong&gt; A 754B open-weight MoE under MIT, released April 7, 2026. It matches frontier closed models on coding benchmarks — and needs roughly 860 GB of VRAM at FP8, i.e. 8× H200. It is on this list because it is excellent, not because you can run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which family fits which GPU
&lt;/h2&gt;

&lt;p&gt;This is the only question that matters for a home lab. Here is the decision by the VRAM you actually have.&lt;/p&gt;

&lt;h3&gt;
  
  
  8 GB (RTX 3060, RTX 4060, RTX 5060)
&lt;/h3&gt;

&lt;p&gt;Your only real options are small dense models. Gemma 4 12B at Q4 needs about 6.6 GB of weights — it fits, but with little headroom for context, so keep &lt;code&gt;num_ctx&lt;/code&gt; modest. A Qwen3 8B at Q4 sits around 5 GB and leaves more room. Llama 4, GLM-5.1, and DeepSeek V4 are all out at this tier — not "slow," but flatly impossible without spilling to system RAM and crawling.&lt;/p&gt;

&lt;h3&gt;
  
  
  16 GB (RTX 4060 Ti 16GB, RTX 5060 Ti 16GB, RTX 5070 Ti)
&lt;/h3&gt;

&lt;p&gt;This is where Gemma 4's MoE shines. The 26B-A4B at Q4_K_M lands right at 16 GB and, because only ~4B parameters activate per token, it generates fast — 64–119 tok/s on a 24 GB RTX 3090, and comfortably usable on a 16 GB card if you trim context. Qwen3 14B dense also fits here. Qwen3.6 30B/35B-A3B at Q4 wants ~17 GB, so it's right on the edge — doable at low context, more comfortable at 24 GB.&lt;/p&gt;

&lt;h3&gt;
  
  
  24 GB (RTX 3090, RTX 4090)
&lt;/h3&gt;

&lt;p&gt;The sweet spot, and where the shootout gets interesting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3.6 35B-A3B&lt;/strong&gt;: with Unsloth's Q3 quant it takes ~23 GB and runs at ~120 tok/s on a &lt;a href="https://www.amazon.com/s?k=RTX+3090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 3090&lt;/a&gt;. This is the fastest &lt;em&gt;capable&lt;/em&gt; model you can run on one consumer card.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4 31B dense&lt;/strong&gt; at Q4_K_M fills 24 GB and runs ~30–34 tok/s on the 3090 — slower, but a dense 31B scoring 87.1% MMLU is a different quality tier than a 3B-active MoE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4 26B-A4B&lt;/strong&gt; at Q8 also fits 24 GB if you want quality with speed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Llama 4 Scout&lt;/strong&gt; technically fits via Unsloth's 1.78-bit dynamic quant at ~20 tok/s — but a 1.78-bit 109B model is a curiosity, not a daily driver. The quality you lose at that bit depth erases the point of running Scout over Qwen3.6.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On a &lt;a href="https://www.amazon.com/s?k=RTX+4090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 4090&lt;/a&gt;, the same models run faster on the small end — Qwen3 8B Q4 hits ~104 tok/s, 14B ~69 tok/s — but the 24 GB ceiling is identical to the 3090, so it changes speed, not which models fit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beyond 24 GB (multi-GPU / server)
&lt;/h3&gt;

&lt;p&gt;DeepSeek V4 Flash needs ~33 GB heavily quantized — realistically 2× RTX 4090 or a single RTX 6000-class card. Llama 4 Maverick at INT4 wants ~200 GB (4× H100). GLM-5.1 and DeepSeek V4 Pro are 8-GPU server territory. If you're renting rather than buying for these, a cloud GPU like &lt;a href="https://runpod.io?ref=cjrwwd27" rel="noopener noreferrer"&gt;RunPod&lt;/a&gt; is far cheaper than assembling an 8× H200 box you'll use occasionally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed vs. quality: the real trade-off at 24 GB
&lt;/h2&gt;

&lt;p&gt;The MoE-vs-dense split is the whole story on a single 24 GB card. Qwen3.6 35B-A3B activates 3B parameters per token, so it &lt;em&gt;feels&lt;/em&gt; like running a 3B model — ~120 tok/s — while having the knowledge of a 35B. Gemma 4 31B is dense: every one of its 31B parameters fires on every token, so you get ~30 tok/s but denser reasoning per token. Neither is "better"; they're different shapes.&lt;/p&gt;

&lt;p&gt;For interactive chat and agentic loops where latency compounds, Qwen3.6's 120 tok/s wins. For one-shot reasoning, summarization, or code review where you read the output once, Gemma 4 31B's depth is worth the slower stream. We go deeper on the two-model decision in our &lt;a href="https://dev.to/blog/qwen36-35b-a3b-local-ai-guide-2026/"&gt;Qwen3.6 35B-A3B guide&lt;/a&gt; and the &lt;a href="https://dev.to/blog/gemma-4-qat-local-ai-hardware-update-2026/"&gt;Gemma 4 QAT update&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licenses: the column most comparisons skip
&lt;/h2&gt;

&lt;p&gt;For a home lab tinkering on a side project, license rarely bites. For anyone building a product, it's decisive.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Family&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;th&gt;Commercial use&lt;/th&gt;
&lt;th&gt;Catch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.6&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Yes, unrestricted&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Yes, unrestricted&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM-5.1&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Yes, unrestricted&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4&lt;/td&gt;
&lt;td&gt;Gemma custom&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Use restrictions, not OSI-approved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama 4&lt;/td&gt;
&lt;td&gt;Community&lt;/td&gt;
&lt;td&gt;Yes, with limits&lt;/td&gt;
&lt;td&gt;700M-MAU clause, "Built with Llama" badge, EU multimodal ban&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The irony of the 2026 landscape: the two model families you can actually run locally (Qwen3.6 and Gemma 4) sit at opposite license ends — Qwen3.6 is the cleanest (Apache 2.0), Gemma 4 the most encumbered of the two. If license cleanliness matters to you and you want speed, Qwen3.6 is the unambiguous pick.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gotcha that wastes an afternoon
&lt;/h2&gt;

&lt;p&gt;The most common failure we see: someone reads "Llama 4 Scout is only 17B active" and runs &lt;code&gt;ollama pull&lt;/code&gt; expecting a 17B-class memory footprint. Then they hit &lt;code&gt;CUDA error: out of memory&lt;/code&gt; on a 24 GB card. MoE models must hold &lt;em&gt;all&lt;/em&gt; 109B parameters in VRAM even though 17B activate per token — the "active" number describes compute, not memory. The fix isn't a smaller context; it's accepting that Scout needs either a sub-2-bit dynamic quant (degraded) or more than one GPU. If you hit OOM mid-load on any of these MoEs, check total parameter count, not active count, against your VRAM. (Our full [CUDA OOM fixes](/blog/cuda-out-of-memory&lt;/p&gt;

</description>
      <category>localllm</category>
      <category>qwen3</category>
      <category>gemma</category>
      <category>llama4</category>
    </item>
    <item>
      <title>Ollama v0.30 on Apple Silicon: What the Stable MLX Release Actually Changed From the Preview</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Sun, 05 Jul 2026 07:04:01 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/ollama-v030-on-apple-silicon-what-the-stable-mlx-release-actually-changed-from-the-preview-25h7</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/ollama-v030-on-apple-silicon-what-the-stable-mlx-release-actually-changed-from-the-preview-25h7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/ollama-v030-mlx-stable-upgrade-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Ollama v0.30 (May 13, 2026) promoted the MLX engine from a spring preview to the default Apple Silicon inference path, and the point releases through June added the parts that actually matter day-to-day: Gemma 4 QAT weights, Gemma 4 MTP speculative decoding (&amp;gt;2× on Macs), and better KV-cache reuse so repeated prompts skip re-prefill. If you're on the May preview build, upgrading to v0.30.10 is a free speed bump on an idle afternoon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you'll be able to do after this guide:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upgrade to Ollama v0.30.10 and confirm the MLX engine is actually running, not the old llama.cpp Metal fallback&lt;/li&gt;
&lt;li&gt;Pull the Gemma 4 QAT tags that fit your Mac's memory (1GB to 18GB) and run them at near-original quality&lt;/li&gt;
&lt;li&gt;Verify KV-cache reuse and MTP speculative decoding are active using &lt;code&gt;ollama ps&lt;/code&gt; and real timing&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: This isn't a new engine — it's the MLX preview we &lt;a href="https://dev.to/blog/ollama-mlx-apple-silicon-2026/"&gt;covered on June 2&lt;/a&gt; finally stabilized and fed. The headline tok/s numbers haven't moved much since spring, but Gemma 4 QAT plus speculative decoding plus cache reuse together make a 32GB Mac feel meaningfully snappier on real multi-turn work. Upgrade, pull a &lt;code&gt;-it-qat&lt;/code&gt; tag, and move on.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What the v0.30 line actually shipped
&lt;/h2&gt;

&lt;p&gt;The MLX engine arrived in preview this spring as a swap of Ollama's Mac backend from llama.cpp's Metal path to Apple's MLX framework, which treats unified memory as the architectural primitive instead of an edge case. That preview nearly doubled decode speed — from ~58 to ~112 tok/s on an M4 Max running Qwen3.5-35B-A3B at int4 — but it was narrow: a handful of models, a hard 32GB-memory floor, and a "preview" label.&lt;/p&gt;

&lt;p&gt;Ollama &lt;strong&gt;v0.30.0, released May 13, 2026&lt;/strong&gt;, changed the framing. The release notes describe it as "improved compatibility and performance using llama.cpp" that &lt;strong&gt;augments&lt;/strong&gt; the MLX engine on Apple Silicon, bringing support to a wider range of hardware. In plain terms: MLX is now the default fast path on capable Macs, and the llama.cpp side got broader GGUF support (Hugging Face models and your own fine-tunes) plus faster NVIDIA performance for everyone else.&lt;/p&gt;

&lt;p&gt;The interesting work happened in the point releases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;What it added&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v0.30.0&lt;/td&gt;
&lt;td&gt;May 13, 2026&lt;/td&gt;
&lt;td&gt;MLX default on Apple Silicon; broader GGUF + Hugging Face model support; faster NVIDIA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v0.30.5&lt;/td&gt;
&lt;td&gt;early June 2026&lt;/td&gt;
&lt;td&gt;Fixed &lt;code&gt;gemma4:12b&lt;/code&gt; floating-point exception crash; &lt;strong&gt;Gemma 4 MTP speculative decoding on Macs (&amp;gt;2× speedup)&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v0.30.8&lt;/td&gt;
&lt;td&gt;June 12, 2026&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Improved prompt caching for better KV-cache reuse&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v0.30.9&lt;/td&gt;
&lt;td&gt;mid June 2026&lt;/td&gt;
&lt;td&gt;Cohere2Moe architecture support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v0.30.10&lt;/td&gt;
&lt;td&gt;June 17, 2026&lt;/td&gt;
&lt;td&gt;Command A and North family models on Apple Silicon MLX; llama.cpp updated to build 9672&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you installed the spring preview and never touched it, you're missing all four of those. None is a marketing bullet — they're the difference between "MLX is fast in a benchmark" and "MLX is fast on the thing I actually do."&lt;/p&gt;

&lt;h2&gt;
  
  
  Upgrade and verify it's really MLX
&lt;/h2&gt;

&lt;p&gt;Upgrading is the easy part. On macOS, re-run the installer or use Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;brew upgrade ollama
&lt;span class="nv"&gt;$ &lt;/span&gt;ollama &lt;span class="nt"&gt;--version&lt;/span&gt;
ollama version is 0.30.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The part people skip — and then wonder why nothing got faster — is confirming the MLX engine is the one doing the work. The MLX path activates on Macs with &lt;strong&gt;32GB or more of unified memory&lt;/strong&gt;. Below that, Ollama silently falls back to llama.cpp Metal with no error and no speed change. That silent fallback is the single most common "I upgraded and saw nothing" complaint, and it's not a bug — it's the documented memory floor.&lt;/p&gt;

&lt;p&gt;To check which engine is live, load a model and read &lt;code&gt;ollama ps&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ollama run gemma4:26b-it-qat &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;ollama ps
NAME                 ID              SIZE     PROCESSOR    UNTIL
gemma4:26b-it-qat    a1b2c3d4e5f6    16 GB    100% GPU     4 minutes from now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;100% GPU&lt;/code&gt; means the model is fully on the GPU via the unified-memory path. If you see any &lt;code&gt;CPU&lt;/code&gt; percentage on a model that should fit, you're either below the memory floor or the model spilled — close other apps and reload. The &lt;code&gt;SIZE&lt;/code&gt; column also sanity-checks your quant: a 26B QAT model should report ~16GB, not ~30GB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemma 4 QAT: the upgrade that changes which Mac is enough
&lt;/h2&gt;

&lt;p&gt;The most useful thing v0.30 unlocked isn't raw speed — it's Google's Gemma 4 &lt;strong&gt;quantization-aware training (QAT)&lt;/strong&gt; checkpoints, released June 5, 2026, now available as first-party Ollama tags. QAT simulates quantization &lt;em&gt;during&lt;/em&gt; training instead of bolting it on afterward, which cuts memory roughly &lt;strong&gt;72%&lt;/strong&gt; versus BF16 while keeping near-original quality. We covered the full QAT memory map in the &lt;a href="https://dev.to/blog/gemma-4-qat-local-ai-hardware-update-2026/"&gt;Gemma 4 QAT hardware update&lt;/a&gt;; here's the short version of what to pull:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ollama pull gemma4:e4b-it-qat    &lt;span class="c"&gt;# ~5 GB  — fits a 16GB MacBook Air&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;ollama pull gemma4:12b-it-qat    &lt;span class="c"&gt;# ~7 GB  — fits 16GB comfortably&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;ollama pull gemma4:26b-it-qat    &lt;span class="c"&gt;# ~15 GB — fits a 16GB Mac/GPU, barely&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;ollama pull gemma4:31b-it-qat    &lt;span class="c"&gt;# ~18 GB — needs 24GB+&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gemma 4 QAT tag&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;What it fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:e2b-it-qat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~1 GB&lt;/td&gt;
&lt;td&gt;A phone, or any Mac&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:e4b-it-qat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~5 GB&lt;/td&gt;
&lt;td&gt;8–16GB MacBook Air&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:12b-it-qat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~7 GB&lt;/td&gt;
&lt;td&gt;16GB Mac / 8GB+ GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:26b-it-qat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~15 GB&lt;/td&gt;
&lt;td&gt;16GB Mac/GPU (tight)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:31b-it-qat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~18 GB&lt;/td&gt;
&lt;td&gt;24GB Mac/GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The reason this matters: the 26B-A4B model now fits in ~15GB, which means a 16GB Mac that previously couldn't touch a 26B-class model runs one at near-full quality. &lt;strong&gt;Critical caveat carried over from the QAT release&lt;/strong&gt;: don't hand-convert the Hugging Face QAT BF16 weights to &lt;code&gt;Q4_0&lt;/code&gt; yourself — the F16-vs-BF16 scale mismatch reintroduces the exact accuracy loss QAT was meant to avoid. Use the official Ollama &lt;code&gt;-it-qat&lt;/code&gt; tags above, which are already converted correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speculative decoding and cache reuse: where v0.30 feels faster
&lt;/h2&gt;

&lt;p&gt;Two changes in the point releases don't show up as a bigger headline tok/s number but change the lived experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 MTP speculative decoding&lt;/strong&gt; (v0.30.5) uses multi-token-prediction draft heads to propose several tokens at once and verify them in a single pass — lossless output, but Ollama reports &lt;strong&gt;over a 2× speedup&lt;/strong&gt; on Macs for Gemma 4. This is the same family of technique we broke down in &lt;a href="https://dev.to/blog/why-local-llms-got-good-mid-2026-speculative-decoding-moe/"&gt;why local LLMs got good in 2026&lt;/a&gt;: it doesn't raise the memory-bandwidth ceiling, it just wastes fewer trips to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KV-cache reuse&lt;/strong&gt; (v0.30.8) is the quieter win. Before, sending a follow-up message in a long chat re-processed the entire prompt history (the prefill step) every turn. With improved prompt caching, an unchanged prefix is reused, so on a multi-turn conversation the second and later turns skip straight to generation. The bigger your system prompt and the longer your chat, the more time-to-first-token you save — on a long coding session with a 4K-token system prompt, that's the difference between a visible pause and an instant reply on every turn.&lt;/p&gt;

&lt;p&gt;You won't see a flag for this. The way to confirm it's helping is crude but honest: time two identical follow-up prompts in the same session. The second should start streaming noticeably sooner because the shared prefix is already cached.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real numbers, and the ceiling that didn't move
&lt;/h2&gt;

&lt;p&gt;Here's what to actually expect, because "2× faster" is only true in specific places:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mac / model&lt;/th&gt;
&lt;th&gt;Backend&lt;/th&gt;
&lt;th&gt;Decode&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;M4 Max, Qwen3.5-35B-A3B int4&lt;/td&gt;
&lt;td&gt;MLX&lt;/td&gt;
&lt;td&gt;~112 tok/s&lt;/td&gt;
&lt;td&gt;vs ~58 tok/s on the old Metal path (~93% gain)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M4 Max, optimized 7B&lt;/td&gt;
&lt;td&gt;MLX&lt;/td&gt;
&lt;td&gt;~230 tok/s&lt;/td&gt;
&lt;td&gt;small models show MLX's biggest lead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M3 Ultra, Gemma 4 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;MLX&lt;/td&gt;
&lt;td&gt;~30–42 tok/s&lt;/td&gt;
&lt;td&gt;prefill ~700–900 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M3 Ultra, Qwen3.6 30B-A3B&lt;/td&gt;
&lt;td&gt;MLX&lt;/td&gt;
&lt;td&gt;&amp;gt;80 tok/s&lt;/td&gt;
&lt;td&gt;MoE sparsity (3B active) is why it's 2× the dense 27B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern worth internalizing: MLX leads llama.cpp by **roughly 10–25% on most models, and up to 21–87% o&lt;/p&gt;

</description>
      <category>ollama</category>
      <category>applesilicon</category>
      <category>mlx</category>
      <category>localai</category>
    </item>
    <item>
      <title>Ollama Not Using GPU? Fix CPU-Only Inference on Windows, WSL2, and Linux (2026)</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Sat, 04 Jul 2026 07:05:50 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/ollama-not-using-gpu-fix-cpu-only-inference-on-windows-wsl2-and-linux-2026-23jg</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/ollama-not-using-gpu-fix-cpu-only-inference-on-windows-wsl2-and-linux-2026-23jg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/ollama-not-using-gpu-fix-cpu-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: If Ollama feels slow, run &lt;code&gt;ollama ps&lt;/code&gt; — a "100% CPU" line means your GPU isn't being used at all, and a CPU/GPU split means the model is too big for your VRAM. Most cases come down to drivers, a WSL2/Docker passthrough gap, or VRAM overflow. The speed gap is real: ~42 tok/s on an RTX 3060 versus 8–14 tok/s CPU-only for Llama 3.1 8B.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you'll be able to do after this guide:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confirm in 30 seconds whether Ollama is on your GPU, your CPU, or split between both&lt;/li&gt;
&lt;li&gt;Fix the six causes that account for nearly every "Ollama won't use my GPU" report in 2026&lt;/li&gt;
&lt;li&gt;Read the Ollama server log to find the one line that tells you what actually happened&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: 80% of these reports are one of two things — you installed Ollama before the NVIDIA driver was working, or your model simply doesn't fit in VRAM and is spilling to system RAM. Check &lt;code&gt;ollama ps&lt;/code&gt; first; it tells you which camp you're in before you change a single setting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 1: Confirm the problem (don't guess)
&lt;/h2&gt;

&lt;p&gt;Before touching drivers or reinstalling anything, find out what Ollama is actually doing. Load a model and run &lt;code&gt;ollama ps&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ollama run llama3.1:8b &lt;span class="s2"&gt;"hi"&lt;/span&gt; 
&lt;span class="nv"&gt;$ &lt;/span&gt;ollama ps
NAME           ID              SIZE      PROCESSOR    UNTIL
llama3.1:8b    365c0bd3c000    6.7 GB    100% GPU     4 minutes from now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;PROCESSOR&lt;/code&gt; column is the whole diagnosis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;100% GPU&lt;/code&gt;&lt;/strong&gt; — working as intended. If it's still slow, your model/quant or context is the bottleneck, not GPU detection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;100% CPU&lt;/code&gt;&lt;/strong&gt; — Ollama isn't seeing your GPU at all. This is a driver, passthrough, or unsupported-card problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;58% / 42% CPU/GPU&lt;/code&gt;&lt;/strong&gt; (a split) — Ollama found the GPU but the model doesn't fully fit in VRAM, so layers spilled to system RAM. The GPU is fine; you're out of VRAM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cross-check with the GPU itself while a prompt is generating:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;nvidia-smi&lt;/code&gt; prints a table and you see a &lt;code&gt;python&lt;/code&gt;/&lt;code&gt;ollama&lt;/code&gt; process using VRAM during generation, the GPU is being used. If &lt;code&gt;nvidia-smi&lt;/code&gt; returns &lt;code&gt;command not found&lt;/code&gt; or &lt;code&gt;NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver&lt;/code&gt;, your driver is the problem — jump to Cause 1.&lt;/p&gt;

&lt;p&gt;Here's the diagnostic flow in one table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;code&gt;ollama ps&lt;/code&gt; shows&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;nvidia-smi&lt;/code&gt; shows&lt;/th&gt;
&lt;th&gt;What's wrong&lt;/th&gt;
&lt;th&gt;Go to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100% CPU&lt;/td&gt;
&lt;td&gt;driver error / not found&lt;/td&gt;
&lt;td&gt;Driver missing or broken&lt;/td&gt;
&lt;td&gt;Cause 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100% CPU&lt;/td&gt;
&lt;td&gt;works fine on host, fails in WSL/Docker&lt;/td&gt;
&lt;td&gt;Passthrough not configured&lt;/td&gt;
&lt;td&gt;Cause 2 / 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100% CPU&lt;/td&gt;
&lt;td&gt;works, GPU is old&lt;/td&gt;
&lt;td&gt;Compute capability too low&lt;/td&gt;
&lt;td&gt;Cause 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU/GPU split&lt;/td&gt;
&lt;td&gt;GPU present, VRAM full&lt;/td&gt;
&lt;td&gt;Model bigger than VRAM&lt;/td&gt;
&lt;td&gt;Cause 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100% GPU on wrong card&lt;/td&gt;
&lt;td&gt;both GPUs listed&lt;/td&gt;
&lt;td&gt;Ollama picked the wrong GPU&lt;/td&gt;
&lt;td&gt;Cause 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cause 1: Drivers missing, outdated, or installed after Ollama
&lt;/h2&gt;

&lt;p&gt;This is the single most common cause. Ollama detects GPU libraries &lt;strong&gt;at install time and at server start&lt;/strong&gt;, so the order of operations matters.&lt;/p&gt;

&lt;p&gt;The version floor in 2026: Ollama supports NVIDIA GPUs with &lt;strong&gt;compute capability 5.0+&lt;/strong&gt; and &lt;strong&gt;driver 531 or newer&lt;/strong&gt;. Older Maxwell/Pascal cards (compute capability 5.0–6.2, e.g. a GTX 1060) need &lt;strong&gt;driver 570 or newer&lt;/strong&gt;. If your driver is below that, Ollama silently falls back to CPU.&lt;/p&gt;

&lt;p&gt;Check your driver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;nvidia-smi &lt;span class="nt"&gt;--query-gpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;driver_version &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;csv,noheader
576.52
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then fix in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install/update the NVIDIA driver first.&lt;/strong&gt; On Windows, grab the latest Game Ready or Studio driver. On Linux, install the proprietary driver (e.g. &lt;code&gt;sudo ubuntu-drivers install&lt;/code&gt; on Ubuntu) and reboot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify &lt;code&gt;nvidia-smi&lt;/code&gt; works&lt;/strong&gt; before going further.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reinstall Ollama after the driver is healthy.&lt;/strong&gt; If you installed Ollama before the driver worked, its server never registered CUDA support. On Linux: &lt;code&gt;curl -fsSL https://ollama.com/install.sh | sh&lt;/code&gt;. On Windows, reinstall the app. Then &lt;code&gt;systemctl restart ollama&lt;/code&gt; (Linux) or restart the app.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The classic trap: people install Ollama on a fresh machine, &lt;em&gt;then&lt;/em&gt; install GPU drivers, then wonder why it's on CPU. Reinstall Ollama last.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause 2: WSL2 passthrough (the Windows + Linux gotcha)
&lt;/h2&gt;

&lt;p&gt;Running Ollama inside WSL2 on Windows is its own special case, and the fix is counterintuitive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not install a Linux NVIDIA driver inside WSL2.&lt;/strong&gt; The Windows host driver is automatically projected into WSL2 as &lt;code&gt;libcuda.so&lt;/code&gt;. Installing a Linux driver on top of that breaks the stub and sends you straight to CPU. This is the mistake that generates the most WSL2 bug reports.&lt;/p&gt;

&lt;p&gt;The working setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update the &lt;strong&gt;Windows&lt;/strong&gt; NVIDIA driver (must be 470.76 or later for CUDA-in-WSL2; in practice use a current driver). Windows 11, or Windows 10 21H2+, is required.&lt;/li&gt;
&lt;li&gt;Confirm you're on WSL2, not WSL1:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# in PowerShell&lt;/span&gt;
   wsl &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;VERSION&lt;/code&gt; column must say &lt;code&gt;2&lt;/code&gt;. WSL1 has no GPU passthrough at all.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inside WSL2, verify the stub is visible:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nv"&gt;$ &lt;/span&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that works inside WSL but Ollama still shows CPU, reinstall Ollama inside WSL &lt;em&gt;after&lt;/em&gt; confirming &lt;code&gt;nvidia-smi&lt;/code&gt; works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause 3: The model is bigger than your VRAM
&lt;/h2&gt;

&lt;p&gt;If &lt;code&gt;ollama ps&lt;/code&gt; shows a CPU/GPU split, nothing is broken — you're out of VRAM, and Ollama is doing exactly what it's designed to do: offload the layers that fit to the GPU and run the rest on CPU. That CPU portion is what tanks your tokens/sec.&lt;/p&gt;

&lt;p&gt;A rough VRAM budget: a Q4_K_M quant needs about &lt;strong&gt;0.6 GB per billion parameters&lt;/strong&gt;, plus 1–2 GB for the KV cache at modest context. So Llama 3.1 8B Q4_K_M wants ~6–7 GB, which is why it fits cleanly on an 8GB card; a 14B Q4 wants ~10 GB; a 32B Q4 wants ~20 GB and will split on anything under a 24GB card.&lt;/p&gt;

&lt;p&gt;Fixes, in order of preference:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use a smaller quant.&lt;/strong&gt; Drop from Q6_K to Q4_K_M, or pull the &lt;code&gt;:8b&lt;/code&gt; instead of &lt;code&gt;:14b&lt;/code&gt; tag. See our &lt;a href="https://dev.to/blog/local-llm-quantization-explained/"&gt;quantization explainer&lt;/a&gt; for what you actually lose (less than people think — Q4_K_M is the sweet spot).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shrink the context window.&lt;/strong&gt; A huge &lt;code&gt;num_ctx&lt;/code&gt; eats VRAM through the KV cache. If you set &lt;code&gt;OLLAMA_CONTEXT_LENGTH&lt;/code&gt; or &lt;code&gt;num_ctx&lt;/code&gt; to 32768 "just in case," that alone can force a split. Drop to 4096 or 8192.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unload other models.&lt;/strong&gt; Ollama keeps recently-used models resident. Run &lt;code&gt;ollama stop &amp;lt;model&amp;gt;&lt;/code&gt; to free VRAM, or set &lt;code&gt;OLLAMA_MAX_LOADED_MODELS=1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get more VRAM.&lt;/strong&gt; If a 32B model is your daily driver, a 24GB card is the real answer — see our &lt;a href="https://dev.to/blog/how-much-vram-llama-models/"&gt;VRAM-by-model guide&lt;/a&gt; and check whether you actually have enough &lt;a href="https://dev.to/blog/system-ram-for-local-llms-2026/"&gt;system RAM&lt;/a&gt; for the spillover, too.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The classic error here is the hard out-of-memory case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: CUDA error: out of memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix: lower the context (&lt;code&gt;num_ctx 2048&lt;/code&gt;), use a smaller quant, or stop other loaded models — then retry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause 4: Docker without GPU access
&lt;/h2&gt;

&lt;p&gt;A container does not get GPU access by default. If you run Ollama in Docker and it's on CPU, the host setup is incomplete.&lt;/p&gt;

&lt;p&gt;On the host (or inside your WSL2 distro if that's where Docker lives):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# install the toolkit, then register the runtime&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nvidia-ctk runtime configure &lt;span class="nt"&gt;--runtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then launch the container with the GPU flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--gpus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;all &lt;span class="nt"&gt;-v&lt;/span&gt; ollama:/root/.ollama &lt;span class="nt"&gt;-p&lt;/span&gt; 11434:11434 ollama/ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two things people forget: installing &lt;code&gt;nvidia-container-toolkit&lt;/code&gt; on the host, and the &lt;code&gt;--gpus=all&lt;/code&gt; flag itself. Miss either and the container quietly runs on CPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause 5: Your GPU is too old (compute capability)
&lt;/h2&gt;

&lt;p&gt;Ollama requires &lt;strong&gt;compute capability 5.0 or higher&lt;/strong&gt; — Maxwell (GTX 900 series) and newer. A Kepler-era card (GTX 700 series, compute capability 3.5) will never get GPU acceleration in current Ollama, no matter what driver you install. Datacenter Tesla K80s fall in the same bucket.&lt;/p&gt;

&lt;p&gt;Check your card's compute capability against NVIDIA's CUDA GPUs list. If it's below 5.0, your only paths are a newer GPU or cloud rental (see Cause 7's note). This is rare on home builds but common when someone tries to repurpose an ancient mining or serv&lt;/p&gt;

</description>
      <category>ollama</category>
      <category>gpu</category>
      <category>localllm</category>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Ollama Keeps Reloading the Model? Fix VRAM Unloading, Cold Starts, and Model Swapping (2026)</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Sat, 04 Jul 2026 07:05:06 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/ollama-keeps-reloading-the-model-fix-vram-unloading-cold-starts-and-model-swapping-2026-25b7</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/ollama-keeps-reloading-the-model-fix-vram-unloading-cold-starts-and-model-swapping-2026-25b7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/ollama-model-keeps-reloading-vram-fix-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Ollama unloads a model from VRAM 5 minutes after the last request by default, so the next prompt pays a cold-start penalty while weights reload from disk. The fix is one environment variable — &lt;code&gt;OLLAMA_KEEP_ALIVE&lt;/code&gt; — set on the &lt;em&gt;service&lt;/em&gt;, not your shell. If you're juggling several models, &lt;code&gt;OLLAMA_MAX_LOADED_MODELS&lt;/code&gt; decides how many stay resident at once. You almost never need more VRAM; you need the right keep-alive policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you'll be able to do after this guide:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep a model pinned in VRAM indefinitely (or for a set window) so the first token is instant&lt;/li&gt;
&lt;li&gt;Read &lt;code&gt;ollama ps&lt;/code&gt; to confirm what's actually loaded and when it'll unload&lt;/li&gt;
&lt;li&gt;Stop two models from fighting over VRAM and thrashing each other out of memory&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: 90% of "Ollama is slow on the first message" complaints are the 5-minute keep-alive timeout doing exactly what it was designed to do. Set &lt;code&gt;OLLAMA_KEEP_ALIVE&lt;/code&gt; correctly on the service and the problem disappears — no hardware change required.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What's actually happening
&lt;/h2&gt;

&lt;p&gt;By default, Ollama keeps a model loaded in memory for &lt;strong&gt;5 minutes&lt;/strong&gt; after its last request, then unloads it and frees the VRAM (&lt;a href="https://docs.ollama.com/faq" rel="noopener noreferrer"&gt;Ollama FAQ&lt;/a&gt;). That idle timeout is deliberate: it returns GPU memory to the system so other workloads (or other models) can use it.&lt;/p&gt;

&lt;p&gt;The downside shows up the moment you step away. Come back after lunch, send a prompt, and Ollama has to reload the entire model from disk before it can answer. On a 7B model that cold start is roughly &lt;strong&gt;3–10 seconds&lt;/strong&gt;; on a 70B model loading from a SATA SSD it can be &lt;strong&gt;~74 seconds&lt;/strong&gt;, versus about &lt;strong&gt;18 seconds&lt;/strong&gt; from an NVMe drive (&lt;a href="https://markaicode.com/nvme-storage-ai-model-loading/" rel="noopener noreferrer"&gt;Markaicode NVMe load-time benchmarks&lt;/a&gt;). To the user it feels like Ollama "froze." It didn't — it's doing a disk-to-VRAM reload because the model went cold.&lt;/p&gt;

&lt;p&gt;So before you blame your GPU, confirm the symptom. Open two terminals. In one, run your model. In the other, watch what's resident:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ollama ps
NAME               ID              SIZE      PROCESSOR    UNTIL
llama3.1:8b        42182419e950    6.7 GB    100% GPU     4 minutes from now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three columns matter here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PROCESSOR&lt;/strong&gt; — &lt;code&gt;100% GPU&lt;/code&gt; means the whole model is in VRAM (fast). Anything less means part of it spilled to CPU/system RAM, which tanks tokens/sec. If you're seeing CPU offload, that's a different problem — see our &lt;a href="https://dev.to/blog/ollama-not-using-gpu-fix-cpu-2026/"&gt;Ollama not using GPU fix&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SIZE&lt;/strong&gt; — how much memory this model is holding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UNTIL&lt;/strong&gt; — the countdown to unload. &lt;code&gt;4 minutes from now&lt;/code&gt; is the default 5-minute timer ticking down. This is the column that explains your cold starts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If &lt;code&gt;ollama ps&lt;/code&gt; shows nothing, the model is already unloaded and your next request will be a cold start. That's the whole bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 1: Set OLLAMA_KEEP_ALIVE on the service (the real fix)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;OLLAMA_KEEP_ALIVE&lt;/code&gt; controls how long a model stays resident after its last request. It accepts (&lt;a href="https://docs.ollama.com/faq" rel="noopener noreferrer"&gt;Ollama FAQ&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A duration string: &lt;code&gt;"10m"&lt;/code&gt;, &lt;code&gt;"24h"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A number in seconds: &lt;code&gt;3600&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Any negative value to keep it loaded forever: &lt;code&gt;-1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt; to unload immediately after each response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trap that wastes the most time: &lt;strong&gt;setting it in your shell does nothing.&lt;/strong&gt; Ollama usually runs as a background service (systemd on Linux, a launch agent on macOS, a tray app on Windows) with its own environment. Exporting &lt;code&gt;OLLAMA_KEEP_ALIVE=-1&lt;/code&gt; in &lt;code&gt;.bashrc&lt;/code&gt; is invisible to that service (&lt;a href="https://sumguy.com/ollama-memory-management/" rel="noopener noreferrer"&gt;SumGuy's Ramblings&lt;/a&gt;). You have to set it where the service can see it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux (systemd):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl edit ollama.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add, under the &lt;code&gt;[Service]&lt;/code&gt; section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"OLLAMA_KEEP_ALIVE=-1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then reload and restart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-1&lt;/code&gt; pins the model in VRAM permanently — ideal for a dedicated home AI box that only ever runs one model. If you'd rather it free memory overnight, use &lt;code&gt;"8h"&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; set it for the launch environment, then restart the Ollama app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;launchctl setenv OLLAMA_KEEP_ALIVE &lt;span class="s2"&gt;"-1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt; quit Ollama from the system tray, open &lt;em&gt;Settings → System → About → Advanced system settings → Environment Variables&lt;/em&gt;, add a user variable &lt;code&gt;OLLAMA_KEEP_ALIVE&lt;/code&gt; with value &lt;code&gt;-1&lt;/code&gt;, then relaunch Ollama.&lt;/p&gt;

&lt;p&gt;Verify it took effect — &lt;code&gt;UNTIL&lt;/code&gt; should now read &lt;code&gt;Forever&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ollama ps
NAME               ID              SIZE      PROCESSOR    UNTIL
llama3.1:8b        42182419e950    6.7 GB    100% GPU     Forever
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Fix 2: Override per request with keep_alive
&lt;/h2&gt;

&lt;p&gt;If you don't want a global policy — say a script that should load a big model, do one batch job, and release the VRAM — pass &lt;code&gt;keep_alive&lt;/code&gt; directly in the API call. The request-level parameter &lt;strong&gt;overrides&lt;/strong&gt; the &lt;code&gt;OLLAMA_KEEP_ALIVE&lt;/code&gt; environment variable for that call (&lt;a href="https://docs.ollama.com/faq" rel="noopener noreferrer"&gt;Ollama FAQ&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Keep a model loaded for this session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/api/generate &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "model": "llama3.1:8b",
  "prompt": "Summarize this changelog...",
  "keep_alive": -1
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unload immediately when the job is done (frees VRAM the instant the response finishes):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/api/generate &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "model": "llama3.1:8b",
  "keep_alive": 0
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sending a request with an &lt;strong&gt;empty prompt&lt;/strong&gt; just loads (or unloads) the model without generating — handy for preloading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 3: Preload before the user shows up
&lt;/h2&gt;

&lt;p&gt;If your real complaint is "the &lt;em&gt;first&lt;/em&gt; request of the day is slow," preload the model at boot so the cold start happens before anyone is waiting. The cleanest way is an empty generate request that pins the model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run llama3.1:8b &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or via the API in a startup script / systemd unit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/api/generate &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"model": "llama3.1:8b", "keep_alive": -1}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this from a &lt;code&gt;cron @reboot&lt;/code&gt; job or a small systemd service after &lt;code&gt;ollama.service&lt;/code&gt;, and your model is warm in VRAM before the first real prompt arrives. Combined with &lt;code&gt;OLLAMA_KEEP_ALIVE=-1&lt;/code&gt;, you get instant responses around the clock — at the cost of holding that VRAM permanently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 4: Stop two models from thrashing
&lt;/h2&gt;

&lt;p&gt;A subtler version of the same problem: you switch between, say, a coding model and a general chat model, and &lt;em&gt;every&lt;/em&gt; switch is slow. That's not the keep-alive timer — it's model swapping.&lt;/p&gt;

&lt;p&gt;Two environment variables govern this (&lt;a href="https://docs.ollama.com/faq" rel="noopener noreferrer"&gt;Ollama FAQ&lt;/a&gt;, &lt;a href="https://github.com/ollama/ollama/blob/main/envconfig/config.go" rel="noopener noreferrer"&gt;envconfig source&lt;/a&gt;):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OLLAMA_MAX_LOADED_MODELS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3 × GPU count (3 for CPU)&lt;/td&gt;
&lt;td&gt;How many distinct models can be resident at once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OLLAMA_NUM_PARALLEL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;auto (1 or 4)&lt;/td&gt;
&lt;td&gt;Concurrent requests per model; each parallel slot needs its own KV-cache VRAM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The catch is physical: on GPU inference, &lt;strong&gt;a new model must fit entirely in VRAM alongside whatever's already loaded&lt;/strong&gt;, or Ollama unloads something to make room (&lt;a href="https://docs.ollama.com/faq" rel="noopener noreferrer"&gt;Ollama FAQ&lt;/a&gt;). On a 24GB card, two 8B models (≈7 GB each) coexist comfortably and switching is instant. An 8B &lt;em&gt;plus&lt;/em&gt; a 32B model won't both fit, so Ollama evicts one on every switch — and you're back to cold starts.&lt;/p&gt;

&lt;p&gt;Practical rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plenty of VRAM, a few small models you alternate between?&lt;/strong&gt; Raise &lt;code&gt;OLLAMA_MAX_LOADED_MODELS&lt;/code&gt; and let them all stay resident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tight on VRAM?&lt;/strong&gt; Leave it at default and standardize on one model. Forcing two big models into a card that can't hold both just guarantees thrashing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the KV cache.&lt;/strong&gt; Bumping &lt;code&gt;OLLAMA_NUM_PARALLEL&lt;/code&gt; multiplies KV-cache VRAM by the context length, which can quietly push you into a &lt;a href="https://dev.to/blog/cuda-out-of-memory-local-ai-fix-2026/"&gt;CUDA out-of-memory error&lt;/a&gt;. If you raised parallelism and things got &lt;em&gt;less&lt;/em&gt; stable, lower it back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check your VRAM headroom before raising any of these. A used RTX 3090's 24GB holds one 8B model with enormous room to spare, but t&lt;/p&gt;

</description>
      <category>ollama</category>
      <category>localllm</category>
      <category>troubleshooting</category>
      <category>vram</category>
    </item>
    <item>
      <title>vLLM Won't Start? Every Fix for the Engine Init, CUDA, and OOM Errors (2026)</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Sat, 04 Jul 2026 07:02:44 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/vllm-wont-start-every-fix-for-the-engine-init-cuda-and-oom-errors-2026-3ia9</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/vllm-wont-start-every-fix-for-the-engine-init-cuda-and-oom-errors-2026-3ia9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/vllm-engine-startup-errors-fix-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Most vLLM startup failures are one of three things: the engine reserves more KV-cache memory than your card has (&lt;code&gt;No available memory for the cache blocks&lt;/code&gt;), the CUDA driver is older than the wheel was built for (&lt;code&gt;The NVIDIA driver on your system is too old&lt;/code&gt;), or a multi-GPU run hangs at NCCL init. The fixes are nearly always flags, not code: pin &lt;code&gt;--max-model-len&lt;/code&gt;, tune &lt;code&gt;--gpu-memory-utilization&lt;/code&gt;, add &lt;code&gt;--enforce-eager&lt;/code&gt;, or set a couple of NCCL env vars. Read the last line of the traceback first — it tells you which of the three you have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you'll be able to do after this:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read a vLLM startup traceback and know in one glance whether it's a KV-cache/OOM problem, a driver/CUDA problem, or a multi-GPU networking hang.&lt;/li&gt;
&lt;li&gt;Apply the exact flag or environment variable that fixes each class, with the values that actually work on 12–24 GB consumer cards.&lt;/li&gt;
&lt;li&gt;Stop guessing from &lt;code&gt;nvidia-smi&lt;/code&gt; — which lies about how much memory vLLM can actually use — and trust the startup log instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: vLLM is a server engine, not a desktop app. If you just want a model running on one consumer GPU with the least friction, Ollama or LM Studio will get you there faster. Reach for vLLM when you need throughput under concurrency — many requests at once — and you're willing to learn three flags. Once you know those flags, 90% of the "it won't start" pain disappears.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This guide assumes &lt;strong&gt;vLLM v0.23.0&lt;/strong&gt; (released June 13, 2026), which ships on &lt;strong&gt;PyTorch 2.11&lt;/strong&gt; with the default PyPI wheel now built for &lt;strong&gt;CUDA 13.0&lt;/strong&gt; and Python 3.14 added to the supported list. Older forum threads reference very different defaults, so the version tag matters when you're copying fixes from 2024–2025 posts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0: Read the actual error, not the wall of logs
&lt;/h2&gt;

&lt;p&gt;vLLM prints a lot of output on startup — model download progress, worker spawn messages, CUDA graph capture. None of that is the error. The error is the &lt;strong&gt;last Python traceback&lt;/strong&gt;, and specifically its final line. Three lines account for the overwhelming majority of "vLLM won't start" reports:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The line you see&lt;/th&gt;
&lt;th&gt;What it actually means&lt;/th&gt;
&lt;th&gt;Jump to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ValueError: No available memory for the cache blocks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;KV cache doesn't fit after weights load&lt;/td&gt;
&lt;td&gt;OOM section&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RuntimeError: The NVIDIA driver on your system is too old&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wheel built for newer CUDA than your driver&lt;/td&gt;
&lt;td&gt;Driver section&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hangs forever after &lt;code&gt;Started a worker&lt;/code&gt; / NCCL lines&lt;/td&gt;
&lt;td&gt;Multi-GPU collective setup stuck&lt;/td&gt;
&lt;td&gt;NCCL section&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you can't tell which bucket you're in, restart with debug logging on and capture the tail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;VLLM_LOGGING_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DEBUG vllm serve Qwen/Qwen2.5-7B-Instruct 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;tee &lt;/span&gt;vllm.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;DEBUG&lt;/code&gt; level is documented in vLLM's own troubleshooting guide and is the single most useful thing you can do before asking anyone for help.&lt;/p&gt;

&lt;h2&gt;
  
  
  The #1 startup error: "No available memory for the cache blocks"
&lt;/h2&gt;

&lt;p&gt;This is the error people hit first, and it's been the top vLLM startup complaint since at least issue &lt;a href="https://github.com/vllm-project/vllm/issues/2248" rel="noopener noreferrer"&gt;#2248&lt;/a&gt;. The full message reads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ValueError: No available memory for the cache blocks. Try increasing
`gpu_memory_utilization` when initializing the engine.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it happens
&lt;/h3&gt;

&lt;p&gt;vLLM loads the model weights first, then tries to carve the &lt;em&gt;remaining&lt;/em&gt; VRAM into KV-cache blocks. The KV cache is sized from &lt;code&gt;--max-model-len&lt;/code&gt; (the maximum sequence length) and the number of concurrent sequences. If the weights plus the requested context budget exceed your card, there's nothing left for blocks, and the engine refuses to start rather than crash mid-request.&lt;/p&gt;

&lt;p&gt;The trap: vLLM's &lt;strong&gt;default &lt;code&gt;--max-model-len&lt;/code&gt; is the model's full trained context&lt;/strong&gt; — often 32K or higher. A 7B model at Q4 might be ~4.5 GB of weights, but a 32K context KV cache for several parallel sequences can dwarf that. On a 12 GB card the math simply doesn't close. This is exactly the failure mode reported for 7B–13B models on the &lt;a href="https://www.amazon.com/s?k=RTX+3060+12GB&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 3060 12GB&lt;/a&gt; in issue &lt;a href="https://github.com/vllm-project/vllm/issues/27934" rel="noopener noreferrer"&gt;#27934&lt;/a&gt; — and it affects every Ampere 12 GB card, not just the 3060.&lt;/p&gt;

&lt;h3&gt;
  
  
  The fix, in the order to try it
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Pin &lt;code&gt;--max-model-len&lt;/code&gt; to what you actually need.&lt;/strong&gt; This is the highest-leverage fix and most people skip it. If your prompts are 4K, don't pay for 32K of KV cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vllm serve Qwen/Qwen2.5-7B-Instruct &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 4096 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gpu-memory-utilization&lt;/span&gt; 0.85
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Raise &lt;code&gt;--gpu-memory-utilization&lt;/code&gt;.&lt;/strong&gt; Default is &lt;code&gt;0.9&lt;/code&gt;. The error message tells you to increase it, and that's legitimate — it lets vLLM claim a larger slice of the card for blocks. On a dedicated inference box, &lt;code&gt;0.92&lt;/code&gt;–&lt;code&gt;0.95&lt;/code&gt; is reasonable. But on a card that's also driving a display, going too high starves the desktop and can crash X. On 12 GB cards, counterintuitively, &lt;em&gt;lowering&lt;/em&gt; it to &lt;code&gt;0.75&lt;/code&gt;–&lt;code&gt;0.80&lt;/code&gt; sometimes fixes init OOMs because it leaves more headroom for the CUDA context and fragmentation overhead that the allocator needs up front.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Cap concurrency with &lt;code&gt;--max-num-seqs&lt;/code&gt;.&lt;/strong&gt; Fewer simultaneous sequences means a smaller KV-cache budget. Dropping from the default to &lt;code&gt;--max-num-seqs 16&lt;/code&gt; (or 8) frees real memory on tight cards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Quantize the KV cache.&lt;/strong&gt; &lt;code&gt;--kv-cache-dtype fp8&lt;/code&gt; roughly halves KV-cache memory at a small quality cost — often the difference between fitting and not on 16 GB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Add &lt;code&gt;--enforce-eager&lt;/code&gt;.&lt;/strong&gt; CUDA graph capture pre-allocates extra memory. Disabling it with &lt;code&gt;--enforce-eager&lt;/code&gt; reclaims a few hundred MiB — useful as a last 300–500 MiB when you need context length more than peak throughput.&lt;/p&gt;

&lt;p&gt;A combined low-VRAM launch that works on most 12 GB cards:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vllm serve Qwen/Qwen2.5-7B-Instruct &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 8192 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gpu-memory-utilization&lt;/span&gt; 0.80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-num-seqs&lt;/span&gt; 8 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kv-cache-dtype&lt;/span&gt; fp8 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enforce-eager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Don't trust nvidia-smi here
&lt;/h3&gt;

&lt;p&gt;A subtle point that wastes hours: &lt;code&gt;nvidia-smi&lt;/code&gt; reports driver-level reserved memory, not the segments the CUDA allocator can actually hand to vLLM. vLLM's block allocator queries CUDA directly and can OOM even when &lt;code&gt;nvidia-smi&lt;/code&gt; shows a couple of GB "free." When the two disagree, &lt;strong&gt;trust vLLM's startup log&lt;/strong&gt;, not the system monitor.&lt;/p&gt;

&lt;p&gt;If — and only if — the log explicitly mentions fragmentation, add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PYTORCH_CUDA_ALLOC_CONF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;expandable_segments:True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't set this reflexively. It's a fix for fragmentation specifically, not a magic OOM cure, and the same &lt;code&gt;PYTORCH_CUDA_ALLOC_CONF&lt;/code&gt; knob shows up across the broader &lt;a href="https://dev.to/blog/cuda-out-of-memory-local-ai-fix-2026/"&gt;CUDA out-of-memory fix guide&lt;/a&gt; for Ollama, llama.cpp, and ComfyUI too.&lt;/p&gt;

&lt;h2&gt;
  
  
  "The NVIDIA driver on your system is too old"
&lt;/h2&gt;

&lt;p&gt;The second-most-common wall, especially right after a fresh &lt;code&gt;pip install vllm&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RuntimeError: The NVIDIA driver on your system is too old (found version XXXX).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it happens
&lt;/h3&gt;

&lt;p&gt;vLLM wheels are compiled against a specific CUDA toolkit. As of v0.23.0 the default PyPI wheel targets &lt;strong&gt;CUDA 13.0&lt;/strong&gt;. If your installed driver predates that toolkit, the compiled kernels can't run. This bites people on stable LTS distros and on cloud images that pin older drivers.&lt;/p&gt;

&lt;h3&gt;
  
  
  The fixes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Option A — enable CUDA forward compatibility (no driver upgrade).&lt;/strong&gt; If you're on the official vLLM Docker image, add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--gpus&lt;/span&gt; all &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;VLLM_ENABLE_CUDA_COMPATIBILITY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 ... vllm/vllm-openai:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outside Docker, install the matching &lt;code&gt;cuda-compat&lt;/code&gt; package and point vLLM at it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;cuda-compat-13-0
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;VLLM_ENABLE_CUDA_COMPATIBILITY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;VLLM_CUDA_COMPATIBILITY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/cuda/compat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option B — upgrade the driver.&lt;/strong&gt; The cleaner long-term fix. Match your driver to the CUDA 13.0 toolkit minimum. On WSL2, install the latest Game Ready or Studio driver on the &lt;em&gt;Windows host&lt;/em&gt; — never install a Linux GPU driver inside the WSL distro, which is the same trap that breaks &lt;a href="https://dev.to/blog/ollama-not-using-gpu-fix-cpu-2026/"&gt;Ollama GPU detection&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;**Option C — install a wheel&lt;/p&gt;

</description>
      <category>vllm</category>
      <category>localllm</category>
      <category>cuda</category>
      <category>gpu</category>
    </item>
    <item>
      <title>How to Run a 70B Model on a Single 24GB GPU in 2026 (and When You Shouldn't)</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Fri, 03 Jul 2026 07:04:07 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/how-to-run-a-70b-model-on-a-single-24gb-gpu-in-2026-and-when-you-shouldnt-475n</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/how-to-run-a-70b-model-on-a-single-24gb-gpu-in-2026-and-when-you-shouldnt-475n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/run-70b-model-24gb-gpu-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: A 70B model at Q4_K_M needs ~43–45 GB of VRAM, and a single 24 GB card holds barely half of it. You &lt;em&gt;can&lt;/em&gt; run one with partial offload, but you'll get 6–12 tok/s instead of 30+, and the honest move for most people is a 32B-class model that fits fully. This guide shows the exact &lt;code&gt;-ngl&lt;/code&gt; math, the KV-cache trick that buys you 4–6 extra layers, and the speed you'll actually see.&lt;/p&gt;

&lt;p&gt;What you'll be able to do after this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calculate the correct offload layer count for &lt;em&gt;your&lt;/em&gt; card and context length, instead of guessing&lt;/li&gt;
&lt;li&gt;Cut KV-cache VRAM roughly in half with one flag, freeing room for more GPU layers&lt;/li&gt;
&lt;li&gt;Decide — with numbers, not vibes — whether a 70B is worth the speed hit on your hardware&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: On one 24 GB GPU, a 70B at Q4 runs but crawls (single-digit to low-teens tok/s). If you need 70B-class quality, rent a 48 GB card by the hour; if you need speed on hardware you own, run a &lt;a href="https://dev.to/blog/qwen36-35b-a3b-local-ai-guide-2026/"&gt;32B-class model that fits in 24 GB&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The core problem: the model is twice the size of your card
&lt;/h2&gt;

&lt;p&gt;Here's the wall everyone hits. A modern dense 70B like Llama 3.3 70B at Q4_K_M is about &lt;strong&gt;42.5 GB of weights&lt;/strong&gt; (bartowski's widely-used GGUF), and once you add the KV cache, compute buffers, and CUDA overhead, you need &lt;strong&gt;~43–45 GB of VRAM&lt;/strong&gt; to run it entirely on the GPU. A single &lt;a href="https://www.amazon.com/s?k=RTX+3090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 3090&lt;/a&gt; or &lt;a href="https://www.amazon.com/s?k=RTX+4090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 4090&lt;/a&gt; gives you 24 GB. That's roughly &lt;strong&gt;half&lt;/strong&gt; of what a fully-resident 70B Q4 wants.&lt;/p&gt;

&lt;p&gt;The full quant ladder for a 70B, so you can see where the cliffs are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Quant&lt;/th&gt;
&lt;th&gt;Approx. file size&lt;/th&gt;
&lt;th&gt;Fits fully in 24 GB?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;F16 (unquantized)&lt;/td&gt;
&lt;td&gt;~141 GB&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Datacenter only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;~75 GB&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Needs 2× 48 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q5_K_M&lt;/td&gt;
&lt;td&gt;~50 GB&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Single 48–64 GB card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;~42.5 GB&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;The "good quality" baseline; needs ~48 GB to be comfortable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q3_K_M&lt;/td&gt;
&lt;td&gt;~34 GB&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Noticeable quality drop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q2_K&lt;/td&gt;
&lt;td&gt;~26 GB&lt;/td&gt;
&lt;td&gt;Almost — spills ~2 GB&lt;/td&gt;
&lt;td&gt;Quality degrades visibly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ1_M&lt;/td&gt;
&lt;td&gt;~16.75 GB&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Barely coherent; not worth it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;File sizes from bartowski's Llama-3.3-70B-Instruct-GGUF repo; VRAM-in-use runs a few GB above file size because of context and buffers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So the only quant that fits &lt;em&gt;fully&lt;/em&gt; on a 24 GB card is something below Q2_K — and at that point you've quantized away most of the reason you wanted a 70B. The realistic play is &lt;strong&gt;partial offload&lt;/strong&gt;: put as many layers as fit on the GPU, run the rest on the CPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  How partial offload actually works
&lt;/h2&gt;

&lt;p&gt;A 70B GGUF has &lt;strong&gt;80 transformer layers&lt;/strong&gt; plus an output layer. With llama.cpp (and anything built on it — Ollama, LM Studio, koboldcpp), the &lt;code&gt;-ngl N&lt;/code&gt; flag (&lt;code&gt;--n-gpu-layers&lt;/code&gt;) decides how many of those layers live in VRAM. The rest stay in system RAM and run on the CPU.&lt;/p&gt;

&lt;p&gt;At Q4_K_M, each of those 80 layers weighs roughly &lt;strong&gt;475 MB&lt;/strong&gt;. During every forward pass, execution bounces between GPU and CPU: the GPU-resident layers run at full speed, and the CPU layers run at whatever your system RAM bandwidth allows — which is an order of magnitude slower. That handoff is why partial offload is functional but never fast.&lt;/p&gt;

&lt;p&gt;The math for a 24 GB card:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;24 GB total&lt;/strong&gt; minus ~2 GB for CUDA context, the OS, and compute buffers = ~22 GB usable&lt;/li&gt;
&lt;li&gt;Reserve &lt;strong&gt;2–4 GB for the KV cache&lt;/strong&gt; (more if you want long context)&lt;/li&gt;
&lt;li&gt;That leaves ~18 GB for weights → ~18,000 MB ÷ 475 MB ≈ &lt;strong&gt;38 layers&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice people land at &lt;strong&gt;40–45 layers&lt;/strong&gt; on a 24 GB card by trimming context length and quantizing the KV cache. That puts roughly half the model on the GPU. Community reports put a single RTX 3090 running Llama 70B Q4_K_M at &lt;strong&gt;about 8 tok/s&lt;/strong&gt; with basic settings — slow, but usable for non-interactive work.&lt;/p&gt;

&lt;p&gt;The relationship is roughly linear: with no GPU at all you're at &lt;strong&gt;2–4 tok/s&lt;/strong&gt; (pure CPU), partial offload gets you into the &lt;strong&gt;8–15 tok/s&lt;/strong&gt; range, and a card that holds the whole thing does &lt;strong&gt;30+ tok/s&lt;/strong&gt;. If you offload too few layers you barely beat CPU; the win comes from getting as many layers onto the GPU as your VRAM physically allows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Find your real layer ceiling
&lt;/h2&gt;

&lt;p&gt;Don't guess &lt;code&gt;-ngl&lt;/code&gt;. Start high and let the loader tell you the truth.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;llama.cpp&lt;/strong&gt; directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./llama-cli &lt;span class="nt"&gt;-m&lt;/span&gt; Llama-3.3-70B-Instruct-Q4_K_M.gguf &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-ngl&lt;/span&gt; 99 &lt;span class="nt"&gt;-c&lt;/span&gt; 4096 &lt;span class="nt"&gt;-fa&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Explain partial GPU offload in one paragraph."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-ngl 99&lt;/code&gt; means "offload everything you can." On a 24 GB card it won't fit, and you'll get a CUDA out-of-memory error — that's expected. Watch the log line that reports &lt;code&gt;offloaded XX/81 layers to GPU&lt;/code&gt; before it dies, then back the number down. If you OOM at 81, try 45, then nudge up until it loads with a few hundred MB to spare. (If you keep hitting OOM and don't understand why, our &lt;a href="https://dev.to/blog/cuda-out-of-memory-local-ai-fix-2026/"&gt;CUDA out-of-memory fix guide&lt;/a&gt; walks every cause.)&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Ollama&lt;/strong&gt;, the equivalent is a Modelfile parameter or an environment-driven setting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# In a Modelfile:&lt;/span&gt;
FROM llama3.3:70b
PARAMETER num_gpu 45
PARAMETER num_ctx 4096
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;num_gpu&lt;/code&gt; is Ollama's name for &lt;code&gt;-ngl&lt;/code&gt;. Set it too high and Ollama will silently spill into shared memory on Windows (which tanks speed) or OOM on Linux. Set it just below your ceiling.&lt;/p&gt;

&lt;p&gt;One gotcha worth knowing: if your model keeps unloading and reloading between prompts, that's a separate keep-alive issue, not an offload problem — see &lt;a href="https://dev.to/blog/ollama-model-keeps-reloading-vram-fix-2026/"&gt;why Ollama keeps reloading the model&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Quantize the KV cache to buy back layers
&lt;/h2&gt;

&lt;p&gt;This is the single highest-leverage trick on a memory-starved card. The KV cache stores attention keys and values for every token in context, and at the default F16 precision it eats VRAM fast — several GB at long context. Running it at &lt;strong&gt;q8_0 cuts that roughly in half&lt;/strong&gt; with minimal quality impact, which frees room for 4–6 more transformer layers on the GPU.&lt;/p&gt;

&lt;p&gt;In Ollama, KV-cache quantization &lt;strong&gt;requires Flash Attention&lt;/strong&gt;, so you set both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set these where the Ollama *service* reads them (systemd, launchctl, or&lt;/span&gt;
&lt;span class="c"&gt;# the Windows user env), not just your shell:&lt;/span&gt;
&lt;span class="nv"&gt;OLLAMA_FLASH_ATTENTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nv"&gt;OLLAMA_KV_CACHE_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;q8_0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In raw llama.cpp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./llama-cli &lt;span class="nt"&gt;-m&lt;/span&gt; model.gguf &lt;span class="nt"&gt;-ngl&lt;/span&gt; 45 &lt;span class="nt"&gt;-fa&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-ctk&lt;/span&gt; q8_0 &lt;span class="nt"&gt;-ctv&lt;/span&gt; q8_0 &lt;span class="nt"&gt;-c&lt;/span&gt; 8192
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-fa&lt;/code&gt; enables Flash Attention; &lt;code&gt;-ctk&lt;/code&gt;/&lt;code&gt;-ctv&lt;/code&gt; set the K and V cache types. Two warnings the docs bury:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Not every architecture supports Flash Attention.&lt;/strong&gt; If you force &lt;code&gt;q8_0&lt;/code&gt; on an unsupported model, Ollama silently falls back to F16 — so you budget for half the cache and then OOM unexpectedly. Verify with &lt;code&gt;ollama ps&lt;/code&gt; that the model loaded at the size you expected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;q4_0 cache&lt;/strong&gt; cuts VRAM further but the quality loss becomes noticeable, especially on long-context reasoning. Stick with q8_0 unless you're desperate for those last few hundred MB.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With q8_0 cache and Flash Attention on, a 24 GB card that topped out at 40 layers can often reach &lt;strong&gt;44–46&lt;/strong&gt;, and every extra layer on the GPU is a measurable speed gain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Keep context realistic
&lt;/h2&gt;

&lt;p&gt;Context length is the other VRAM lever, and it's the one people forget. The KV cache scales linearly with context: doubling &lt;code&gt;-c&lt;/code&gt; from 4096 to 8192 roughly doubles cache VRAM, which costs you GPU layers. On a 24 GB card running a 70B, &lt;strong&gt;4096–8192 tokens is the sweet spot.&lt;/strong&gt; If you genuinely need 32K+ context, you're back to needing more VRAM — there's no free lunch.&lt;/p&gt;

&lt;p&gt;Also make sure your &lt;strong&gt;system RAM&lt;/strong&gt; can hold the half of the model that lives on the CPU. A Q4 70B needs ~42 GB total, so with ~22 GB on the GPU you need at least ~24 GB of &lt;em&gt;free&lt;/em&gt; system RAM for the rest plus headroom — meaning 48 GB of RAM minimum, 64 GB comfortable. If you're short, that's a &lt;a href="https://dev.to/blog/system-ram-for-local-llms-2026/"&gt;system RAM sizing&lt;/a&gt; problem, and the symptom is the Linux OOM killer terminating your runner mid-load.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you shouldn't do this at all
&lt;/h2&gt;

&lt;p&gt;Here's the part most "how to run 70B" posts skip. Partial offload &lt;em&gt;works&lt;/em&gt;, but at 8–12 tok/s a 70B is painful for anything interactive &lt;/p&gt;

</description>
      <category>localllm</category>
      <category>gpu</category>
      <category>llama</category>
      <category>ollama</category>
    </item>
    <item>
      <title>Ornith-1.0 for Local AI in 2026: Which GPU Runs DeepReinforce's MIT-Licensed Coding Model?</title>
      <dc:creator>Jovan Chan</dc:creator>
      <pubDate>Fri, 03 Jul 2026 07:03:21 +0000</pubDate>
      <link>https://dev.to/jovan_chan_9500711396d4e6/ornith-10-for-local-ai-in-2026-which-gpu-runs-deepreinforces-mit-licensed-coding-model-10c2</link>
      <guid>https://dev.to/jovan_chan_9500711396d4e6/ornith-10-for-local-ai-in-2026-which-gpu-runs-deepreinforces-mit-licensed-coding-model-10c2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://runaihome.com/blog/ornith-1-0-local-ai-coding-model-gpu-guide-2026/" rel="noopener noreferrer"&gt;runaihome.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Ornith-1.0 is DeepReinforce's new MIT-licensed coding family — 9B Dense, 31B Dense, 35B MoE, and 397B MoE, post-trained on Gemma 4 and Qwen 3.5. The home-lab pick is the &lt;strong&gt;35B MoE&lt;/strong&gt;: ~3B active parameters per token make it fast, and the Q4_K_M GGUF is 21.2 GB, so it just fits a single 24 GB card. The catch: 21.2 GB on a 24 GB GPU leaves almost no room for long context.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;9B Dense&lt;/th&gt;
&lt;th&gt;35B MoE&lt;/th&gt;
&lt;th&gt;397B MoE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;8–12 GB cards&lt;/td&gt;
&lt;td&gt;The 24 GB sweet spot&lt;/td&gt;
&lt;td&gt;Cloud / API only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q4 size&lt;/td&gt;
&lt;td&gt;~6 GB&lt;/td&gt;
&lt;td&gt;21.2 GB (Q4_K_M)&lt;/td&gt;
&lt;td&gt;~225 GB+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active params&lt;/td&gt;
&lt;td&gt;9B (dense)&lt;/td&gt;
&lt;td&gt;~3B per token&lt;/td&gt;
&lt;td&gt;~? per token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runs on a single consumer GPU?&lt;/td&gt;
&lt;td&gt;Yes, easily&lt;/td&gt;
&lt;td&gt;Yes, on 24 GB&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The catch&lt;/td&gt;
&lt;td&gt;Weakest of the family&lt;/td&gt;
&lt;td&gt;No headroom for 256K context&lt;/td&gt;
&lt;td&gt;No card holds it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take&lt;/strong&gt;: If you have a 24 GB card, grab the 35B MoE Q4_K_M — it's the rare model that gives you MoE speed &lt;em&gt;and&lt;/em&gt; a license you can actually ship a product on. If you're on 8–16 GB, run the 9B and keep your expectations modest. The 397B is an API model; don't try to buy hardware for it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The local-AI release calendar has been relentless this month, but Ornith-1.0 is worth stopping for — not because it's the biggest, but because it lands the two things home-labbers actually ask for: a permissive license and a variant that runs fast on a card you already own.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Ornith-1.0 actually is
&lt;/h2&gt;

&lt;p&gt;DeepReinforce released the Ornith-1.0 family on &lt;strong&gt;June 25, 2026&lt;/strong&gt;, under the &lt;strong&gt;MIT license with no regional restrictions&lt;/strong&gt; — every checkpoint, including the GGUF and FP8 builds, ships under that license on Hugging Face. That alone separates it from a lot of "open weight" releases that bolt on usage clauses or research-only terms.&lt;/p&gt;

&lt;p&gt;The family spans four checkpoints, all post-trained on &lt;strong&gt;Gemma 4 and Qwen 3.5 bases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ornith-1.0-9B&lt;/strong&gt; — dense, edge/resource-constrained target&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ornith-1.0-31B&lt;/strong&gt; — dense&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ornith-1.0-35B&lt;/strong&gt; — sparse Mixture-of-Experts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ornith-1.0-397B&lt;/strong&gt; — flagship MoE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The headline feature is the training method, not the size. Ornith is a &lt;em&gt;self-scaffolding&lt;/em&gt; model: during reinforcement learning it learns to write its own harness — the tool-use loop, the test scaffold — and jointly optimizes that scaffold alongside the code it produces. It's also reasoning-first: each assistant turn opens with a chain-of-thought block, and the serving stack returns that reasoning in a separate field from the final answer. For a coding agent, that's the right shape: it plans, then acts.&lt;/p&gt;

&lt;p&gt;If you've read our piece on &lt;a href="https://dev.to/blog/why-local-llms-got-good-mid-2026-speculative-decoding-moe/"&gt;why local LLMs got good in 2026&lt;/a&gt;, this is the same story playing out — sparse activation plus better post-training, not raw parameter count, is what's closing the gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benchmarks (and where to be skeptical)
&lt;/h2&gt;

&lt;p&gt;The vendor numbers are strong, and a few are striking enough to flag as &lt;em&gt;vendor-reported until independent runs land&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ornith-1.0-397B&lt;/strong&gt;: 82.4 on SWE-Bench Verified and 77.5 on Terminal-Bench 2.1. DeepReinforce positions this above Claude Opus 4.7; for context, Claude Opus 4.8 sits at 87.6 on SWE-Bench Verified, so the 397B trails only the very top of the closed-model field on that test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ornith-1.0-35B MoE&lt;/strong&gt;: 64.2 on Terminal-Bench 2.1 — above Qwen 3.5-397B's 53.5, a model with more than ten times the total parameter count. If that holds up under independent testing, it's the most interesting result in the release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ornith-1.0-9B Dense&lt;/strong&gt;: 43.1 on Terminal-Bench 2.1, essentially matching Gemma 4-31B's 42.1.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A 35B MoE beating a 397B dense model on an agentic benchmark is exactly the kind of claim that needs third-party confirmation — vendor benchmark suites tend to flatter the home team. Treat these as a reason to &lt;em&gt;try&lt;/em&gt; the model, not as settled fact. We've taken the same cautious line on every fresh-drop coding model, from &lt;a href="https://dev.to/blog/kimi-k2-7-local-ai-hardware-guide-2026/"&gt;Kimi K2.7&lt;/a&gt; to &lt;a href="https://dev.to/blog/qwen3-coder-next-local-ai-hardware-guide-2026/"&gt;Qwen3-Coder-Next&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which GPU runs which variant
&lt;/h2&gt;

&lt;p&gt;This is the part that matters for your wallet. Here's how each variant maps to real hardware.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ornith-1.0-9B — for 8 GB to 16 GB cards
&lt;/h3&gt;

&lt;p&gt;The 9B dense weights are about &lt;strong&gt;6 GB at Q4&lt;/strong&gt; quantization and roughly &lt;strong&gt;19 GB in BF16&lt;/strong&gt;. At Q4_K_M it runs comfortably on 6–8 GB of VRAM, which means it's the variant for an &lt;a href="https://www.amazon.com/s?k=RTX+3060&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 3060&lt;/a&gt; 12GB, an &lt;a href="https://www.amazon.com/s?k=RTX+4060+Ti&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 4060 Ti&lt;/a&gt; 8GB or 16GB, or even an older 8 GB card. With a 16 GB card you can move up to Q6_K or Q8_0 and still leave plenty of room for context.&lt;/p&gt;

&lt;p&gt;Being a dense 9B, it's bandwidth-bound — generation speed scales with your card's memory bandwidth, not its FLOPS. On a modern 16 GB card you'll get interactive speeds, but understand the trade-off: this is the weakest member of the family. It's a capable local autocomplete and small-task assistant, not a replacement for a frontier agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ornith-1.0-35B MoE — the 24 GB sweet spot
&lt;/h3&gt;

&lt;p&gt;This is the one to care about. The 35B MoE is a sparse model with &lt;strong&gt;256 routed experts, 8 active per token plus a shared expert, across 40 layers&lt;/strong&gt;, activating roughly &lt;strong&gt;3B parameters per token&lt;/strong&gt;. That architecture is the whole point: all 35B weights have to sit in VRAM, but only ~3B are read per token, so it generates far faster than a dense model of the same footprint.&lt;/p&gt;

&lt;p&gt;The official GGUF sizes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Quant&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Fits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;21.2 GB&lt;/td&gt;
&lt;td&gt;24 GB card (tight)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q5_K_M&lt;/td&gt;
&lt;td&gt;24.7 GB&lt;/td&gt;
&lt;td&gt;32 GB card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q6_K&lt;/td&gt;
&lt;td&gt;28.5 GB&lt;/td&gt;
&lt;td&gt;32 GB card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;36.9 GB&lt;/td&gt;
&lt;td&gt;48 GB+ / multi-GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The practical read: &lt;strong&gt;Q4_K_M at 21.2 GB fits a single 24 GB GPU, but barely.&lt;/strong&gt; That leaves under 3 GB for the KV cache and runtime overhead. You'll run it fine at 8K–16K context; the model's full 256K context window is a cloud-serving figure, not something you'll reach on 24 GB. If you want real context headroom, you want a 32 GB &lt;a href="https://www.amazon.com/s?k=RTX+5090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 5090&lt;/a&gt; and the Q4_K_M, or you accept short context on 24 GB.&lt;/p&gt;

&lt;p&gt;What about speed? We don't have independent tokens/sec measurements for Ornith yet, so we won't invent one. But we &lt;em&gt;do&lt;/em&gt; have a measured reference point on this exact site: &lt;a href="https://dev.to/blog/nemotron-cascade-2-local-ai-gpu-guide-2026/"&gt;Nemotron-Cascade 2&lt;/a&gt; is a ~3B-active MoE (30B-A3B) that hits &lt;strong&gt;187 tok/s on a used RTX 3090&lt;/strong&gt; at a comparable quant. Ornith-1.0-35B has near-identical active-parameter math, so expect it to land in the same neighborhood on the same hardware — fast enough for genuinely interactive agentic coding. We'll update this with real numbers once community benchmarks are out. For more on how 3B-active MoE compares to dense models at the same VRAM, see our &lt;a href="https://dev.to/blog/qwen36-35b-a3b-local-ai-guide-2026/"&gt;Qwen 3.6 35B-A3B guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The best-value card for this remains the &lt;a href="https://dev.to/blog/used-rtx-3090-ai-value-king-2026/"&gt;used RTX 3090&lt;/a&gt;: 24 GB, 936 GB/s of bandwidth, and a used average around $1,070 as of June 2026. The &lt;a href="https://www.amazon.com/s?k=RTX+4090&amp;amp;tag=runaihome-20" rel="noopener noreferrer"&gt;RTX 4090&lt;/a&gt; is faster but costs roughly twice as much used for the same 24 GB ceiling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ornith-1.0-31B Dense — capable, but awkward
&lt;/h3&gt;

&lt;p&gt;The 31B dense variant sits in an odd spot. As a dense 31B it needs a similar VRAM footprint to the 35B MoE at the same quant (call it ~18–20 GB at Q4), but because it's dense it activates all 31B parameters per token — so it'll be meaningfully &lt;em&gt;slower&lt;/em&gt; than the 35B MoE while taking up about the same space. Unless you have a specific reason to prefer a dense model's behavior, the 35B MoE is the better pick on identical hardware. This is the same dense-vs-MoE trade we walked through in the &lt;a href="https://dev.to/blog/codestral-2-local-ai-hardware-guide-2026/"&gt;Codestral 2 guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ornith-1.0-397B MoE — rent it, don't buy for it
&lt;/h3&gt;

&lt;p&gt;The flagship is not a home-lab model. The FP8 checkpoint alone is on the order of 225 GB+, well beyond any single consumer GPU and beyond most multi-GPU home builds. If you want to use the 397B, the sane paths are the &lt;/p&gt;

</description>
      <category>ornith</category>
      <category>deepreinforce</category>
      <category>localllm</category>
      <category>coding</category>
    </item>
  </channel>
</rss>
