← Lab Notes

Running AI at Home: Qwen 3.5 on an Old PC With a Radeon RX 580

This week I set up an AI model that runs entirely on a computer in my house. There is no subscription, no API key, and nothing leaves my home network. I wanted to answer two questions. Can an old desktop with a graphics card from 2017 run a genuinely useful AI model? And can that model help keep this site in good shape for search engines? The answer to both is yes, with a few surprises along the way, including one about cost that I did not expect.

The Hardware

An XFX Radeon RX 580 graphics card with three black fans lying on an anti-static bag, ready to install.
The XFX Radeon RX 580 with 8 GB of video memory. This card does all of the AI work.

The whole build is a retired office desktop plus one graphics card:

  • Graphics card: XFX Radeon RX 580 with 8 GB of video memory (VRAM)
  • Processor: Intel Core i5-4440, 4 cores at 3.1 GHz, from 2013
  • Motherboard: ASUS H81M-PLUS
  • Memory: 16 GB of DDR3-1600 in two 8 GB sticks
  • Storage: 1 TB SSD
  • Power supply: 500 W

The number that matters most is VRAM. A model runs fast only when it fits entirely in the graphics card’s memory, and 8 GB is enough for a 9-billion-parameter model compressed to about 4 bits per weight. Once the model is loaded, the old processor barely matters, because the graphics card does nearly all of the math. The H81 board runs its graphics slot at PCIe 2.0 speed, but that only adds a few seconds when the model first loads.

ASUS UEFI BIOS EZ Mode screen for an H81M-PLUS motherboard showing an Intel Core i5-4440 CPU at 3.10 GHz and 16 GB of DDR3 1600 memory in two 8 GB Crucial sticks, with UEFI boot listed first.
The BIOS on the old desktop: a 2013 Core i5 and 16 GB of DDR3. Plenty for a machine whose main job is feeding the graphics card.

A few BIOS changes were needed before anything else worked. I set Secure Boot’s OS Type to Other OS, because the Linux installer on my USB stick refused to boot otherwise. I turned off Fast Boot, set the computer to power back on by itself after an outage, and, after installing the RX 580, switched the primary display from the motherboard’s video to the PCIe graphics card.

The Software

  • Fedora Server 44, installed without a desktop so the full 8 GB of VRAM goes to the model
  • Mesa RADV, the open-source Vulkan driver for AMD cards
  • Ollama, which downloads and runs AI models, using its Vulkan backend
  • Qwen 3.5 9B, an open model from Alibaba’s Qwen team that understands both text and images (about a 6 GB download)
  • Open WebUI, a ChatGPT-style chat interface, running in a Podman container that starts on boot
  • A small Python script on a systemd timer that does the nightly SEO work

The biggest catch with this card is that AMD’s ROCm toolkit, which most AI software uses on AMD hardware, no longer supports the RX 580’s Polaris chip. Vulkan, a graphics standard that nearly every GPU supports, works instead. Fedora Server’s minimal install did not include Vulkan at all, so I added the vulkan-loader and mesa-vulkan-drivers packages. After that, Ollama found the card right away. These are the Ollama settings I ended up with:

OLLAMA_VULKAN=1                # use the Vulkan backend
OLLAMA_FLASH_ATTENTION=1       # faster, leaner attention math
OLLAMA_KV_CACHE_TYPE=q8_0      # store conversation memory at half size
OLLAMA_CONTEXT_LENGTH=8192     # room for about 6,000 words per request

With those settings, the model loads at 5.6 GB, runs 100% on the graphics card, and writes roughly 9 words per second, a little faster than most people read. The full speed numbers are in the comparison tables at the end of this post.

For security, Ollama has no password, so it only listens on the machine itself. The chat interface is reachable only on my home network or through my home VPN. Nothing on the server is open to the internet.

What I Learned

Turn off thinking for simple jobs

Qwen 3.5 has a thinking mode where it drafts and checks its work before answering. On my first test, it spent about 1,500 tokens thinking before writing a two-sentence answer, which took around two minutes. With thinking off, the same answer took under 8 seconds and was just as good. Thinking is worth it for multi-step chemistry or physics problems, but not for short writing tasks.

Hidden settings can quietly slow everything down

Open WebUI admin Models page for qwen3.5:9b, showing the System Prompt box, Advanced Params, Capabilities, and Builtin Tools settings.
Every model in Open WebUI has its own system prompt, parameters, capabilities, and built-in tools.

My first chats took over 100 seconds each, and the stats showed about 4,100 tokens going into the model for a page that should have been about 1,400. When I sent the same page straight to Ollama, it took 23 seconds. The difference was Open WebUI’s Builtin Tools setting, which quietly adds instructions for web search, memory, and other tools to every message. Turning it off for my SEO model dropped each request to 1,430 tokens and 26 seconds.

Small models can’t count

I asked for meta descriptions between 140 and 155 characters. The model kept handing me 189 and 197. Small models think in word pieces, not letters, so exact lengths are hard for them. The fix was to let code do the counting. My script measures every description and, if it is too long, tells the model exactly how many words to cut. That works far better than repeating the rule.

