<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Ollama on DaShaun</title>
        <link>https://dashaun.com/tags/ollama/</link>
        <description>Recent content in Ollama on DaShaun</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <managingEditor>dashaun@dashaun.com (DaShaun Carter)</managingEditor>
        <webMaster>dashaun@dashaun.com (DaShaun Carter)</webMaster>
        <lastBuildDate>Tue, 22 Sep 2026 12:09:27 -0500</lastBuildDate><atom:link href="https://dashaun.com/tags/ollama/index.xml" rel="self" type="application/rss+xml" />
        <item>
            <title>From Ollama to vLLM on an RTX 5090</title>
            <link>https://dashaun.com/posts/ollama-to-vllm-on-rtx-5090/</link>
            <pubDate>Tue, 22 Sep 2026 12:09:27 -0500</pubDate>
            <author>dashaun@dashaun.com (DaShaun Carter)</author>
            <guid>https://dashaun.com/posts/ollama-to-vllm-on-rtx-5090/</guid>
            <description>&lt;h1 id=&#34;from-ollama-to-vllm-on-an-rtx-5090&#34;&gt;
  From Ollama to vLLM on an RTX 5090
  &lt;a class=&#34;heading-link&#34; href=&#34;#from-ollama-to-vllm-on-an-rtx-5090&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;I run a couple of DGX Sparks with DeepSeek via vLLM and Ray. The RTX 5090 box (kintsugi) was still on Ollama. That split stopped making sense once my agent workflows outgrew what Ollama does well.&lt;/p&gt;
&lt;h2 id=&#34;why-i-left-ollama&#34;&gt;
  Why I left Ollama
  &lt;a class=&#34;heading-link&#34; href=&#34;#why-i-left-ollama&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Ollama is fine for one user and one chat. My multi-agent workflows fire dozens of concurrent requests, and Ollama serializes them behind a single model slot. Queues form, latency climbs, and agents stall waiting on each other.&lt;/p&gt;
&lt;p&gt;vLLM does continuous batching. Requests arrive, get packed into the same forward pass, and everyone gets a turn. Same GPU, but the pipeline stays busy.&lt;/p&gt;


