Qwen-Image-2.1 on One A100: What I Could Count, and What the OCR Got Wrong
8.2 seconds for a 1024x1024 image at 20 steps, 56.5 GiB peak at 2048x2048, and thirty sign images I checked myself all carried the text I asked for — while Tesseract found it in twelve. Editing is the weak half: four of eight mask-free instructions were followed, and the median image changed 84% of its pixels.

Qwen-Image-2.1 on One A100: What I Could Count, and What the OCR Got Wrong
Qwen released Qwen-Image-2.1 on September 20: one checkpoint that both generates images and edits them, 33.1 GB of weights across a 7B generator, a Qwen3-VL encoder and a VAE. The license is qwen-research, not the Apache-2.0 of the first Qwen-Image — worth checking before it goes anywhere commercial.
I measured what can be counted on one A100 80GB: time, memory, whether the text I asked for actually appears, and how much of an image survives an edit. I did not score beauty or "instruction following" on a scale, because those need a human panel and I am one person.
Speed and memory
Prompt fixed, three seeds per cell, bf16, diffusers from git (0.41.0.dev0).
| Resolution | Steps | Median | Spread over 3 seeds | Per step |
|---|---|---|---|---|
| 1024×1024 | 20 | 8.2 s | 0.06 s | 0.41 s |
| 1024×1024 | 40 | 16.3 s | 0.08 s | 0.41 s |
| 2048×2048 | 20 | 43.6 s | 0.04 s | 2.18 s |
| 2048×2048 | 40 | 86.1 s | 0.05 s | 2.15 s |
Going from 20 to 40 steps almost exactly doubles the time, so the per-step cost is the number to carry: 0.41 s at 1K, 2.15–2.18 s at 2K. That figure is whole-pipeline time divided by steps, so it sits above the pure denoising cost. Four times the pixels costs 5.3 times the time. Peak allocation was 36.8 GiB at 1K and 56.5 GiB at 2K, and the model loads from local disk in about 10 seconds.
The text test, and why it needed three readers
The release highlights text rendering, which is the one quality claim I can check without judgment calls. I asked for ten signs with specific wording — OPEN 24 HOURS, Gate B12, SALE 70%, Cafe Aurora, PLATFORM 9, NO PARKING, Espresso 4.50, EXIT, Room 301, Fresh Bread Daily — three seeds each, 30 images, and counted how often the requested string came back.
| Reader | Signs with the full string |
|---|---|
Tesseract 4.1.1, --psm 6 | 12 / 30 |
| Tesseract, best of 4 preprocessings × 4 page-segmentation modes, chosen knowing the answer | 20 / 30 |
| GPT-5.6 Terra, vision, asked only to transcribe | 29 / 30 |
| Me, having opened all 30 | 30 / 30 |
The first number is not a result about the model. Tesseract read NO PARKING as rn PARKING and SALE 70% as SALE 10", on images where both phrases are rendered cleanly in a heavy sans serif.

The second row is not comparable to the others: it picks, for each image, whichever of 16 settings produced the answer, with the answer already known. The vision model got one transcription per image and missed one, reading the stylised percent sign on a SALE 70% as 70 7%.
The last row is mine. I opened all 30: the ten Tesseract failed one at a time, the other twenty as 2×2 contact sheets. Every one carried the text I asked for, including a script face for Cafe Aurora and a decimal price. That is a claim about text a person can read, not about how good the images are, and the three-reader gap is the reason this section exists at all: when the grader is weaker than the thing it grades, the number describes the grader. I nearly published 40%.
Editing keeps the layout and rewrites the surface
The same pipeline takes an image argument, which is how the model card does editing: pass the source and write the instruction as the prompt. I generated a red mug on a wooden table, then gave four instructions, two seeds each, 40 steps.
| Instruction | Followed | Median PSNR vs source | Pixels changed |
|---|---|---|---|
| make the mug blue | 2 / 2 | 12.2 | 86% |
| write the word MORNING on the mug | 2 / 2 | 14.3 | 80% |
| add a small green plant next to the mug | 0 / 2 | 14.8 | 80% |
| remove the mug from the table | 0 / 2 | 12.2 | 84% |
Colour changes and added text worked, and MORNING came out crisp on both seeds. Adding an object failed both times — one run put a smear of green inside the mug instead of a plant beside it. Removal failed differently: on one seed the mug simply stayed, on the other it turned into a washed-out, semi-transparent ghost of itself.

