Instructions to use HelloSun/Qwen-Image-2.1-Turbo-OpenVINO-INT4 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Diffusers
How to use HelloSun/Qwen-Image-2.1-Turbo-OpenVINO-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("HelloSun/Qwen-Image-2.1-Turbo-OpenVINO-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
Qwen-Image-2.1-Turbo — OpenVINO INT4
將 Qwen/Qwen-Image-2.1-Turbo 轉換為 OpenVINO INT4 權重,並以純 CPU(無 GPU)實測出圖。
optimum-intel 匯出 → NNCF weight-only INT4 量化(耗時 120 s)→ FP16 46.35 GB → INT4 13.14 GB(↓ 71.6%,約 3.53×)。
Turbo 是 8 步蒸餾版:同樣架構、同樣 transformer 權重量級,但推理步數只有
Qwen/Qwen-Image-2.1-OpenVINO-INT4的 1/5。 本 repo 沿用同一套轉換管線與 model card 結構,方便兩個 repo 對照。
目錄
快速資訊
| 項目 | 內容 |
|---|---|
| 基座模型 | Qwen/Qwen-Image-2.1-Turbo |
| Pipeline | QwenImage21Pipeline |
| Scheduler | FlowMatchEulerDiscreteScheduler(shift=1.0、use_dynamic_shifting=false) |
| 取樣排程 | checkpoint 自帶 sample_sigmas(8 步),見下方「⚠️ 重要」 |
| 量化格式 | transformer、text_encoder、text_encoder_i2i → INT4;其餘(vision encoder、VAE)→ INT8 |
| 模型大小 | FP16 46.35 GB → INT4 13.14 GB(↓ 71.6%,約 3.53×) |
| 推論裝置 | CPU(OpenVINO CPU plugin,無需 GPU) |
| 推薦參數 | checkpoint 的 8 步排程、true_cfg_scale=1.0、1024×1024 |
| 轉換工具 | optimum-intel 2.3.0.dev0 / optimum 2.3.0 / OpenVINO 2026.4.0 / NNCF 3.4.0 |
特色
- 三個元件 INT4:Transformer 與兩個 Qwen3-VL text encoder 全部 INT4。
- **體積 ↓ 71.6%**:FP16 46.35 GB → INT4 13.14 GB(約 3.53×)。
- 8 步出圖:Turbo 蒸餾排程,實測 1024×1024 平均 200.5 s / 張(含文字編碼與 VAE decode)。
- 記憶體需求低:實測行程 RSS 峰值 39.4 GB(1024×1024)。
- 支援編輯能力:保留了 image-to-image 用的
text_encoder_i2i與vision_encoder。
⚠️ 重要:sample_sigmas 會被 optimum-intel 丟棄
Turbo 的 8 步排程存在 model_index.json 的 sample_sigmas。但 optimum-intel 的
OVDiffusionPipeline.__init__ 簽名沒有宣告這個欄位,from_pretrained 時它會被 config 過濾掉,
於是 QwenImage21Pipeline 退回 diffusers 預設的 40 步(約慢 5 倍)。
兩種解法(本 repo 範例皆已內建):
# 方式一:載入後重新註冊(推薦)
pipe.register_to_config(sample_sigmas=[1.0, 0.978453, 0.95418, 0.926626,
0.89508, 0.845148, 0.704534, 0.414568])
# 方式二:每次呼叫直接傳 sigmas
pipe(..., sigmas=[1.0, 0.978453, 0.95418, 0.926626, 0.89508, 0.845148, 0.704534, 0.414568])
安裝
pip install diffusers==0.41.0 transformers==5.10.4 tokenizers==0.22.2 huggingface-hub==1.33.0 \
optimum==2.3.0 "optimum-intel @ git+https://github.com/huggingface/optimum-intel@main" \
openvino==2026.4.0 nncf==3.4.0 torch pillow psutil
optimum-intel需用 git main(2.3.0.dev0):PyPI 上的 2.2.0 還沒有QwenImage21Pipeline支援。nncf只有重新量化時才需要。
快速開始
import json
import torch
from huggingface_hub import hf_hub_download
from optimum.intel import OVDiffusionPipeline
MODEL_ID = "HelloSun/Qwen-Image-2.1-Turbo-OpenVINO-INT4"
pipe = OVDiffusionPipeline.from_pretrained(MODEL_ID, compile=True)
# optimum-intel 會在載入時丟棄 sample_sigmas,這裡補回來(見上方說明)
index = json.loads(open(hf_hub_download(MODEL_ID, "model_index.json")).read())
pipe.register_to_config(sample_sigmas=index["sample_sigmas"])
image = pipe(
prompt="Astronaut in a jungle, cold color palette, muted colors, "
"detailed, 8k, photorealistic, cinematic lighting",
height=1024, width=1024,
true_cfg_scale=1.0,
generator=torch.Generator().manual_seed(43),
).images[0]
image.save("out.png")
完整可執行範例:inference_int4.py 批次生成 + benchmark:generate5.py
推論參數建議
| 參數 | 建議值 | 說明 |
|---|---|---|
| 取樣排程 | checkpoint 的 8 步 sample_sigmas |
需手動補回,見上方說明;不要改成 40 步 |
num_inference_steps |
不需傳入 | 有 sample_sigmas 時由排程長度決定步數 |
true_cfg_scale |
1.0 | CFG 關閉(Turbo 預設即為 1.0) |
shift |
取自 scheduler/scheduler_config.json |
不需手動傳入,載入時自動套用 |
height / width |
1024 | 實測解析度;記憶體需求隨解析度平方成長,見「已知限制」 |
compile=True |
開啟 | 編譯模型以取得較佳效能 |
範例結果
全部為 checkpoint 的 8 步排程 / true_cfg_scale 1.0 / 1024×1024 / CPU,seed 42–46 固定,可完全重現。
圖片為 outputs/*_1024.png,examples/*.png 是其 512px 縮圖(不是另以 512px 推理的結果,沒有對應耗時資料)。
| # | Prompt | Seed | 耗時 |
|---|---|---|---|
| 01_hanfu | Young Chinese woman in red Hanfu, intricate embroidery, …, photorealistic, ultra detailed, 8k | 42 | 205.51 s |
| 02_astronaut | Astronaut in a jungle, cold color palette, muted colors, …, cinematic lighting | 43 | 197.99 s |
| 03_taipei | Cyberpunk street in Taipei at night, heavy rain, neon signs 'TAIPEI' / '台北', … | 44 | 199.15 s |
| 04_shiba | Cute Shiba Inu wearing a tiny astronaut helmet, sitting in a field of sunflowers, … | 45 | 197.85 s |
| 05_ink | Traditional Chinese ink wash landscape, misty mountains, a small pagoda on a cliff, … | 46 | 202.10 s |
01_hanfu — seed 42 — 205.51 s
02_astronaut — seed 43 — 197.99 s
03_taipei — seed 44 — 199.15 s
04_shiba — seed 45 — 197.85 s
05_ink — seed 46 — 202.10 s
完整 prompt 見 outputs/prompts.txt。
效能實測摘要
完整逐 step 數據見 REPORT.md 與 outputs/benchmark.json。
測試環境
| 項目 | 內容 |
|---|---|
| CPU | Intel(R) Xeon(R) Platinum 8559C,2 sockets × 48 cores × 2 threads = 192 vCPU(96 實體核心) |
| CPU 額度 | cgroup 限制 16 vCPU(cpu.max = 1600000 100000),推論以 INFERENCE_NUM_THREADS=16 執行 |
| RAM | 2.0 TiB |
| 虛擬化 | KVM(完整虛擬化) |
| OpenVINO | CPU only,2026.4.0 |
| 設定 | checkpoint 8 步排程、true_cfg_scale=1.0、1024×1024、ov_config={"INFERENCE_NUM_THREADS": "16", "PERFORMANCE_HINT": "LATENCY"} |
總結
| 指標 | 數值 |
|---|---|
| 解析度 | 1024×1024 |
| 步數 | 8(checkpoint 排程) |
from_pretrained + compile=True |
13.57 s |
| 平均總耗時 | 200.52 s / 張 |
| 平均單步耗時 | 24.32 s |
| 最快 / 最慢 | 197.85 s / 205.51 s |
| 總計(5 張) | 1002.60 s |
| 記憶體高水位 | 39,383 MB |
⚠️ 本機只有 16 vCPU 額度,因此這些數字與
Qwen-Image-2.1-OpenVINO-INT4在 192 vCPU 全開下測得的 869.80 s / 張(40 步)不可直接比較。 這裡能確定的是:Turbo 的 8 步排程相對同架構 40 步的模型,步數只有 1/5。
模型大小
以下為 repo 內各元件的實際位元組數。
| 元件 | FP16 位元組 | INT4 位元組 | 精度 |
|---|---|---|---|
text_encoder |
15,139,605,623 | 4,259,878,131 | INT4 |
text_encoder_i2i |
15,139,621,158 | 4,259,890,456 | INT4 |
transformer |
14,232,597,886 | 3,699,895,692 | INT4 |
vision_encoder |
1,154,197,642 | 579,514,978 | INT8 |
vae_decoder |
506,932,109 | 254,170,298 | INT8 |
vae_encoder |
156,540,971 | 78,822,515 | INT8 |
processor |
19,252,936 | 11,429,972 | — |
| 合計 | 46,348,748,806 | 13,143,602,523 | ↓ 71.6%(3.53×) |
- INT8 部分(vision encoder + VAE)為 0.91 GB,佔 INT4 總量的 7%。
- 兩個 text encoder 各自 INT4 後仍有 4.26 GB,是整體壓縮率的主要限制來源。
- Turbo 的 checkpoint 只提供一份 Qwen3-VL text encoder 權重;optimum-intel 匯出時將它拆成
text_encoder(純文字)、text_encoder_i2i(帶影像輸入,編輯用)與vision_encoder(視覺塔)三張圖, 因此三者的權重來源相同,但張量簽名不同,不能刪掉其中任一個。
檔案結構
.
├── README.md # 本文件
├── REPORT.md # 完整轉換 + 實測報告
├── LICENSE # Qwen RESEARCH LICENSE AGREEMENT
├── model_index.json # diffusers pipeline 索引(含 Turbo 的 sample_sigmas)
├── openvino_config.json # OpenVINO 量化設定
├── inference_int4.py # 單張推論範例(含 sample_sigmas 補回邏輯)
├── generate5.py # 5 組 prompt 批次生成 + benchmark
├── quantize_int4.py # FP16 OV → INT4 OV 量化腳本
├── transformer/ # INT4 QwenImage21Transformer2DModel(32 層)
├── text_encoder/ # INT4 Qwen3VLForConditionalGeneration(文字)
├── text_encoder_i2i/ # INT4 第二 text encoder(編輯用)
├── vision_encoder/ # INT8 Qwen3-VL 視覺塔
├── processor/ # Qwen3VLProcessor + tokenizer(OpenVINO tokenizer)
├── vae_encoder/ # INT8 VAE encoder
├── vae_decoder/ # INT8 VAE decoder
├── scheduler/ # FlowMatchEulerDiscreteScheduler 設定
├── examples/ # 5 張展示圖(1024px 輸出的 512px 縮圖)
└── outputs/ # 5 張實測圖 + 3 個資料檔
├── *_1024.png # 主測組(5 張)
├── benchmark.json # 逐 step 耗時 + 記憶體 + 系統資訊
├── benchmark_quantization.json # 量化設定、各元件位元組數與耗時
└── prompts.txt # 5 組 prompt 與 seed
從零復現
# 1. 匯出 FP16 OpenVINO 模型(約 270 s)
optimum-cli export openvino \
-m Qwen/Qwen-Image-2.1-Turbo \
--task text-to-image \
--library diffusers \
--weight-format fp16 \
./qwen-image-2.1-turbo-ov-fp16
# 2. NNCF weight-only INT4 量化(約 120 s)
python quantize_int4.py
# 3. 單張推論
python inference_int4.py
# 4. 批次生成 5 組 + benchmark
python generate5.py
量化設定:
from optimum.intel.openvino.configuration import (
OVConfig, OVWeightQuantizationConfig, OVPipelineQuantizationConfig,
)
int4_config = OVWeightQuantizationConfig(
bits=4, sym=False, group_size=128,
group_size_fallback="adjust", ratio=1.0,
)
pipeline_config = OVPipelineQuantizationConfig(
quantization_configs={
"transformer": int4_config,
"text_encoder": int4_config,
"text_encoder_i2i": int4_config,
},
default_config=OVWeightQuantizationConfig(bits=8),
)
bits=4、sym=False→ 非對稱 4-bit weight-only 量化。group_size=128→ 每 128 個權重共用一組 scale / zero-point。group_size_fallback="adjust"→ 分組不整除時自動調整群組大小。ratio=1.0→ 全部權重都量化,不做混合精度保留。- 未被列出的元件(VAE、vision encoder)沿用
default_config的 INT8。
已知限制
- 需要 git 版 optimum-intel:
OVDiffusion21Pipeline支援在 PyPI 2.2.0 之後才加入,需安裝git+https://github.com/huggingface/optimum-intel@main(本 repo 實測版本2.3.0.dev0+90fc4de)。 - 需要 diffusers ≥ 0.41.0:
sample_sigmas(pipeline 設定取樣排程)自 diffusers 0.41.0 起才有。 sample_sigmas會被 optimum-intel 丟棄:未補回時會靜默地跑 40 步,詳見上方說明。- CPU 速度:1024×1024 / 8 步平均 200.5 s / 張(僅 16 vCPU 額度);全開 192 vCPU 的機器應明顯更快。
- 記憶體隨解析度平方成長:1024×1024 實測峰值 39.4 GB;本 repo 實測 2048×2048(Turbo model card 的
1:1 建議值)時峰值達 86–93 GiB,屬 attention 分數張量所致(32 heads × 16384² × fp32 ≈ 34 GiB/份),
在一般 64 GB 記憶體的機器上不建議使用;
INFERENCE_NUM_THREADS與INFERENCE_PRECISION_HINT=bf16都無法有效降低這個峰值。 - Turbo model card 建議 transformers ≥ 5.17.0:本 repo 實測用
transformers==5.10.4(optimum-intel 限制<5.11),Qwen3-VL text encoder 與 tokenizer 皆正常。 - VAE 警告:載入時會出現
The "scaling_factor" attribute is missing from the VAE ...提示, 為 optimum-intel 匯出與 diffusers 版本落差,不影響推論結果。 model_index.json未列出 text_encoder_i2i / vision_encoder:這兩個目錄存在於 repo 中但未在索引宣告, 屬 optimum-intel 匯出的已知落差。- examples/ 為縮圖:
examples/*.png是 1024px 輸出的 512px LANCZOS 縮圖,非重新推理。
授權與出處
- 來源模型:
Qwen/Qwen-Image-2.1-Turbo - 授權:
qwen-research(license: other),完整條款見LICENSE - 轉換:僅做格式轉換與權重量化,模型權重來自來源模型
使用本模型時請遵守來源模型的授權條款。
Made with OpenVINO + optimum-intel + NNCF




