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

01_hanfu

02_astronaut — seed 43 — 197.99 s

02_astronaut

03_taipei — seed 44 — 199.15 s

03_taipei

04_shiba — seed 45 — 197.85 s

04_shiba

05_ink — seed 46 — 202.10 s

05_ink

完整 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

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for HelloSun/Qwen-Image-2.1-Turbo-OpenVINO-INT4

Finetuned
(18)
this model