The pixel numbers say the rest. Across the eight edits the changed-pixel ratio had a median of 84% and a mean of 82%, ranging from 71% to 91%, with PSNR against the source between 10.8 and 15.8. Looking at them, the composition survives — same framing, same table, mug in the same place — while the texture and tone are redrawn. On one seed the mug itself came back as a different mug, straight-sided instead of round. In these eight mask-free runs, the untouched parts of the photograph did not stay untouched. The model card also offers local edits through circles, painted annotations or a separate mask, which I did not test — so the finding is not "this model cannot edit", it is "a sentence alone buys no guarantee that the rest stays put".
What to take from this
- Budget 0.41 s per step at 1K and 2.15 s at 2K on an A100. A 40-step 2K image is 1 minute 26 seconds. Fewer steps is the lever I measured; batching is not.
- 56.5 GiB peak at 2K means a 48 GiB card will not hold this at that resolution in bf16 without offloading.
- Text rendering is genuinely good on short sign-like strings, which is what I tested. Long paragraphs are a different question and I did not test them.
- Check sentence-only edits before trusting them. Colour and text landed on both seeds here; adding or removing an object failed all four times, and the rest of the frame moved with it. Mask-based editing is untested.
- Check the licence.
qwen-researchis not Apache-2.0.
What this does not show
One prompt family per test, 30 sign images and 8 edits, one card, one dtype. Beauty, prompt adherence on complex scenes, and the RGBA and multi-reference features went untested. The edit numbers compare whole images, not the region an instruction points at, so they mix intended change with drift. And the gap between three readers over four grading conditions means every OCR-scored image benchmark deserves the same question: who read it?
Setup: Qwen/Qwen-Image-2.1, bf16, diffusers 0.41.0.dev0, torch 2.13.0+cu126, one A100 80GB PCIe, driver 535. Generation: fixed prompt, seeds 1–3. Text test: 10 phrases × 3 seeds, 1024×1024, 40 steps; a match means the requested string, uppercased and reduced to A–Z, 0–9, % and the decimal point, appears inside the transcription — containment, not full-string equality. Edit test: one source image per seed, four instructions, 40 steps; PSNR and changed-pixel ratio computed over the whole image, a pixel counted as changed when any channel moves more than 16/255. Measured on 2026-09-23.
Subscribe to Newsletter
Related Posts

llama.cpp -ctk and -ctv: The Default CUDA Build Supports Four Values
llama-bench accepts eight KV cache types and llama-server accepts nine, but the default CUDA build compiles FlashAttention kernels for only f16, bf16, q8_0 and q4_0, and only when K and V match. Every other setting has no kernel and prefills at 83-284 tokens per second against about 4,600. Measured on llama.cpp 69320fe on an A100.

Same Model, Five Ways to Build the Input: Only Retrieval Moved It Significantly
On BANKING77 with GPT-5.6 Terra held fixed, reordering labels, grouping them and changing reasoning effort each moved one or two items in both directions against the baseline, with no significant paired difference. Attaching five retrieved training examples scored 146 of 154, fixing 19 items and breaking none (exact McNemar p about 3.8e-6).

Jev's Speed Claims: Benchmarking Label-Only Alternatives on BANKING77
Four ways to get only a label on BANKING77's 77-intent test set, compared on the same 154 messages. Pretrained MiniLM embeddings with a logistic regression reached 90.3% accuracy at a 6.8 ms median on CPU. Jev itself has not been measured yet.