&lt;svg viewBox=&#34;0 0 760 420&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; role=&#34;img&#34; aria-label=&#34;Ollama queues requests, vLLM batches them&#34;&gt;
  &lt;rect width=&#34;760&#34; height=&#34;420&#34; fill=&#34;#ffffff&#34;/&gt;
  &lt;text x=&#34;24&#34; y=&#34;28&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;14&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;Multi-agent load&lt;/text&gt;

  &lt;!-- Ollama panel --&gt;
  &lt;rect x=&#34;24&#34; y=&#34;44&#34; width=&#34;336&#34; height=&#34;340&#34; rx=&#34;12&#34; fill=&#34;#fafbfc&#34; stroke=&#34;#24292f&#34; stroke-width=&#34;1.5&#34;/&gt;
  &lt;text x=&#34;192&#34; y=&#34;70&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;14&#34; font-weight=&#34;600&#34; fill=&#34;#d1242f&#34;&gt;Ollama&lt;/text&gt;

  &lt;g font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; text-anchor=&#34;middle&#34; fill=&#34;#24292f&#34;&gt;
    &lt;rect x=&#34;44&#34; y=&#34;96&#34; width=&#34;110&#34; height=&#34;30&#34; rx=&#34;6&#34; fill=&#34;#ffffff&#34; stroke=&#34;#d1242f&#34; opacity=&#34;0&#34;&gt;&lt;animate attributeName=&#34;opacity&#34; from=&#34;0&#34; to=&#34;1&#34; begin=&#34;0.4s&#34; dur=&#34;0.3s&#34; fill=&#34;freeze&#34;/&gt;&lt;/rect&gt;&lt;text x=&#34;99&#34; y=&#34;116&#34; opacity=&#34;0&#34;&gt;&lt;animate attributeName=&#34;opacity&#34; from=&#34;0&#34; to=&#34;1&#34; begin=&#34;0.4s&#34; dur=&#34;0.3s&#34; fill=&#34;freeze&#34;/&gt;req 1&lt;/text&gt;
    &lt;rect x=&#34;44&#34; y=&#34;136&#34; width=&#34;110&#34; height=&#34;30&#34; rx=&#34;6&#34; fill=&#34;#ffffff&#34; stroke=&#34;#d1242f&#34; opacity=&#34;0&#34;&gt;&lt;animate attributeName=&#34;opacity&#34; from=&#34;0&#34; to=&#34;1&#34; begin=&#34;1.0s&#34; dur=&#34;0.3s&#34; fill=&#34;freeze&#34;/&gt;&lt;/rect&gt;&lt;text x=&#34;99&#34; y=&#34;156&#34; opacity=&#34;0&#34;&gt;&lt;animate attributeName=&#34;opacity&#34; from=&#34;0&#34; to=&#34;1&#34; begin=&#34;1.0s&#34; dur=&#34;0.3s&#34; fill=&#34;freeze&#34;/&gt;req 2&lt;/text&gt;
    &lt;rect x=&#34;44&#34; y=&#34;176&#34; width=&#34;110&#34; height=&#34;30&#34; rx=&#34;6&#34; fill=&#34;#ffffff&#34; stroke=&#34;#d1242f&#34; opacity=&#34;0&#34;&gt;&lt;animate attributeName=&#34;opacity&#34; from=&#34;0&#34; to=&#34;1&#34; begin=&#34;1.6s&#34; dur=&#34;0.3s&#34; fill=&#34;freeze&#34;/&gt;&lt;/rect&gt;&lt;text x=&#34;99&#34; y=&#34;196&#34; opacity=&#34;0&#34;&gt;&lt;animate attributeName=&#34;opacity&#34; from=&#34;0&#34; to=&#34;1&#34; begin=&#34;1.6s&#34; dur=&#34;0.3s&#34; fill=&#34;freeze&#34;/&gt;req 3&lt;/text&gt;
    &lt;rect x=&#34;44&#34; y=&#34;216&#34; width=&#34;110&#34; height=&#34;30&#34; rx=&#34;6&#34; fill=&#34;#ffffff&#34; stroke=&#34;#d1242f&#34; opacity=&#34;0&#34;&gt;&lt;animate attributeName=&#34;opacity&#34; from=&#34;0&#34; to=&#34;1&#34; begin=&#34;2.2s&#34; dur=&#34;0.3s&#34; fill=&#34;freeze&#34;/&gt;&lt;/rect&gt;&lt;text x=&#34;99&#34; y=&#34;236&#34; opacity=&#34;0&#34;&gt;&lt;animate attributeName=&#34;opacity&#34; from=&#34;0&#34; to=&#34;1&#34; begin=&#34;2.2s&#34; dur=&#34;0.3s&#34; fill=&#34;freeze&#34;/&gt;req 4&lt;/text&gt;
  &lt;/g&gt;
  &lt;text x=&#34;99&#34; y=&#34;268&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;11&#34; fill=&#34;#57606a&#34;&gt;queue grows&lt;/text&gt;

  &lt;path d=&#34;M 154 200 H 208&#34; stroke=&#34;#d1242f&#34; stroke-width=&#34;2&#34; stroke-dasharray=&#34;6 4&#34; fill=&#34;none&#34;&gt;&lt;animate attributeName=&#34;stroke-dashoffset&#34; from=&#34;0&#34; to=&#34;-20&#34; dur=&#34;0.8s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/path&gt;

  &lt;rect x=&#34;208&#34; y=&#34;140&#34; width=&#34;136&#34; height=&#34;120&#34; rx=&#34;10&#34; fill=&#34;#ffffff&#34; stroke=&#34;#d1242f&#34; stroke-width=&#34;2&#34;/&gt;
  &lt;text x=&#34;276&#34; y=&#34;186&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;model slot&lt;/text&gt;
  &lt;text x=&#34;276&#34; y=&#34;206&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;11&#34; fill=&#34;#57606a&#34;&gt;one at a time&lt;/text&gt;
  &lt;text x=&#34;276&#34; y=&#34;240&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; fill=&#34;#d1242f&#34;&gt;1 / N served&lt;/text&gt;

  &lt;!-- vLLM panel --&gt;
  &lt;rect x=&#34;400&#34; y=&#34;44&#34; width=&#34;336&#34; height=&#34;340&#34; rx=&#34;12&#34; fill=&#34;#fafbfc&#34; stroke=&#34;#24292f&#34; stroke-width=&#34;1.5&#34;/&gt;
  &lt;text x=&#34;568&#34; y=&#34;70&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;14&#34; font-weight=&#34;600&#34; fill=&#34;#1a7f37&#34;&gt;vLLM&lt;/text&gt;

  &lt;g font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; text-anchor=&#34;middle&#34; fill=&#34;#24292f&#34;&gt;
    &lt;rect x=&#34;420&#34; y=&#34;96&#34; width=&#34;110&#34; height=&#34;30&#34; rx=&#34;6&#34; fill=&#34;#ffffff&#34; stroke=&#34;#1a7f37&#34;/&gt;&lt;text x=&#34;475&#34; y=&#34;116&#34;&gt;req 1&lt;/text&gt;
    &lt;rect x=&#34;420&#34; y=&#34;136&#34; width=&#34;110&#34; height=&#34;30&#34; rx=&#34;6&#34; fill=&#34;#ffffff&#34; stroke=&#34;#1a7f37&#34;/&gt;&lt;text x=&#34;475&#34; y=&#34;156&#34;&gt;req 2&lt;/text&gt;
    &lt;rect x=&#34;420&#34; y=&#34;176&#34; width=&#34;110&#34; height=&#34;30&#34; rx=&#34;6&#34; fill=&#34;#ffffff&#34; stroke=&#34;#1a7f37&#34;/&gt;&lt;text x=&#34;475&#34; y=&#34;196&#34;&gt;req 3&lt;/text&gt;
  &lt;/g&gt;
  &lt;text x=&#34;475&#34; y=&#34;240&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;11&#34; fill=&#34;#57606a&#34;&gt;in parallel&lt;/text&gt;

  &lt;path d=&#34;M 530 111 C 552 111 552 140 560 140&#34; stroke=&#34;#1a7f37&#34; stroke-width=&#34;2&#34; stroke-dasharray=&#34;6 4&#34; fill=&#34;none&#34;&gt;&lt;animate attributeName=&#34;stroke-dashoffset&#34; from=&#34;0&#34; to=&#34;-20&#34; dur=&#34;0.6s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/path&gt;
  &lt;path d=&#34;M 530 151 C 552 151 552 160 560 160&#34; stroke=&#34;#1a7f37&#34; stroke-width=&#34;2&#34; stroke-dasharray=&#34;6 4&#34; fill=&#34;none&#34;&gt;&lt;animate attributeName=&#34;stroke-dashoffset&#34; from=&#34;0&#34; to=&#34;-20&#34; dur=&#34;0.6s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/path&gt;
  &lt;path d=&#34;M 530 191 C 552 191 552 180 560 180&#34; stroke=&#34;#1a7f37&#34; stroke-width=&#34;2&#34; stroke-dasharray=&#34;6 4&#34; fill=&#34;none&#34;&gt;&lt;animate attributeName=&#34;stroke-dashoffset&#34; from=&#34;0&#34; to=&#34;-20&#34; dur=&#34;0.6s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/path&gt;

  &lt;rect x=&#34;560&#34; y=&#34;130&#34; width=&#34;160&#34; height=&#34;120&#34; rx=&#34;10&#34; fill=&#34;#ffffff&#34; stroke=&#34;#1a7f37&#34; stroke-width=&#34;2&#34;/&gt;
  &lt;text x=&#34;640&#34; y=&#34;176&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;engine&lt;/text&gt;
  &lt;text x=&#34;640&#34; y=&#34;196&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;11&#34; fill=&#34;#57606a&#34;&gt;batch&lt;/text&gt;
  &lt;rect x=&#34;578&#34; y=&#34;212&#34; width=&#34;124&#34; height=&#34;8&#34; rx=&#34;4&#34; fill=&#34;#d0d7de&#34;/&gt;
  &lt;rect x=&#34;578&#34; y=&#34;212&#34; width=&#34;20&#34; height=&#34;8&#34; rx=&#34;4&#34; fill=&#34;#1a7f37&#34;&gt;&lt;animate attributeName=&#34;width&#34; values=&#34;20;124;20&#34; dur=&#34;2.5s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/rect&gt;
  &lt;text x=&#34;640&#34; y=&#34;240&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; fill=&#34;#1a7f37&#34;&gt;3 / 3 concurrent&lt;/text&gt;
