Local FLUX.1-schnell GGUF GPU Optimization | Generated by AI

Home 2026.07

Comprehensive Summary

What We Set Out To Do

The user wanted to run FLUX.1-schnell (a 12B parameter text-to-image model) locally using a quantized GGUF model — specifically flux1-schnell-Q4_0.gguf from Hugging Face. Initial inference on CPU took 526 seconds (~8 min 47 sec) per image at 1024×1024. The goal was to get this running on their RTX 4070 (12 GB VRAM) GPU.


Step-by-Step Work

1. Environment Discovery

2. Download Script

Wrote download_model.sh — a standalone bash script using curl/wget to download the GGUF model. The model was already present, so the script would skip automatically.

3. Initial CPU Run & Bottleneck Analysis

Running sd-cli on CPU showed:

Stage Time Details
Text encoding (CLIP) 2.2s Tiny, negligible
Flux transformer (57 blocks, 16384 tokens) ~487s Main bottleneck — 12B params × 4 steps
VAE decode 37s Small model (95 MB) but huge activations (6.6 GB)
Total 526s 8 min 47 sec

Core issue: even Q4 quantized, the Flux transformer is a massive compute workload. The RTX 4070 was sitting idle while the CPU ground through it.

4. CUDA Rebuild

Found the system had:

Rebuilt with:

cmake -S . -B build -DSD_CUDA=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build -j

Verified the binary linked against libcudart, libcublas, and libcuda.

5. VRAM Contention & Resolution

First attempt (--backend cuda): Flux transformer loaded on GPU (6389 MB), but the VAE compute buffer (6657 MB) couldn’t allocate — cudaMalloc: out of memory.

Root cause: llama-server was using ~5.9 GB of VRAM, leaving only ~4 GB free.

Fixes applied:

  1. Killed llama-server to free VRAM (now ~9.8 GB free)
  2. Backend splitting--backend "diffusion=cuda,clip=cpu,vae=cpu,t5xxl=cpu" kept Flux on GPU, everything else on CPU
  3. This worked: Flux diffusion in 12.8s on GPU, VAE decode in 35.4s on CPU → total 48.6s

Second optimization--vae-tiling: splits VAE decode into tiles, reducing compute buffer from 6.6 GB → 416 MB. This allowed VAE to also run on GPU:

VAE decode:  35.4s (CPU)  →  2.7s (GPU, tiled)
Total:       48.6s        →  15.8s

6. Run Script

Wrote run.sh — a polished bash script with:

7. Version Control

Committed and pushed all changes:

fb4093d  Add download and run scripts for FLUX.1-schnell Q4_0 GGUF
f778e25  Rebuild sd_cpp with CUDA, update run.sh for GPU inference (33x speedup)

Final Performance

Metric CPU GPU (this setup) Speedup
Flux diffusion 487s 12.8s 38×
VAE decode 37s 2.7s 14×
Text encoding 2.2s 0.3s
End-to-end 526s ~16s 33×

Memory: ~8.8 GB VRAM used (Flux 6.4 GB + VAE tiled 0.4 GB + compute ~2.4 GB), fitting comfortably in the 12 GB RTX 4070.

Known Issue

t5xxl_fp16.safetensors reports data offsets out of bounds for one tensor. The model works without T5 (prompt adherence is degraded). Re-download from comfyanonymous/flux_text_encoders to fix.

Final Files

File Purpose
download_model.sh Downloads the GGUF model
run.sh Full GPU-accelerated generation script
sd_cpp/build/bin/sd-cli CUDA-enabled inference binary

Generated by AI. Curating and sharing still takes effort. If you find it useful, feel free to donate. WeChat: @lzwjavaWeChat QR · X: @lzwjava · Say hi 👋

Back Donate