Qwen-Image-2.1 adalah model gambar dengan bobot terbuka yang dirilis Alibaba pada 20 September 2026: generator 7B-parameter yang menangani teks-ke-gambar, pengeditan dengan hingga 10 gambar referensi, dan output transparan (RGBA) bawaan. Panduan ini akan membawa Anda dari pip install ke endpoint HTTP yang berfungsi. Ini mencakup empat jalur kode referensi dari GitHub README, pengaturan yang penting, pembungkus FastAPI kecil agar model dapat dipanggil seperti API gambar lainnya, dan cara menguji endpoint tersebut di Apidog sehingga perubahan prompt dan pembaruan model tidak merusak aplikasi Anda.
Jika Anda ingin latar belakangnya terlebih dahulu, Apa itu Qwen-Image-2.1 mencakup arsitektur dan lisensinya. Versi singkat lisensi: hanya untuk penelitian dan penggunaan non-komersial kecuali Anda mendapatkan perjanjian komersial terpisah dari Qwen. Semua yang ada di bawah ini baik untuk evaluasi.
Sebelum Anda memulai
| Persyaratan | Detail |
|---|---|
| Paket Python | torch>=2.4.0, transformers>=5.17, diffusers dari GitHub main, accelerate, pillow |
| Kelas Pipeline | QwenImage21Pipeline (satu kelas untuk generasi dan pengeditan) |
| Bobot | Qwen/Qwen-Image-2.1, bf16 safetensors |
| GPU | Tidak ditentukan oleh Qwen; kode referensi menargetkan satu perangkat CUDA dalam bfloat16, dengan enable_model_cpu_offload() sebagai cadangan |
| Output default | 2048 x 2048; 40 langkah inferensi |
| Opsional | Model penulisan ulang prompt Qwen-Image-2.1-PE-T2I / PE-I2I |
Instal:
pip install "torch>=2.4.0" "transformers>=5.17" accelerate pillow
pip install git+https://github.com/huggingface/diffusers
Integrasi diffusers masuk dalam PR khusus pada hari peluncuran, jadi rilis PyPI yang lebih lama dari 20 September tidak akan memiliki kelas pipeline tersebut.
Langkah 1: teks-ke-gambar
import torch
from diffusers import QwenImage21Pipeline
pipe = QwenImage21Pipeline.from_pretrained(
"Qwen/Qwen-Image-2.1", torch_dtype=torch.bfloat16
).to("cuda")
image = pipe(
prompt='A neon shop sign that reads "QWEN IMAGE 2.1", rainy night, reflections on wet pavement',
num_inference_steps=40,
generator=torch.Generator("cuda").manual_seed(42),
).images[0]
image.save("t2i_example.png")
Dua hal yang perlu diperhatikan. Prompt menempatkan teks tanda kutip; rendering teks Qwen adalah alasan orang memilih jajaran model ini, dan mengutip string literal adalah konvensi dari rilis sebelumnya. Dan seed bersifat eksplisit. Pertahankan seperti itu di setiap permintaan yang ingin Anda uji, karena seed tetap adalah yang membuat endpoint gambar cukup dapat direproduksi untuk ditegaskan.
Lewatkan width dan height dari tabel yang didukung saat Anda membutuhkan output non-persegi:
| Rasio | Ukuran |
|---|---|
| 1:1 | 2048 x 2048 |
| 4:3 / 3:4 | 2400 x 1792 / 1792 x 2400 |
| 3:2 / 2:3 | 2528 x 1696 / 1696 x 2528 |
| 16:9 / 9:16 | 2752 x 1536 / 1536 x 2752 |
Langkah 2: output transparan
Transparansi digerakkan oleh prompt. Frasa yang direkomendasikan README adalah literal, jadi gunakanlah:
image = pipe(
prompt=(
"This is an RGBA image with transparency. A cute cartoon dragon sticker. "
"The image has alpha channel and the background is transparent."
),
num_inference_steps=40,
generator=torch.Generator("cuda").manual_seed(42),
).images[0]
image.save("transparent_example.png")
Periksa hasilnya daripada mempercayainya begitu saja:
assert image.mode == "RGBA", image.mode
alpha = image.getchannel("A")
print("transparent pixels:", sum(1 for p in alpha.getdata() if p == 0))
Penegasan itu adalah tes pertama yang akan Anda porting ke Apidog nanti. Model yang secara diam-diam mengembalikan RGB saat Anda meminta RGBA adalah bug yang akan ditemukan pengguna Anda sebelum Anda menemukannya.
Langkah 3: pengeditan, dengan satu gambar atau hingga sepuluh
Pipeline yang sama mengedit saat Anda melewatkan image:
from PIL import Image
input_image = Image.open("input.png")
edited = pipe(
prompt="Change the background to a sunset beach",
image=input_image,
num_inference_steps=40,
generator=torch.Generator("cuda").manual_seed(42),
).images[0]
edited.save("edit_example.png")
Untuk beberapa referensi, lewati daftar (batas posting peluncuran adalah 10):
refs = [Image.open(f"ref_{i}.png") for i in range(3)]
result = pipe(
prompt="These three characters are sitting around a campfire in a forest",
image=refs,
num_inference_steps=40,
generator=torch.Generator("cuda").manual_seed(42),
).images[0]
result.save("multi_ref_example.png")
Pengeditan lokal bekerja dalam tiga cara di postingan peluncuran: lingkaran berwarna yang Anda referensikan berdasarkan warna dalam prompt, anotasi yang dilukis, atau gambar asli yang tidak tersentuh ditambah gambar mask terpisah yang dilewatkan sebagai dua input. README tidak menyertakan contoh mask khusus, jadi bentuk dua input adalah yang pertama dicoba: image=[original, mask] dengan prompt yang menjelaskan apa yang ada di wilayah bertopeng [VERIFIKASI terhadap README setelah contoh mask tersedia].
Pengeditan juga merupakan tempat kerja kecepatan 2.1 terlihat. Gambar referensi dan instruksi bersifat statis di seluruh langkah denoising, sehingga model menghitung cache key-value mereka sekali dan menggunakannya kembali. Sepuluh referensi membutuhkan biaya yang jauh lebih sedikit daripada sepuluh kali satu.
Langkah 4: sesuaikan dengan GPU Anda
Qwen belum mempublikasikan angka VRAM. Jika pipeline bf16 tidak muat, README menawarkan:
pipe = QwenImage21Pipeline.from_pretrained("Qwen/Qwen-Image-2.1", torch_dtype=torch.bfloat16)
pipe.enable_model_cpu_offload()
Untuk penyajian, README menunjuk ke vLLM-Omni (dengan FP8), SGLang, dan LightX2V. ComfyUI memiliki dukungan asli dengan alur kerja template jika Anda lebih suka tidak menulis Python sama sekali. Dan jika Anda tidak memiliki GPU, opsi gratis mencakup demo yang di-host dan Qwen Chat.
Langkah 5: bungkus sebagai API HTTP
Kode aplikasi seharusnya tidak mengimpor diffusers. Letakkan pipeline di belakang layanan kecil agar memiliki kontrak yang dapat Anda versi, mock, dan uji. Pembungkus FastAPI ini sekitar 40 baris dan mengembalikan byte PNG:
# server.py
import io, torch
from fastapi import FastAPI, UploadFile, File, Form
from fastapi.responses import Response
from PIL import Image
from diffusers import QwenImage21Pipeline
app = FastAPI()
pipe = QwenImage21Pipeline.from_pretrained(
"Qwen/Qwen-Image-2.1", torch_dtype=torch.bfloat16
).to("cuda")
SIZES = {"1:1": (2048, 2048), "16:9": (2752, 1536), "9:16": (1536, 2752)}
@app.post("/v1/images")
async def generate(
prompt: str = Form(...),
aspect: str = Form("1:1"),
transparent: bool = Form(False),
seed: int = Form(42),
steps: int = Form(40),
references: list[UploadFile] = File(default=[]),
):
if transparent and not prompt.startswith("This is an RGBA image"):
prompt = ("This is an RGBA image with transparency. " + prompt +
" The image has alpha channel and the background is transparent.")
refs = [Image.open(io.BytesIO(await f.read())) for f in references[:10]]
w, h = SIZES.get(aspect, SIZES["1:1"])
kwargs = dict(prompt=prompt, num_inference_steps=steps,
generator=torch.Generator("cuda").manual_seed(seed))
if refs:
kwargs["image"] = refs if len(refs) > 1 else refs[0]
else:
kwargs.update(width=w, height=h)
image = pipe(**kwargs).images[0]
buf = io.BytesIO()
image.save(buf, format="PNG")
return Response(buf.getvalue(), media_type="image/png",
headers={"X-Image-Mode": image.mode, "X-Seed": str(seed)})
Jalankan dengan uvicorn server:app --port 8000. Dua header respons, X-Image-Mode dan X-Seed, ada agar pengujian dapat memeriksa transparansi dan reproduktifitas tanpa mendekode PNG. Itu satu-satunya pilihan spesifik produk dalam pembungkus; sisanya adalah endpoint multipart biasa.
Langkah 6: uji endpoint di Apidog
Sekarang ini adalah API, dan disiplin yang sama yang akan Anda terapkan pada API gpt-image-2.5 atau API Nano Banana 2 berlaku di sini. Di Apidog:
- Buat endpoint sebagai
POST {{base_url}}/v1/imagesdengan badan multipart:prompt,aspect,transparent,seed,steps, dan bidang filereferencesyang dapat diulang. Letakkanbase_urldalam lingkungan sehingga koleksi yang sama menunjuk ke laptop Anda, kotak GPU, atau mock. - Kirim permintaan teks-ke-gambar dengan
seed=42dan prompt tanda neon. Konfirmasi200,Content-Type: image/png, danX-Image-Mode: RGB. - Tambahkan penegasan di post-processor: status adalah 200,
X-Image-Modesama denganRGBAketikatransparent=true, ukuran badan respons di atas batas bawah (PNG 2K yang kembali sebesar 2 KB adalah gambar kosong), danX-Seedmengulang apa yang Anda kirim. - Kirim kasus transparansi dan pengeditan tiga referensi dengan cara yang sama, melampirkan gambar di bidang file. Simpan masing-masing sebagai kasus uji.
- Jalankan sebagai skenario uji sesuai jadwal atau di CI. Ketika Anda menukar dengan build terkuantisasi atau 2.2 di masa mendatang, suite akan memberi tahu Anda dalam hitungan menit apakah transparansi masih berfungsi dan apakah seed masih mereproduksi.
- Mock itu saat GPU sedang sibuk. Mock cerdas Apidog mengembalikan PNG kalengan untuk kontrak yang sama, sehingga frontend terus membangun.
Karena Apidog juga menghasilkan spesifikasi dan dokumen OpenAPI dari endpoint yang Anda definisikan, kontrak pembungkus menjadi dapat dibagikan saat berfungsi. Unduh Apidog dan impor endpoint di atas untuk memulai.
Opsional: penulisan ulang prompt dengan PE-T2I
Demo Space mengubah permintaan satu baris menjadi prompt terstruktur panjang menggunakan Qwen-Image-2.1-PE-T2I, Qwen3.5-VL 9B yang telah disetel halus yang mengembalikan JSON dengan prompt Bahasa Inggris yang diperluas dan rasio aspek yang direkomendasikan. Jalankan sebagai layanan kedua di depan /v1/images, atau lewati saja dan tulis sendiri prompt lengkapnya. Jika Anda menambahkannya, uji secara terpisah: ini adalah API teks dengan kontrak JSON, dan penulis ulang yang rusak menghasilkan gambar yang buruk yang terlihat seperti bug generator.
FAQ
Apakah satu pipeline melakukan generasi dan pengeditan? Ya. QwenImage21Pipeline menghasilkan saat dipanggil hanya dengan prompt dan mengedit saat Anda melewatkan image (satu gambar PIL tunggal atau daftar hingga 10).
Bagaimana cara mendapatkan PNG transparan? Mulai prompt dengan "This is an RGBA image with transparency" (Ini adalah gambar RGBA dengan transparansi) dan katakan bahwa latar belakangnya transparan. Periksa image.mode == "RGBA" pada hasilnya.
Apa pengaturan yang direkomendasikan? 40 langkah inferensi dan bfloat16, sesuai README. Nilai panduan tidak tercantum untuk 2.1; rilis Qwen-Image sebelumnya menggunakan true_cfg_scale=4.0, jadi coba itu jika output terlihat kurang terpandu [VERIFIKASI].
Bisakah ini digunakan dalam produk komersial? Tidak di bawah lisensi default. Qwen-Image-2.1 didistribusikan di bawah Lisensi Penelitian Qwen; penggunaan komersial memerlukan lisensi terpisah dari Qwen. Detailnya di Apa itu Qwen-Image-2.1.
Apakah ada API yang di-host sebagai gantinya? Qwen Image 3.0 dan 3.0 Pro adalah model gambar yang di-host oleh Alibaba dengan harga per gambar. Perbandingan 2.1 vs 3.0 mencakup kapan harus melakukan self-host dan kapan harus menyewa.
Ke mana selanjutnya
Anda sekarang memiliki empat panggilan yang berfungsi, pembungkus dengan kontrak yang stabil, dan rangkaian pengujian yang memeriksa dua properti terpenting untuk model ini, transparansi dan reproduktifitas. Selanjutnya, putuskan apakah lisensi penelitian sesuai dengan penggunaan Anda, atau apakah API 3.0 yang di-host adalah pilihan yang lebih baik, dan simpan keduanya di belakang koleksi Apidog yang sama sehingga perubahan hanya pada URL dasar, bukan penulisan ulang.
