DOCEO LAB · Local AI · Test #002

Can Qwen3 4B Run on a 3GB GPU?

Qwen3 4B runs on this 3 GB GTX 1060, but not fully on the GPU. We measured how active context changes runtime size, GPU offload and generation throughput.

UPDATED SEP 18, 2026 · MEASURED · TESTED
E—DOCEO VERIFIED
Reproduced by E—DOCEO on September 18, 2026 on the documented Windows test machine. Qwen3 4B was measured at 4096, 2048 and 1024 active context, including repeated API generation runs and Ollama placement checks.
E—DOCEO VERIFIED · SEP 18, 2026
12.16median tok/s · context 4096
43–47%GPU placement observed
3 GBGTX 1060 VRAM

Result

Yes, Qwen3 4B Q4_K_M ran on this GTX 1060 3GB system, but Ollama did not place the complete runtime on the GPU. At an active context of 4096, ollama ps reported a 3.5 GB runtime size and 57%/43% CPU/GPU placement. Three generation runs measured 11.97, 12.16 and 12.26 tok/s, for a 12.16 tok/s median.

Reducing active context changed the placement. At 2048, Ollama reported 3.2 GB and 55%/45% CPU/GPU. At 1024 it reported 3.1 GB and 53%/47% CPU/GPU. In this environment, smaller context therefore coincided with a smaller reported runtime and a modestly larger GPU share.

KEY FINDING
The downloaded model was listed at 2.5 GB, yet the active runtime was reported as 3.5 GB at context 4096. A model file being smaller than nominal VRAM does not guarantee that the complete inference runtime will fit on the GPU.

Test environment

Component Recorded configuration
Test date September 18, 2026
OS Windows 10 Pro, build 19045
CPU AMD Ryzen 5 2600, 6 cores / 12 threads
RAM 31.9 GB
GPU NVIDIA GeForce GTX 1060 3GB
GPU memory 3072 MiB
NVIDIA driver 577.00
CUDA version reported by nvidia-smi 12.9
Driver model WDDM
Ollama 0.34.2

Model configuration

The tested local tag was qwen3:4b, ID 359d7dd4bcda. ollama show qwen3:4b reported architecture qwen3, 4.0B parameters, Q4_K_M, embedding length 2560 and model context length 262144. ollama ls reported a 2.5 GB downloaded model.

The model also exposed completion, tools and thinking capabilities. For this benchmark, thinking was explicitly disabled with think: false so the request measured ordinary generation under the same prompt structure used in Lab #001.

Method

The same prompt was used throughout:

Explain in about 150 words what a local large language model is and give three practical reasons for running one locally.

Requests used Ollama's local POST /api/generate endpoint with stream: false, think: false and temperature: 0. The only intentional variable in the context experiment was num_ctx: 4096, 2048 or 1024.

Generation throughput was calculated from the API timing fields:

generation tok/s = eval_count / (eval_duration / 1e9)

We recorded ollama ps after loading each context configuration to capture the runtime size, processor split and active context. nvidia-smi snapshots recorded total system GPU memory, not isolated per-model allocation.

Context size changed runtime size and GPU placement

Active context ollama ps size Processor placement Median generation
4096 3.5 GB 57% CPU / 43% GPU 12.16 tok/s
2048 3.2 GB 55% CPU / 45% GPU 13.25 tok/s
1024 3.1 GB 53% CPU / 47% GPU 13.49 tok/s

Across these measurements, reducing active context from 4096 to 1024 changed reported GPU placement from 43% to 47%. The median generation rate was about 10.9% higher at 1024 than at 4096 in this small test set.

That does not mean “smaller context is always 10.9% faster.” Context capacity itself is useful, the sample is small, output lengths varied, and other systems may choose different placement. The measured result is narrower: on this machine and Ollama version, context configuration affected reported runtime size and offload.

Recorded generation runs