&lt;/svg&gt;

&lt;h2 id=&#34;the-box-before&#34;&gt;
  The box before
  &lt;a class=&#34;heading-link&#34; href=&#34;#the-box-before&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;kintsugi ran Ollama with eleven models: a few Qwen sizes, Llama 3.x, Phi-4, Granite, an embedding model, and two FLUX diffusion models. The FLUX models moved to a 4090 / M4 because vLLM does not serve diffusion image models. It serves LLMs.&lt;/p&gt;
&lt;h2 id=&#34;picking-a-model&#34;&gt;
  Picking a model
  &lt;a class=&#34;heading-link&#34; href=&#34;#picking-a-model&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;For a 32 GB card the sweet spot is a MoE with sparse active params: fast because only a slice of the network runs per token, small enough to quantize into the card. That pointed at Qwen3-Coder-30B-A3B (30B total, 3.3B active).&lt;/p&gt;
&lt;p&gt;Then the quantization decision.&lt;/p&gt;


&lt;svg viewBox=&#34;0 0 760 300&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; role=&#34;img&#34; aria-label=&#34;Model quantization decision&#34;&gt;
  &lt;rect width=&#34;760&#34; height=&#34;300&#34; fill=&#34;#ffffff&#34;/&gt;
  &lt;text x=&#34;24&#34; y=&#34;28&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;14&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;Qwen3-Coder-30B-A3B on 32 GB&lt;/text&gt;
  &lt;text x=&#34;24&#34; y=&#34;48&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; fill=&#34;#57606a&#34;&gt;30B total · 3.3B active · MoE&lt;/text&gt;

  &lt;!-- row 1: official AWQ --&gt;
  &lt;rect x=&#34;24&#34; y=&#34;66&#34; width=&#34;580&#34; height=&#34;56&#34; rx=&#34;10&#34; fill=&#34;#fafbfc&#34; stroke=&#34;#d0d7de&#34; stroke-width=&#34;1.5&#34;/&gt;
  &lt;text x=&#34;48&#34; y=&#34;90&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;Official AWQ&lt;/text&gt;
  &lt;text x=&#34;48&#34; y=&#34;110&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; fill=&#34;#57606a&#34;&gt;gated · needs HF token and license&lt;/text&gt;
  &lt;text x=&#34;668&#34; y=&#34;102&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;20&#34; font-weight=&#34;600&#34; fill=&#34;#d1242f&#34;&gt;✗&lt;/text&gt;

  &lt;!-- row 2: official FP8 --&gt;
  &lt;rect x=&#34;24&#34; y=&#34;134&#34; width=&#34;580&#34; height=&#34;56&#34; rx=&#34;10&#34; fill=&#34;#fafbfc&#34; stroke=&#34;#d0d7de&#34; stroke-width=&#34;1.5&#34;/&gt;
  &lt;text x=&#34;48&#34; y=&#34;158&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;Official FP8&lt;/text&gt;
  &lt;text x=&#34;48&#34; y=&#34;178&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; fill=&#34;#57606a&#34;&gt;~30.5 GB weights · no KV cache headroom in 32 GB&lt;/text&gt;
  &lt;text x=&#34;668&#34; y=&#34;170&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;20&#34; font-weight=&#34;600&#34; fill=&#34;#d1242f&#34;&gt;✗&lt;/text&gt;

  &lt;!-- row 3: chosen --&gt;
  &lt;rect x=&#34;24&#34; y=&#34;202&#34; width=&#34;580&#34; height=&#34;56&#34; rx=&#34;10&#34; fill=&#34;#f6fff8&#34; stroke=&#34;#1a7f37&#34; stroke-width=&#34;2&#34;/&gt;
  &lt;text x=&#34;48&#34; y=&#34;226&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;cyankiwi INT4&lt;/text&gt;
  &lt;text x=&#34;48&#34; y=&#34;246&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; fill=&#34;#57606a&#34;&gt;open · ~16 GB · auto-detected (compressed-tensors)&lt;/text&gt;
  &lt;rect x=&#34;620&#34; y=&#34;214&#34; width=&#34;96&#34; height=&#34;28&#34; rx=&#34;14&#34; fill=&#34;#1a7f37&#34;/&gt;
  &lt;text x=&#34;668&#34; y=&#34;233&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; font-weight=&#34;600&#34; fill=&#34;#ffffff&#34;&gt;chosen&lt;/text&gt;
  &lt;path d=&#34;M 648 270 l 12 12 l 22 -22&#34; fill=&#34;none&#34; stroke=&#34;#1a7f37&#34; stroke-width=&#34;3&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; pathLength=&#34;1&#34; stroke-dasharray=&#34;1 1&#34; stroke-dashoffset=&#34;1&#34;&gt;&lt;animate attributeName=&#34;stroke-dashoffset&#34; from=&#34;1&#34; to=&#34;0&#34; dur=&#34;0.5s&#34; begin=&#34;1s&#34; fill=&#34;freeze&#34;/&gt;&lt;/path&gt;
