Alibaba Qwen Releases Qwen-Image-2.1: A 7B Open-Weight Model for Image Generation and Editing


Alibaba’s Qwen team has released Qwen-Image-2.1, a unified text-to-image generation and image editing model. Its visual generation component has 7B parameters across 32 single-stream DiT layers. One checkpoint covers text-to-image, multi-reference editing, local edits, and transparent RGBA output.

Is it deployable? Yes, for research and evaluation. Day 0 support covers Diffusers, ComfyUI, vLLM-Omni, SGLang, and LightX2V. Commercial deployment needs a separate license from Qwen.

From 20B to 7B

The original Qwen-Image shipped in August 2025 as a 20B model under Apache 2.0. Editing lived in a separate Qwen-Image-Edit checkpoint. Qwen-Image-2.1 folds both jobs into one model at about a third of the size. Qwen team calls it the most balanced and cost-effective model in the Qwen-Image series. One important thing to note here for capacity planning: the 7B figure covers the diffusion transformer only. The pipeline also loads an 8B Qwen3-VL encoder.

Architecture

The GitHub Repo lists 4 components:

  • Transformer: 32 layers, 7B parameters, single-stream design with block-causal attention.
  • Text encoder: Qwen3-VL 8B, which encodes text instructions and condition images into one representation.
  • VAE: 64-channel RGBA autoencoder with 16x spatial compression and native transparency.
  • Scheduler: Flow Matching with Euler discrete scheduling and dynamic shifting.

The attention mask is where the speed comes from. Text tokens use a token-level causal mask. Image tokens use a chunk-level bidirectional mask within each image. Qwen calls this mixed-granularity attention. The condition prefix sits before the noisy latent, so it never attends to it. Its keys and values therefore stay fixed across denoising steps. The model computes text and input images once, at the first step. It reuses that prefix KV cache for every remaining step. Savings grow with the number of reference images, which explains the multi-image speed claim.

What It Can Do

  • Native transparency: Generates RGBA images from text, edits transparent layers, and extracts subjects from photos. Qwen recommends a fixed prompt template for transparent output.
  • Multi-reference editing: Accepts up to 10 reference images. README examples include a group photo from 6 portraits and an outfit from 5 references.
  • Local control: Edits can target regions using circles, painted annotations, or separate masks. Identity is preserved for people and products.
  • Native 2K: Defaults to 2048 x 2048, with 7 supported aspect ratios up to 2752 x 1536.
  • Aesthetics: Improved typography, portrait lighting, and fine detail. Qwen highlights panoramas, infographics, storyboards, and virtual try-ons.

Benchmark: Qwen’s Own Chart

The research team compares models on Qwen-Image-Bench, Qwen’s in-house benchmark. On that chart, Qwen-Image-2.1 scores 60.28 overall. That places it above Nano Banana 2.0 at 59.82 and every listed open-weight model. FLUX 2 Max, a 32B open model, sits at 55.33. 6 closed models score higher, led by GPT Image 2.5 Sunburst at 67.01.

Interactive Explainer