Context Run Output tokens Generation Total request Load
4096 1 608 11.97 tok/s 64.764 s 13.663 s
4096 2 567 12.16 tok/s 46.832 s 3.22 ms
4096 3 567 12.26 tok/s 46.349 s 2.68 ms
4096 median 12.16 tok/s 46.832 s
2048 1 506 13.25 tok/s 43.680 s 5.253 s
2048 2 506 13.28 tok/s 43.367 s 5.004 s
2048 3 499 12.91 tok/s 38.849 s 2.68 ms
2048 median 13.25 tok/s 43.367 s
1024 1 534 13.67 tok/s 44.539 s 5.253 s
1024 2 514 12.20 tok/s 42.327 s 3.23 ms
1024 3 514 13.49 tok/s 38.286 s 2.63 ms
1024 median 13.49 tok/s 42.327 s

The load column is retained because the test sequence included both cold/reload and warm requests. Generation tok/s is the primary throughput metric; total request time should not be read as a pure generation benchmark when load overhead differs.

Freeing Windows VRAM: an A/B observation

At context 4096, an initial idle snapshot showed 921 MiB / 3072 MiB in use before loading Qwen. After loading/inference, snapshots showed approximately 2381–2393 MiB total GPU memory in use, while ollama ps reported 57%/43% CPU/GPU.

We then stopped the model, closed several ordinary desktop applications and reduced idle GPU memory to 525 MiB / 3072 MiB — 396 MiB lower. Reloading the same model at context 4096 produced:

State Idle GPU memory Loaded/post-run GPU memory ollama ps placement Generation
Normal desktop 921 MiB ~2381–2393 MiB 57% CPU / 43% GPU 12.16 tok/s median across original 3 runs
Reduced desktop load 525 MiB 1967 MiB 57% CPU / 43% GPU 11.73 tok/s, 1 run

Freeing 396 MiB of idle GPU memory did not change the processor split in this single A/B reload. This does not prove that free VRAM never affects Ollama placement; it only records that this particular reduction was not enough to change the reported 57%/43% split.

What this test tells us

First, download size and runtime memory are different quantities. The 2.5 GB local model produced a 3.5 GB runtime size at context 4096 according to ollama ps.

Second, “runs on a 3 GB GPU” needs qualification. Qwen3 4B did run, but it used partial CPU/GPU offload, unlike the smaller Gemma 3 1B in Lab #001, which Ollama reported at 100% GPU.

Third, active context belongs in VRAM planning. On the same machine and model, changing only num_ctx from 4096 to 1024 reduced reported runtime size from 3.5 GB to 3.1 GB and increased the reported GPU share from 43% to 47%.

Reproduce the 4096-context test

PowerShell
$body = @{
    model  = "qwen3:4b"
    prompt = "Explain in about 150 words what a local large language model is and give three practical reasons for running one locally."
    stream = $false
    think  = $false
    options = @{
        temperature = 0
        num_ctx = 4096
    }
} | ConvertTo-Json

$r = Invoke-RestMethod -Method Post -Uri http://localhost:11434/api/generate -ContentType "application/json" -Body $body

ollama ps nvidia-smi

[math]::Round($r.eval_count / ($r.eval_duration / 1e9), 2)

Change only num_ctx to 2048 or 1024 to reproduce the context comparison. Record ollama ps after each reload rather than assuming the processor split remains unchanged.

Limitations

This is a single-machine, single-day test with Ollama 0.34.2, one Qwen3 tag, one quantization and a GTX 1060 3GB under Windows/WDDM. Three generation measurements per context are enough to expose the observed pattern, but not enough to characterize all performance variance.

The output token counts were not identical between every run despite temperature: 0, so the medians should be treated as practical measurements rather than laboratory-grade deterministic benchmarks. The VRAM A/B comparison has only one reduced-desktop generation run. nvidia-smi memory values are aggregate system snapshots.

Documentation and model references

Related