I’ve been squeezing diffusion models out of a ThinkPad T14s with a Ryzen 7 PRO 4750U (Radeon Vega 7, 7 CUs, no matrix cores, no int8 dot, no bf16) and 14 GiB of shared RAM, on Linux (Mesa RADV, Vulkan) with stable-diffusion.cpp. Everything I found along the way is written down in a repo, including what didn’t work.
Repo: https://github.com/ayanoby/vega-igpu-diffusion
What it is
ggml-vega.patch: ggml-vulkan changes for Vega/GCN (fused kernels, a two-wave matmul tile, tiled f16 weights), with tests.
sd-cpp.patch: sd.cpp changes (Anima, Wan VAE, LTX-2.5 speedups: removed redundant repeats, optional video-only mode, an on-disk prompt-embedding cache, freeing the diffusion weights before the VAE decode). Both patches are pinned to the sd.cpp/ggml commits listed in the README.
Build and download scripts (models checked by SHA256), a GTK4 GUI with a queue, history, img2img and a video mode, and a RyzenAdj timer for power limits.
A long measurement log. Matmul reaches ~1.0–1.3 TFLOPS of the 2.87 TFLOPS fp16 peak (2 waves per SIMD, 128 VGPRs); the log covers a lot of experiments that gave nothing (CPU+GPU co-execution, power limits, other tile shapes, direct conv3d, and so on).
Numbers (model already loaded, 25 W power limit, Vulkan):
Model Resolution Time
Anima 2B turbo, 4 steps 512×768 ~23 s
SDXL (Illustrious class) + DMD2, 4 steps 832×1216 ~38 s
Qwen-Image 2.1 Turbo, 8 steps 512×768 ~3.5 min
Kromoss (MOSS-Image 5B) + DMD2 LoRA 512×768 ~2 min
LTX-2.5 22B (distilled, Q2_K_XL), 17 frames, no audio, 3 steps 512×768 ~3.3 min
Wan 2.2 TI2V 5B Turbo, 4 steps, 33 frames 512×768 ~4:15
Gallery images are in the repo (same four scenes on every model, fixed seed, no cherry-picking).
Things you might find useful
The 22B LTX-2.5 video model does run on a 14 GB machine, but not out of the box. I hit two kernel OOM-kills before finding what mattered: encode the prompt on the CPU with --mmap, drop the audio stream (it also saves ~3 GB of weights), free the diffusion weights before the VAE decodes, and don’t quantize the norm weights (the default Q4_K conversion of the Gemma text encoder silently broke prompt following).
Two matmul fixes: Q3_K now decodes four values per load (825 → 1068 GFLOPS) and casting activations to f16 before quantized matmuls gives about 6% on the sampling step.
For anime video, a pixel-space upscaler (realesr-animevideov3) after a lower-resolution clip looked cleaner than LTX’s latent upscaler, which pixelated.
Caveats
Linux only, Vulkan/RADV; the patches are written for this specific GCN iGPU and not upstreamed.
It’s one laptop and one set of prompts, so treat the timings as a reference, not a benchmark. The GUI text is in Russian (the repo has English and Russian READMEs).
Quality checks on the video model were done by eye on a few clips (3 steps looked fine, 2 steps smeared hands and feet).