&lt;/svg&gt;

&lt;p&gt;I serve one model, no swap logic. vLLM keeps weights in VRAM for the life of the process, so unlike Ollama there is no load and unload. With one model that is exactly what I want.&lt;/p&gt;
&lt;h2 id=&#34;how-it-runs&#34;&gt;
  How it runs
  &lt;a class=&#34;heading-link&#34; href=&#34;#how-it-runs&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The repo is self-contained: a compose file, a setup script, and a systemd unit. &lt;code&gt;sudo ./scripts/setup.sh&lt;/code&gt; installs Docker and the NVIDIA Container Toolkit if missing, wires the nvidia runtime, installs the unit, and starts the stack. The unit plus &lt;code&gt;restart: unless-stopped&lt;/code&gt; mean the box comes back serving after a reboot.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/dashaun/rtx5090-vllm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#007020&#34;&gt;cd&lt;/span&gt; rtx5090-vllm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo ./scripts/setup.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl localhost:8000/v1/models
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;svg viewBox=&#34;0 0 760 400&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; role=&#34;img&#34; aria-label=&#34;kintsugi architecture&#34;&gt;
  &lt;rect width=&#34;760&#34; height=&#34;400&#34; fill=&#34;#ffffff&#34;/&gt;
  &lt;text x=&#34;24&#34; y=&#34;28&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;14&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;Agents&lt;/text&gt;

  &lt;g font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34;&gt;
    &lt;rect x=&#34;24&#34; y=&#34;44&#34; width=&#34;130&#34; height=&#34;56&#34; rx=&#34;8&#34; fill=&#34;#f6f8fa&#34; stroke=&#34;#24292f&#34; stroke-width=&#34;1.5&#34;/&gt;
    &lt;text x=&#34;89&#34; y=&#34;68&#34; text-anchor=&#34;middle&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;Agent&lt;/text&gt;
    &lt;text x=&#34;89&#34; y=&#34;86&#34; text-anchor=&#34;middle&#34; fill=&#34;#57606a&#34;&gt;Cline&lt;/text&gt;
    &lt;rect x=&#34;24&#34; y=&#34;116&#34; width=&#34;130&#34; height=&#34;56&#34; rx=&#34;8&#34; fill=&#34;#f6f8fa&#34; stroke=&#34;#24292f&#34; stroke-width=&#34;1.5&#34;/&gt;
    &lt;text x=&#34;89&#34; y=&#34;140&#34; text-anchor=&#34;middle&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;Agent&lt;/text&gt;
    &lt;text x=&#34;89&#34; y=&#34;158&#34; text-anchor=&#34;middle&#34; fill=&#34;#57606a&#34;&gt;LangChain&lt;/text&gt;
    &lt;rect x=&#34;24&#34; y=&#34;188&#34; width=&#34;130&#34; height=&#34;56&#34; rx=&#34;8&#34; fill=&#34;#f6f8fa&#34; stroke=&#34;#24292f&#34; stroke-width=&#34;1.5&#34;/&gt;
    &lt;text x=&#34;89&#34; y=&#34;212&#34; text-anchor=&#34;middle&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;Agent&lt;/text&gt;
    &lt;text x=&#34;89&#34; y=&#34;230&#34; text-anchor=&#34;middle&#34; fill=&#34;#57606a&#34;&gt;Qwen Code&lt;/text&gt;
  &lt;/g&gt;

  &lt;g stroke=&#34;#0969da&#34; stroke-width=&#34;2&#34; stroke-dasharray=&#34;6 4&#34; fill=&#34;none&#34;&gt;
    &lt;path d=&#34;M 154 72 H 300&#34;&gt;&lt;animate attributeName=&#34;stroke-dashoffset&#34; from=&#34;0&#34; to=&#34;-20&#34; dur=&#34;0.8s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/path&gt;
    &lt;path d=&#34;M 154 144 H 300&#34;&gt;&lt;animate attributeName=&#34;stroke-dashoffset&#34; from=&#34;0&#34; to=&#34;-20&#34; dur=&#34;0.8s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/path&gt;
    &lt;path d=&#34;M 154 216 H 300&#34;&gt;&lt;animate attributeName=&#34;stroke-dashoffset&#34; from=&#34;0&#34; to=&#34;-20&#34; dur=&#34;0.8s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/path&gt;
  &lt;/g&gt;

  &lt;rect x=&#34;300&#34; y=&#34;40&#34; width=&#34;250&#34; height=&#34;320&#34; rx=&#34;12&#34; fill=&#34;#fafbfc&#34; stroke=&#34;#24292f&#34; stroke-width=&#34;1.5&#34;/&gt;
  &lt;text x=&#34;425&#34; y=&#34;66&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;vLLM · Docker&lt;/text&gt;

  &lt;rect x=&#34;322&#34; y=&#34;84&#34; width=&#34;206&#34; height=&#34;56&#34; rx=&#34;8&#34; fill=&#34;#ffffff&#34; stroke=&#34;#0969da&#34; stroke-width=&#34;1.5&#34;/&gt;
  &lt;text x=&#34;425&#34; y=&#34;106&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; font-weight=&#34;600&#34; fill=&#34;#0969da&#34;&gt;API server&lt;/text&gt;
  &lt;text x=&#34;425&#34; y=&#34;124&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;11&#34; fill=&#34;#57606a&#34;&gt;POST /v1/chat/completions&lt;/text&gt;

  &lt;rect x=&#34;322&#34; y=&#34;164&#34; width=&#34;206&#34; height=&#34;64&#34; rx=&#34;8&#34; fill=&#34;#ffffff&#34; stroke=&#34;#24292f&#34; stroke-width=&#34;1.5&#34;/&gt;
  &lt;text x=&#34;425&#34; y=&#34;186&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;Engine&lt;/text&gt;
  &lt;text x=&#34;425&#34; y=&#34;204&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;11&#34; fill=&#34;#57606a&#34;&gt;continuous batching&lt;/text&gt;
  &lt;rect x=&#34;340&#34; y=&#34;214&#34; width=&#34;170&#34; height=&#34;6&#34; rx=&#34;3&#34; fill=&#34;#d0d7de&#34;/&gt;
  &lt;rect x=&#34;340&#34; y=&#34;214&#34; width=&#34;20&#34; height=&#34;6&#34; rx=&#34;3&#34; fill=&#34;#0969da&#34;&gt;&lt;animate attributeName=&#34;width&#34; values=&#34;20;170;20&#34; dur=&#34;3s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/rect&gt;

  &lt;rect x=&#34;322&#34; y=&#34;252&#34; width=&#34;206&#34; height=&#34;64&#34; rx=&#34;8&#34; fill=&#34;#ffffff&#34; stroke=&#34;#24292f&#34; stroke-width=&#34;1.5&#34;/&gt;
  &lt;text x=&#34;425&#34; y=&#34;274&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;qwen3-coder&lt;/text&gt;
  &lt;text x=&#34;425&#34; y=&#34;292&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;11&#34; fill=&#34;#57606a&#34;&gt;30B-A3B · INT4 · 16 GB&lt;/text&gt;

  &lt;g stroke=&#34;#24292f&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34;&gt;
    &lt;path d=&#34;M 425 140 V 164&#34;/&gt;
    &lt;path d=&#34;M 425 228 V 252&#34;/&gt;
    &lt;path d=&#34;M 528 284 H 590&#34;/&gt;
  &lt;/g&gt;

  &lt;rect x=&#34;590&#34; y=&#34;120&#34; width=&#34;150&#34; height=&#34;130&#34; rx=&#34;12&#34; fill=&#34;#f6f8fa&#34; stroke=&#34;#24292f&#34; stroke-width=&#34;1.5&#34;/&gt;
  &lt;rect x=&#34;590&#34; y=&#34;120&#34; width=&#34;150&#34; height=&#34;130&#34; rx=&#34;12&#34; fill=&#34;none&#34; stroke=&#34;#0969da&#34; stroke-width=&#34;2&#34;&gt;&lt;animate attributeName=&#34;opacity&#34; values=&#34;0.3;1;0.3&#34; dur=&#34;2s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/rect&gt;
  &lt;text x=&#34;665&#34; y=&#34;146&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;12&#34; font-weight=&#34;600&#34; fill=&#34;#24292f&#34;&gt;RTX 5090&lt;/text&gt;
  &lt;g fill=&#34;#0969da&#34;&gt;
    &lt;rect x=&#34;612&#34; y=&#34;162&#34; width=&#34;20&#34; height=&#34;20&#34; rx=&#34;4&#34;/&gt;
    &lt;rect x=&#34;640&#34; y=&#34;162&#34; width=&#34;20&#34; height=&#34;20&#34; rx=&#34;4&#34;/&gt;
    &lt;rect x=&#34;668&#34; y=&#34;162&#34; width=&#34;20&#34; height=&#34;20&#34; rx=&#34;4&#34;/&gt;
    &lt;rect x=&#34;612&#34; y=&#34;190&#34; width=&#34;20&#34; height=&#34;20&#34; rx=&#34;4&#34;/&gt;
    &lt;rect x=&#34;640&#34; y=&#34;190&#34; width=&#34;20&#34; height=&#34;20&#34; rx=&#34;4&#34;/&gt;
    &lt;rect x=&#34;668&#34; y=&#34;190&#34; width=&#34;20&#34; height=&#34;20&#34; rx=&#34;4&#34;/&gt;
  &lt;/g&gt;
  &lt;text x=&#34;665&#34; y=&#34;238&#34; text-anchor=&#34;middle&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;11&#34; fill=&#34;#57606a&#34;&gt;32 GB&lt;/text&gt;

  &lt;path d=&#34;M 590 300 C 500 340, 320 340, 154 240&#34; fill=&#34;none&#34; stroke=&#34;#1a7f37&#34; stroke-width=&#34;2&#34; stroke-dasharray=&#34;6 4&#34;&gt;&lt;animate attributeName=&#34;stroke-dashoffset&#34; from=&#34;0&#34; to=&#34;-20&#34; dur=&#34;1.2s&#34; repeatCount=&#34;indefinite&#34;/&gt;&lt;/path&gt;
  &lt;text x=&#34;330&#34; y=&#34;362&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;11&#34; fill=&#34;#1a7f37&#34;&gt;tokens back to agents&lt;/text&gt;

  &lt;text x=&#34;24&#34; y=&#34;382&#34; font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34; font-size=&#34;11&#34; fill=&#34;#57606a&#34;&gt;kintsugi · Ubuntu · systemd restarts it on boot&lt;/text&gt;
