Text-to-Image
Diffusers
Safetensors
image-to-image
quantization
w4a4
svdquant
gptq
nunchaku
8-bit precision
Instructions to use ModelsLab/Qwen-Image-2.1-W4A4-int4 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Diffusers
How to use ModelsLab/Qwen-Image-2.1-W4A4-int4 with Diffusers:
pip install -U diffusers transformers accelerate
import torch from diffusers import DiffusionPipeline # switch to "mps" for apple devices pipe = DiffusionPipeline.from_pretrained("ModelsLab/Qwen-Image-2.1-W4A4-int4", dtype=torch.bfloat16, device_map="cuda") prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" image = pipe(prompt).images[0] - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- Draw Things
- DiffusionBee
File size: 3,699 Bytes
117b828 141d236 117b828 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | ---
license: other
license_name: qwen-research
license_link: https://huggingface.co/Qwen/Qwen-Image-2.1/blob/main/LICENSE
base_model: Qwen/Qwen-Image-2.1
tags: [text-to-image, image-to-image, quantization, w4a4, svdquant, gptq, nunchaku]
pipeline_tag: text-to-image
---
# Qwen-Image-2.1 W4A4 (int4)
Built with Qwen.
> **Non-commercial use only.** An educational artifact under the Qwen Research License,
> which the base model carries. Commercial use needs a separate licence from the rights
> holder; publishing this here does not grant one.
4-bit weights, 4-bit activations, for the Qwen-Image-2.1 transformer. Calibrated with
SVDQuant, error-compensated with GPTQ, packed for Nunchaku's fused kernel.
**4.34 GB** against about 10 GB for the same layers in bf16.
The low-rank branch is fused into the 4-bit GEMM, which is where the speed comes from —
an unfused branch gives back 24–34% of it.
## Hardware
**sm_75 through sm_120** — Ada (4090, L40S) and Blackwell alike.
## Measured
| card | cap | seconds | vs bf16 | resident GB | LPIPS vs bf16 |
|---|---|---|---|---|---|
| RTX 4090 48GB | sm_89 | 11.576 | 1.84x | 21.35 | 0.231 |
| RTX PRO 6000 Max-Q | sm_120 | 37.616 | 0.35x | 21.29 | 0.1836 |
40 steps, 1024×1024, seed 42, six prompts. LPIPS is AlexNet against the bf16 image of
the same prompt on the same card.
**GPTQ is worth 6% here**:
0.1946 with round-to-nearest against **0.1836** with GPTQ, at the same
speed, the same file size and the same resident memory — it only changes which grid point
each weight lands on.
Read LPIPS as distance from the bf16 trajectory, not as damage. On a dense-text prompt
every build renders the text correctly while scoring 0.24–0.35, and on one prompt the
bf16 reference garbles a sign that this checkpoint renders correctly — and is scored
worse for it.
Only the transformer is quantized. The Qwen3-VL text encoder stays bf16 and is about
16.3 GB of a 21.5 GB resident total, so it, not this file, decides how many reference
images fit on a card.
## Text accuracy against bf16
The nvfp4 build of this same recipe scored 15/16 against bf16's 14/16 on a reference-free seed sweep (8 seeds, two text prompts, text read against the prompt) — indistinguishable. This int4 build was not put through that sweep; its LPIPS is 0.1836 against the nvfp4 build's 0.1425, so treat it as the same recipe at slightly lower fidelity, on the far wider set of cards it runs on.
## Requirements
Packed for a specific kernel. The layout is an MMA fragment swizzle, so a different
Nunchaku build may read it incorrectly — and would produce a wrong image rather than an
error. The loader checks and warns.
```
torch==2.12.1
nunchaku==1.3.0.dev20260306+cu13.0torch2.12
```
## Loading
```python
import torch
from diffusers import QwenImage21Pipeline
from quantize import nunchaku_io
transformer = nunchaku_io.load_checkpoint(precision="int4", device="cuda")
pipe = QwenImage21Pipeline.from_pretrained(
"Qwen/Qwen-Image-2.1", torch_dtype=torch.bfloat16, transformer=transformer)
```
`nunchaku_io` and the build pipeline: https://github.com/ModelsLab/qwen-image-2-1-server
## How it was built
Smoothing factors from real activation statistics (SmoothQuant, α=0.5), a rank-128 SVD
branch kept in bf16, and the residual rounded onto Nunchaku's grid by GPTQ against a
calibration Hessian. One Hessian pass, 128 distinct inputs across 224 layers, 24 GB
resident, ~5 minutes.
`w4a4_build.json` records the whole build, including per-layer GPTQ statistics.
## License
Derivative of [Qwen/Qwen-Image-2.1](https://huggingface.co/Qwen/Qwen-Image-2.1) under the
**Qwen Research License Agreement** — non-commercial only. See `NOTICE`.
|