Small models copy examples and make things up

When I put a sample description from my AP Chemistry 4.1 page in the instructions, the model started returning that sample almost word for word. Switching to an example from a different subject fixed it. It also invented a topic number, labeling a classroom strategies page as “AP Chemistry 4.1” even though no such number appears on the page. Now the script checks that any topic number in a description actually appears on the page.

Check the disk after installing Fedora Server

Fedora Server’s automatic setup gave the system only 15 GB of my 1 TB drive and left the rest unused. AI models are several gigabytes each, so I expanded the system volume to use the whole drive right after installing.

How I’m Using It on ZornScience

Open WebUI chat screen with the custom ZornScience SEO model selected and an empty message box ready for a page to describe.
My custom ZornScience SEO model: Qwen 3.5 9B with a low temperature, thinking turned off, and a system prompt full of meta description rules.

This site has nearly 600 pages, and many of them were missing a meta description, the short summary that appears under a page’s title in search results. Writing those by hand would take days. Now the server does it overnight.

Every night from midnight to 4 a.m., the script finds published English pages without a description and sends each page’s text to Qwen. It checks every result for length, banned words, em dashes, “coming soon” items, and invented topic numbers, then asks for a specific fix when something fails. Descriptions that pass every check are published. Anything that still fails is saved to a spreadsheet for me to review. The script never overwrites a description that already exists, and it uses its own WordPress account with limited permissions. Here is one it wrote:

AP Chemistry 4.1: learn how to tell physical from chemical changes using evidence like gas formation or color shifts. Free notes, slides, and worked examples.

Next, I plan to have it write image alt text (it can see images), Spanish descriptions for the pages under /es/, and summaries of my lesson screencasts. Claude still powers the tutor chatbot on this site and anything that needs careful judgment.

What It Costs

The two tables below compare one job: writing a meta description and an SEO title for every page and post on this site, about 600 in all, English and Spanish. To get a realistic page size, I ran 30 of my lesson pages from AP Chemistry, Chemistry, Physics, and Quantitative Skills through the same text cleanup my script uses. The average page came to about 1,800 tokens of text, ranging from about 1,200 to 2,400, and the instructions add about 360 more, so each request reads about 2,200 tokens. Electricity is figured at $0.19 per kilowatt-hour, a typical delivered rate for my area, with the server drawing about 50 W while idle and 190 W while working. Claude figures use the API prices for Claude Sonnet 5.5 at medium effort. These are estimates, not meter readings or bills.

Speed

Qwen 3.5 9B on my RX 580Claude Sonnet 5.5 (medium effort)
Reading a pageabout 63 tokens per second, so about 35 seconds for a 2,200-token requestnearly instant
Writingabout 12 tokens per secondseveral times faster
Thinking before answeringoffon, about 500 tokens per page
Time per pageabout 40 seconds (25 to 55 in real runs)about 10 seconds
Whole siteabout 7 hours, or 2 nights in my midnight to 4 a.m. windowabout 1.5 to 2 hours one page at a time, or usually under an hour with the Batch API

Cost

Qwen 3.5 9B on my RX 580Claude Sonnet 5.5 (medium effort)
Input, per million tokensabout $0.16 in electricity$2 ($1 with the Batch API)
Output, per million tokensabout $0.84 in electricity$10 ($5 with the Batch API)
Tokens per pageabout 2,200 in and 60 outabout 2,400 in and 600 out, mostly thinking
Cost per pageabout $0.0004 (1/25 of a cent)about $0.011 (about $0.0055 with the Batch API)
Fixed costabout $7 per month to keep the server on 24/7none
Total for SEO tags on the whole siteabout $0.25about $6.60 (about $3.30 with the Batch API)
Total including one month of keeping the server onabout $7.25about $6.60 (about $3.30 with the Batch API)
Local cost per page is the electricity used for about 40 seconds at full power. Qwen reuses the page it already read when it retries, so retries add only a few seconds. Claude counts include about 10% extra for retries.

Here is the surprise: for SEO alone, Claude is cheaper. Its total for the whole site, even without the Batch API discount, is less than one month of keeping this PC switched on. Time is the other big difference. Claude would finish the whole site in an afternoon, while my RX 580 needs two nights. Since those runs happen while I sleep, the slower speed costs me nothing in practice, and my own time reviewing flagged results is the same either way.

The local server still makes sense for me because SEO is not its only job. It gives me a private, always-on chat assistant, unlimited experiments without watching an API bill, a place to process anything I would rather not send to the cloud, and a second life for hardware that was sitting unused. If I only needed SEO tags, I would use Sonnet with the Batch API, or set the server to sleep during the day and wake up for its nightly run.

Not bad for a graphics card from 2017. I’ll share an update here in Lab Notes once it has worked through the backlog and started on alt text.


Want to say hi? Send me a note through the Contact page, or find more posts in Lab Notes.