“;toks.forEach(function(t){h+=’

‘+t[0]+’

‘});
toks.forEach(function(tq,q){h+=’

‘+tq[0]+’

‘;
toks.forEach(function(tk,k){var a=ok(q,k);h+=”})});
$(“#grid”).innerHTML=h;
$$(“.rowl”).forEach(function(r){var f=function(){selq=+r.dataset.q;drawMask()};r.addEventListener(“click”,f);r.addEventListener(“keydown”,function(e){if(e.key===”Enter”||e.key===” “){e.preventDefault();f()}})});
var t=toks[selq],seen=toks.filter(function(_,k){return ok(selq,k)}).map(function(x){return x[0]}),seesX=seen.some(function(s){return s[0]===”X”});
var msg;
if(mode===”full”){msg=”

Everything sees everything

“+t[0]+” attends to all 9 tokens, including the noisy latent X. Because X changes at every step, the prefix keys and values change too, so nothing can be cached.

“}
else if(t[2]===”x”){msg=”

“+t[0]+” is the image being denoised

It attends to “+seen.join(“, “)+”. The latent reads the full prefix and every patch of its own block, so it gets complete context from text and references.

“}
else{msg=”

“+t[0]+” is part of the prefix

It attends to “+seen.join(“, “)+”. It “+(seesX?”sees”:”never sees”)+” the noisy latent X, so its keys and values stay identical across all denoising steps. That is what makes the prefix KV cache valid.

“}
$(“#mexp”).innerHTML=msg;size()}
$$(“#seg button”).forEach(function(b){b.addEventListener(“click”,function(){$$(“#seg button”).forEach(function(x){x.classList.remove(“on”)});b.classList.add(“on”);mode=b.dataset.m;drawMask()})});
drawMask();

/* ———- panel 4: resolution + rgba ———- */
var ars=[[“1:1”,2048,2048],[“4:3”,2400,1792],[“3:4”,1792,2400],[“3:2”,2528,1696],[“2:3”,1696,2528],[“16:9”,2752,1536],[“9:16”,1536,2752]];
$(“#ar”).innerHTML=ars.map(function(a,i){return ‘‘}).join(“”);
function setAr(i){var a=ars[i],w=a[1],h=a[2],m=210,s=m/Math.max(w,h);var f=$(“#frame”);f.style.width=Math.round(w*s)+”px”;f.style.height=Math.round(h*s)+”px”;
$(“#px”).textContent=w+” x “+h;$(“#mp”).textContent=(w*h/1e6).toFixed(2)+” MP”;$(“#lat”).textContent=(w/16)+” x “+(h/16)}
$$(“#ar .chip”).forEach(function(c){c.addEventListener(“click”,function(){$$(“#ar .chip”).forEach(function(x){x.classList.remove(“on”)});c.classList.add(“on”);setAr(+c.dataset.i)})});
setAr(0);
var star=$(“#frame svg path”),dot=$(“#frame svg circle”);
$$(“#bg button”).forEach(function(b){b.addEventListener(“click”,function(){$$(“#bg button”).forEach(function(x){x.classList.remove(“on”)});b.classList.add(“on”);var f=$(“#frame”),v=b.dataset.b;
f.classList.toggle(“checker”,v===”checker”);f.style.background=(v===”checker”)?””:(v===”alpha”?”#000″:v);
if(v===”alpha”){star.setAttribute(“fill”,”#fff”);star.setAttribute(“stroke”,”#fff”);dot.setAttribute(“fill”,”#fff”)}else{star.setAttribute(“fill”,”url(#g)”);star.setAttribute(“stroke”,”#2B2A7A”);dot.setAttribute(“fill”,”#fff”)}})});
$(“#copy”).addEventListener(“click”,function(){var t=”This is an RGBA image with transparency. . The image has alpha channel and the background is transparent.”;
var done=function(){$(“#copy”).textContent=”Copied”;setTimeout(function(){$(“#copy”).textContent=”Copy”},1400)};
if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(t).then(done,done)}else{done()}});

/* ———- panel 5: ship ———- */
var V=[
[“ok”,”Allowed”,”The license grants a royalty-free, worldwide right to use, copy, modify, and distribute the model for non-commercial purposes, which it defines as research or evaluation.”],
[“stop”,”Needs a separate commercial license”,”Commercial use is not covered. Qwen asks teams to request a license at model-business@notice.qwencloud.com before shipping.”],
[“warn”,”Allowed for non-commercial use, with conditions”,”If you use the model or its outputs to build and release another AI model, show \u201cBuilt with Qwen\u201d or \u201cImproved using Qwen\u201d in its docs. You cannot use \u201cQwen\u201d as the primary product name.”],
[“warn”,”Allowed, with notices”,”Give recipients a copy of the license, mark files you changed, and keep the Qwen attribution notice in a Notice file. The non-commercial limit still applies.”]];
function verdict(i){var v=V[i];$(“#verdict”).innerHTML=”;size()}
$$(“.use”).forEach(function(u){u.addEventListener(“click”,function(){$$(“.use”).forEach(function(x){x.classList.remove(“on”)});u.classList.add(“on”);verdict(+u.dataset.u)})});
verdict(0);
size();
})();



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *