Hybrid GPU + RAM · DIY build
RTX 3090 (used) + 128 GB DDR5 on AM5 (MoE offload)
Budget MoE offload: a used 3090 holds attention and KV cache while 128 GB of desktop DDR5 holds the experts, enough for ~100B-class MoE models at 4-bit.
Memory for models
VRAM
Memory bandwidth
Parts
used GPU price not included
gpt-oss-20b, 4-bit
Parts
| Part | Qty | Each |
|---|---|---|
| GPUNVIDIA GeForce RTX 3090 (used) | 1 | not priced |
| CPUAMD Ryzen 9 9950X (16-core, 170 W) | 1 | ~$649 |
| MotherboardASUS TUF GAMING X870E-PLUS WIFI7 | 1 | ~$325 |
| RAMCorsair Vengeance 128GB (2x64GB) DDR5-6400 CL42 + HX1200i 1200 W PSU bundle | 1 | ~$3,084 |
| PSUCorsair HX1200i (1200 W), included in the RAM bundle above | 1 | ~$0 |
| CaseCorsair 7000D AIRFLOW full tower (450 mm GPU clearance, 8 slots) | 1 | ~$290 |
| StorageCorsair MP600 CORE XT 2TB PCIe 4.0 NVMe | 1 | ~$485 |
| Priced parts only | $4,833used GPU price not included | |
New parts are priced at the maker’s own store or list price. Used cards have no price here yet, and a total with a missing GPU would understate the build, so none is shown.
What it runs at 4-bit
Every model in the catalog at its 4-bit file with 8,192 tokens of context. 31 of 41 fit. Speeds are the median of measured runs on the same GPUs where any exist; otherwise an estimate from memory bandwidth. Try other quants and context lengths.
| Model | Needs | Fit | Generation speed |
|---|---|---|---|
| Kimi K32.8T, 104B active · UD-Q4_K_XL | 1406.8 GBcontext memory estimated | Does not fit | |
| DeepSeek V4 Pro1.6T, 49B active · Q4_K_M | 890.5 GBcontext memory not counted | Does not fit | |
| Kimi K2.61T, 32B active · UD-Q4_K_XL | 545.7 GBcontext memory estimated | Does not fit | |
| DeepSeek V4.1 Flash552B, 16B active · Q4 (DwarfStar) | 484.5 GB | Does not fit | |
| GLM-5.3753.3B · UD-Q4_K_XL | 437.4 GBcontext memory estimated | Does not fit | |
| DeepSeek V3.2671B, 37B active · Q4_K_M | 379.6 GBcontext memory estimated | Does not fit | |
| MiniMax M3428B, 23B active · Q4_K_M | 244.8 GBcontext memory not counted | Does not fit | |
| Qwen3.5 397B-A17B397B, 17B active · Q4_K_M | 229.1 GBcontext memory estimated | Does not fit | |
| GLM-5.3 Flash320B, 18B active · UD-Q4_K_XL | 187.6 GBcontext memory estimated | Does not fit | |
| Hy3295B, 21B active · Q4_K_M | 173.6 GB | Does not fit | |
| MiniMax M2.7228.7B · Q4_K_M | 132.7 GB | GPU + RAM offloadassumed limit | – |
| Qwen3.8 Flash-Next125B, 6B active · Q4_K_M | 113.1 GBcontext memory estimated | GPU + RAM offloadassumed limit | ~5.4–7.9 tok/sestimate, part in RAM |
| Nemotron 3 Super 120B-A12B120B, 12B active · Q4_K_M | 82.6 GBcontext memory estimated | GPU + RAM offloadassumed limit | ~3.9–5.7 tok/sestimate, part in RAM |
| Qwen3.5 122B-A10B122B, 10B active · Q4_K_M | 73.0 GBcontext memory estimated | GPU + RAM offloadassumed limit | ~5.6–8.2 tok/sestimate, part in RAM |
| Mistral Medium 3.5 128B128B · Q4_K_M | 74.0 GB | GPU + RAM offloadassumed limit | ~0.9–1.4 tok/sestimate, part in RAM |
| GLM-4.5-Air106B, 12B active · Q4_K_M | 70.9 GB | GPU + RAM offloadassumed limit | ~4.3–6.2 tok/sestimate, part in RAM |
| Mistral Small 4 119B (2603)119B, 6.5B active · Q4_K_M | 69.3 GBcontext memory estimated | GPU + RAM offloadassumed limit | ~9.1–13 tok/sestimate, part in RAM |
| Llama 4 Scout 17B-16E Instruct109B, 17B active · Q4_K_M | 62.4 GBcontext memory not counted | GPU + RAM offloadassumed limit | ~3.7–5.4 tok/sestimate, part in RAM |
| gpt-oss-120b117B, 5.1B active · MXFP4 (native) | 60.2 GBcontext memory estimated | GPU + RAM offloadassumed limit | ~14–21 tok/sestimate, part in RAM |
| Qwen3 Coder Next80B, 3B active · Q4_K_M | 46.9 GBcontext memory estimated | GPU + RAM offloadassumed limit | ~25–36 tok/sestimate, part in RAM |
| Llama 3.3 70B Instruct70B · Q4_K_M | 43.6 GB | GPU + RAM offloadassumed limit | ~2.1–3.4 tok/sestimate, part in RAM |
| Nemotron 3.5 Lightning 30B-A3B30B, 3B active · Q4_K_M | 25.3 GBcontext memory estimated | GPU + RAM offloadassumed limit | ~64–93 tok/sestimate, part in RAM |
| Qwen3.6 35B-A3B35B, 3B active · Q4_K_M | 22.4 GBcontext memory estimated | Fits | ~122–178 tok/sestimate |
| Ornith 1.5 35B-A3B35B, 3B active · Q4_K_M | 21.9 GBcontext memory estimated | Fits | ~125–183 tok/sestimate |
| Qwen3 Coder 30B-A3B Instruct30.5B, 3.3B active · Q4_K_M | 19.5 GB | Fits | ~116–169 tok/sestimate |
| Gemma 4 31B IT30.7B · Q4_K_M | 18.9 GBcontext memory estimated | Fits | 35 tok/smedian of 1 run |
| Granite 4.2 30B29.3B · Q4_K_M | 20.3 GB | Fits | ~25–40 tok/sestimate |
| Qwen3.8 27B27B · Q4_K_M | 18.2 GBcontext memory estimated | Fits | ~26–41 tok/sestimate |
| Gemma 4 26B-A4B IT25.2B, 3.8B active · Q4_K_M | 17.4 GBcontext memory estimated | Fits | 119 tok/smedian of 1 run |
| Qwen3.6 27B27B · Q4_K_M | 17.7 GBcontext memory estimated | Fits | ~27–43 tok/sestimate |
| Devstral Small 2 24B (2512)24B · Q4_K_M | 16.1 GB | Fits | ~32–50 tok/sestimate |
| gpt-oss-20b21B, 3.6B active · MXFP4 (native) | 12.5 GBcontext memory estimated | Fits | 162 tok/smedian of 3 runs |
| Phi-414.7B · Q4_K_M | 11.3 GB | Fits | ~52–81 tok/sestimate |
| Ministral 3 14B Reasoning (2512)13.9B · Q4_K_M | 10.4 GB | Fits | ~56–87 tok/sestimate |
| Gemma 4 12B IT11.95B · Q4_K_M | 8.2 GBcontext memory estimated | Fits | ~64–101 tok/sestimate |
| Qwen3.5 9B9B · Q4_K_M | 7.0 GBcontext memory estimated | Fits | ~81–127 tok/sestimate |
| Granite 4.2 8B8.8B · Q4_K_M | 7.9 GB | Fits | ~83–130 tok/sestimate |
| Gemma 4 E4B IT8B · Q4_K_M | 6.5 GBcontext memory not counted | Fits | ~151–237 tok/sestimate |
| Qwen3 8B8.2B · Q4_K_M | 7.3 GB | Fits | 115 tok/smedian of 1 run |
| Llama 3.1 8B Instruct8B · Q4_K_M | 7.1 GB | Fits | 122 tok/smedian of 2 runs |
| Qwen3.5 4B4B · Q4_K_M | 4.3 GBcontext memory estimated | Fits | ~167–263 tok/sestimate |
Measured speeds
9 published runs with one user, plain decoding and at most 4,096 tokens already in context, on RTX 3090. Runs on 1x RTX 3090 (used) with the same GPUs count here too, and say so.
| Model | Quant | Backend | Generation | Prompt | Context | Measured on | Source |
|---|---|---|---|---|---|---|---|
| Gemma 4 26B-A4B IT | Q4_K | llama.cpp (build not stated) | 119 tok/s | 3,626 tok/s4,096-token prompt | 4,096 | RTX 3090 | review2026-03 |
| Gemma 4 31B IT | Q4_K | llama.cpp (build not stated) | 35 tok/s | 1,156 tok/s4,096-token prompt | 4,096 | RTX 3090 | review2026-03 |
| gpt-oss-20b | MXFP4 MoE | llama.cpp b6250 CUDA | 163 tok/s | 5,838 tok/s2,048-token prompt | 0 | RTX 3090 | llama.cpp benchmark discussion2025-08 |
| gpt-oss-20b | MXFP4 MoE | llama.cpp b6210 CUDA | 162 tok/s | 5,171 tok/s2,048-token prompt | 0 | RTX 3090 | llama.cpp benchmark discussion2025-08 |
| gpt-oss-20b | MXFP4 | llama.cpp (build not stated) | 148 tok/s | 4,400 tok/s4,096-token prompt | 4,096 | RTX 3090 | review2026-03 |
| gpt-oss-20b | MXFP4 MoE | llama.cpp b6250 CUDA | – | 57 tok/s2,048-token prompt | 0 | RTX 3090 | llama.cpp benchmark discussion2025-08 |
| Llama 3.1 8B Instruct | Q4_K_M | llama.cpp b11741 | 147 tok/s | – | 0 | RTX 3090 | review2026-10 |
| Llama 3.1 8B Instruct | Q4_K_M | LocalScore (llamafile; version not stated) | 96 tok/s | 3,550 tok/s | 0 | RTX 3090 | LocalScore2026-10 |
| Qwen3 8B | Q4_K | llama.cpp (build not stated) | 115 tok/s | 4,050 tok/s4,096-token prompt | 4,096 | RTX 3090 | review2026-03 |
With speculative decoding
A small draft model or extra prediction heads guess several tokens ahead. Generation is faster on text the guesses get right, so these are kept out of the medians above.
| Model | Quant | Backend | Generation | Prompt | Context | Measured on | Source |
|---|---|---|---|---|---|---|---|
| Gemma 4 31B IT | AutoRound INT4 (int4_per_token_head KV) | vLLM v0.28.0 (patched) | 79 tok/s | – | 0 | RTX 3090 | independent benchmark2026-09 |
| Gemma 4 31B IT | AutoRound INT4 (int4_per_token_head KV) | vLLM v0.28.0 (patched) | 35 tok/s | – | 0 | RTX 3090 | independent benchmark2026-09 |
| Qwen3.8 27B | UD-Q4_K_M | llama.cpp b11382 (Windows CUDA 13) | 56 tok/s | – | 0 | RTX 3090 | independent benchmark2026-10 |
Many users at once
Total throughput with several requests in flight. One person chatting sees far less than this.
| Model | Quant | Backend | Generation | Prompt | Context | Measured on | Source |
|---|---|---|---|---|---|---|---|
| Qwen3.8 27B | UD-Q4_K_M | llama.cpp b11382 (Windows CUDA 13)4 requests at once | 38 tok/s | 1,073 tok/s12,000-token prompt | 0 | RTX 3090 | independent benchmark2026-10 |
Deep into a long context
Measured with more than 4,096 tokens already in context, where every new token also reads the context memory.
| Model | Quant | Backend | Generation | Prompt | Context | Measured on | Source |
|---|---|---|---|---|---|---|---|
| Gemma 4 26B-A4B IT | Q4_K | llama.cpp (build not stated) | 115 tok/s | 3,069 tok/s16,384-token prompt | 16,384 | RTX 3090 | review2026-03 |
| Gemma 4 26B-A4B IT | Q4_K | llama.cpp (build not stated) | 108 tok/s | 2,453 tok/s32,768-token prompt | 32,768 | RTX 3090 | review2026-03 |
| Gemma 4 31B IT | Q4_K | llama.cpp (build not stated) | 34 tok/s | 913 tok/s16,384-token prompt | 16,384 | RTX 3090 | review2026-03 |
| Gemma 4 31B IT | Q4_K | llama.cpp (build not stated) | 31 tok/s | 724 tok/s32,768-token prompt | 32,768 | RTX 3090 | review2026-03 |
| gpt-oss-20b | MXFP4 | llama.cpp (build not stated) | 129 tok/s | 3,244 tok/s16,384-token prompt | 16,384 | RTX 3090 | review2026-03 |
| gpt-oss-20b | MXFP4 | llama.cpp (build not stated) | 113 tok/s | 2,547 tok/s32,768-token prompt | 32,768 | RTX 3090 | review2026-03 |
| Qwen3 8B | Q4_K | llama.cpp (build not stated) | 88 tok/s | 2,573 tok/s16,384-token prompt | 16,384 | RTX 3090 | review2026-03 |
| Qwen3 8B | Q4_K | llama.cpp (build not stated) | 68 tok/s | 1,715 tok/s32,768-token prompt | 32,768 | RTX 3090 | review2026-03 |
Specifications
- GPUs
- 1 × NVIDIA GeForce RTX 3090
- VRAM
- 24 GB
- System RAM
- 128 GB
- RAM bandwidth
- 2 channels x 6400 MT/s x 8 bytes = 102.4 GB/s (dual-channel AM5)
- Power supply
- 1200 W
- Estimated load
- RTX 3090 350 W + Ryzen 9 9950X 170 W + 100 W = 620 W
- Software
- CUDA, Vulkan
Before you build it
- llama.cpp keeps MoE expert weights in system RAM with --cpu-moe (all layers) or --n-cpu-moe N (first N layers), leaving attention and shared weights on the GPU.
- AM5 is dual-channel: ~102 GB/s here versus ~614 GB/s on 12-channel EPYC, so offloaded experts generate several times slower.
- Two 64 GB DIMMs keep the 128 GB at rated speed; ASUS notes supported data rate depends on the number of modules fitted.
- DDR5 prices are at shortage highs: Corsair lists a 64 GB (2x32) DDR5-6000 kit at $1,274.99, so RAM can cost more than a used GPU.
Sources
- shop-us-en.amd.com: price of AMD Ryzen 9 9950X (16-core, 170 W)
- eshop.asus.com: price of ASUS TUF GAMING X870E-PLUS WIFI7
- corsair.com: price of Corsair Vengeance 128GB (2x64GB) DDR5-6400 CL42 + HX1200i 1200 W PSU bundle
- corsair.com: price of Corsair 7000D AIRFLOW full tower (450 mm GPU clearance, 8 slots)
- corsair.com: price of Corsair MP600 CORE XT 2TB PCIe 4.0 NVMe
- raw.githubusercontent.com: gotcha source
- amd.com: gotcha source
- asus.com: gotcha source
- corsair.com: gotcha source
Compared with
Similar machines
- 1x RTX 3090 (used)~$2,944 + unpriced parts
- RTX 5090 + EPYC 9355P with 768 GB DDR5 (MoE offload)~$3,763 + unpriced parts
- Apple Mac Studio (M5 Max, 32-core GPU)~$2,499