&lt;/svg&gt;

&lt;h2 id=&#34;what-bit-us&#34;&gt;
  What bit us
  &lt;a class=&#34;heading-link&#34; href=&#34;#what-bit-us&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Everything looked simple until it ran. Four problems, each with a clear cause once we found it.&lt;/p&gt;


&lt;svg viewBox=&#34;0 0 760 500&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; role=&#34;img&#34; aria-label=&#34;Deployment problems and fixes&#34;&gt;
  &lt;rect width=&#34;760&#34; height=&#34;500&#34; fill=&#34;#ffffff&#34;/&gt;
  &lt;line x1=&#34;60&#34; y1=&#34;80&#34; x2=&#34;60&#34; y2=&#34;440&#34; stroke=&#34;#d0d7de&#34; stroke-width=&#34;3&#34; pathLength=&#34;1&#34; stroke-dasharray=&#34;1 1&#34; stroke-dashoffset=&#34;1&#34;&gt;&lt;animate attributeName=&#34;stroke-dashoffset&#34; from=&#34;1&#34; to=&#34;0&#34; dur=&#34;1.6s&#34; fill=&#34;freeze&#34;/&gt;&lt;/line&gt;

  &lt;g font-family=&#34;ui-monospace,SFMono-Regular,Menlo,monospace&#34;&gt;
    &lt;!-- item 1 --&gt;
    &lt;circle cx=&#34;60&#34; cy=&#34;96&#34; r=&#34;16&#34; fill=&#34;#24292f&#34;/&gt;&lt;text x=&#34;60&#34; y=&#34;101&#34; text-anchor=&#34;middle&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#ffffff&#34;&gt;1&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;88&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#d1242f&#34;&gt;nvidia-smi fails&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;108&#34; font-size=&#34;12&#34; fill=&#34;#57606a&#34;&gt;cause: driver updated, kernel module stale, box up 10 days&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;126&#34; font-size=&#34;12&#34; fill=&#34;#1a7f37&#34;&gt;fix: reboot&lt;/text&gt;

    &lt;!-- item 2 --&gt;
    &lt;circle cx=&#34;60&#34; cy=&#34;196&#34; r=&#34;16&#34; fill=&#34;#24292f&#34;/&gt;&lt;text x=&#34;60&#34; y=&#34;201&#34; text-anchor=&#34;middle&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#ffffff&#34;&gt;2&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;188&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#d1242f&#34;&gt;unknown or invalid runtime name: nvidia&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;208&#34; font-size=&#34;12&#34; fill=&#34;#57606a&#34;&gt;cause: rootless vs system Docker; daemon.json not reloaded&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;226&#34; font-size=&#34;12&#34; fill=&#34;#1a7f37&#34;&gt;fix: target system daemon, systemctl restart docker&lt;/text&gt;

    &lt;!-- item 3 --&gt;
    &lt;circle cx=&#34;60&#34; cy=&#34;296&#34; r=&#34;16&#34; fill=&#34;#24292f&#34;/&gt;&lt;text x=&#34;60&#34; y=&#34;301&#34; text-anchor=&#34;middle&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#ffffff&#34;&gt;3&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;288&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#d1242f&#34;&gt;compressed-tensors does not match awq&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;308&#34; font-size=&#34;12&#34; fill=&#34;#57606a&#34;&gt;cause: model is INT4 compressed-tensors despite the AWQ name&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;326&#34; font-size=&#34;12&#34; fill=&#34;#1a7f37&#34;&gt;fix: drop --quantization awq, let vLLM read the config&lt;/text&gt;

    &lt;!-- item 4 --&gt;
    &lt;circle cx=&#34;60&#34; cy=&#34;396&#34; r=&#34;16&#34; fill=&#34;#24292f&#34;/&gt;&lt;text x=&#34;60&#34; y=&#34;401&#34; text-anchor=&#34;middle&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#ffffff&#34;&gt;4&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;388&#34; font-size=&#34;13&#34; font-weight=&#34;600&#34; fill=&#34;#d1242f&#34;&gt;17 GB of weights in a literal ~ dir&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;408&#34; font-size=&#34;12&#34; fill=&#34;#57606a&#34;&gt;cause: Compose does not expand ~ in volume paths&lt;/text&gt;
    &lt;text x=&#34;96&#34; y=&#34;426&#34; font-size=&#34;12&#34; fill=&#34;#1a7f37&#34;&gt;fix: mount ./.cache/huggingface relative to the project&lt;/text&gt;
  &lt;/g&gt;
&lt;/svg&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;nvidia-smi&lt;/code&gt; failed with a driver/library mismatch. The driver had been updated, the kernel module was stale, and the box had been up for ten days. Fix: reboot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;docker compose up&lt;/code&gt; died with &amp;ldquo;unknown or invalid runtime name: nvidia&amp;rdquo;. The box runs rootless Docker as the user context, but the systemd unit talks to the system daemon. The daemon had a daemon.json declaring the nvidia runtime that it was not loading. Fix: restart Docker and target the system daemon. Rootless Docker is not supported by this setup, and that is now documented.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vLLM crashed on startup: the model config says compressed-tensors, and I had forced &lt;code&gt;--quantization awq&lt;/code&gt;. The &amp;ldquo;AWQ&amp;rdquo; in the repo name lied. Fix: delete the flag and let vLLM read the config.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A few days in I found 17 GB of model weights inside a directory literally named &lt;code&gt;~&lt;/code&gt;. Compose does not expand &lt;code&gt;~&lt;/code&gt; in volume paths, so the cache mount created a literal directory. Fix: mount &lt;code&gt;./.cache/huggingface&lt;/code&gt;, which Compose resolves relative to the project. The cache is gitignored, so the repo stays clean.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;decisions-that-stuck&#34;&gt;
  Decisions that stuck
  &lt;a class=&#34;heading-link&#34; href=&#34;#decisions-that-stuck&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;System Docker, not rootless, for the service. The systemd unit runs compose as root, and rootless Docker ignores /etc/docker/daemon.json.&lt;/li&gt;
&lt;li&gt;compressed-tensors INT4 over a gated AWQ build and an FP8 build that does not fit.&lt;/li&gt;
&lt;li&gt;One model, no swap. A second model means a second compose service, not Ollama-style load and unload.&lt;/li&gt;
&lt;li&gt;Model cache in the repo under &lt;code&gt;.cache&lt;/code&gt;, so &lt;code&gt;git pull&lt;/code&gt; plus a restart updates the stack without re-downloading weights.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;where-it-landed&#34;&gt;
  Where it landed
  &lt;a class=&#34;heading-link&#34; href=&#34;#where-it-landed&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Public repo: &lt;a href=&#34;https://github.com/dashaun/rtx5090-vllm&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/dashaun/rtx5090-vllm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An OpenAI-compatible endpoint at &lt;code&gt;http://kintsugi:8000/v1&lt;/code&gt; serving &lt;code&gt;qwen3-coder&lt;/code&gt;. Point Spring AI or your favorite agent harness at it. Ollama is uninstalled and its ~94 GB of models are gone from the box.&lt;/p&gt;
&lt;p&gt;If you have outgrown Ollama, clone it and take it for a spin. The setup script is the whole story: one command, reboot safe.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>