Diffusers documentation
Nunchaku Lite
Nunchaku Lite
Nunchaku Lite は、Diffusers で事前量子化されたチェックポイントをロードするための量子化バックエンドです。互換性のあるチェックポイントは diffuse-compressor で作成します。transformer を量子化してエクスポートし、Diffusers パイプラインとしてパッケージングします。
Nunchaku Liteは、元のNunchaku推論エンジン、DeepCompressor量子化ライブラリ、およびSVDQuant論文を基盤としています。
CUDAカーネルをインストールします
kernels パッケージは、最適化された CUDA カーネルを提供します。このパッケージは自動的に読み込まれるため、最初にインストールしてください。
pip install -U kernels
Nunchaku Lite は、rootonchair/nunchaku-lite-kernels リポジトリからカーネルを読み込みます。このリポジトリの公開者は、Hub 上で信頼できるカーネル公開者ではありません。読み込み時に Hub からコードをダウンロードして実行するため、Diffusers では DIFFUSERS_TRUST_REMOTE_KERNELS=true を設定して明示的にオプトインする必要があります。詳細は リモートカーネルの信頼 を参照してください。
量子化されたパイプラインを読み込む
config.jsonから量子化設定を読み込む from_pretrained() を使用して、プリクオンタイズされたパイプラインを読み込みます。
import torch
from diffusers import DiffusionPipeline
model_id = "rootonchair/ERNIE-Image-Turbo-nunchaku-lite-nvfp4"
pipe = DiffusionPipeline.from_pretrained(
model_id, dtype=torch.bfloat16,
).to("cuda") # or "mps", "xpu", "cpu"
prompt = "A modern red armchair in a quiet studio, soft window light, realistic product photography"
image = pipe(
prompt=prompt,
height=1024,
width=1024,
num_inference_steps=8,
guidance_scale=1.0,
).images[0]
image.save("ernie-image-turbo-nunchaku-lite.png")エクスポートされた state dict は、ターゲットの Diffusers モデルのアーキテクチャと完全に一致する必要があります。例えば、融合された QKV 投影で量子化されたチェックポイントは、個別の Q、K、V 投影モジュールを想定するモデル設定には読み込めません。
サポートされている量子化タイプ
Nunchaku Lite は、以下の量子化された線形レイヤーの形式をサポートしています。
Blackwell GPU では
nvfp4を使用してください。Blackwell 上でint4チェックポイントを動作させると、nvfp4よりも遅くなる場合があります。
現在、CUDAカーネルは以下のNVIDIA GPUアーキテクチャをサポートしています:
sm_75(Turing、例: RTX 2080)sm_80(Ampere、A100 など)sm_86(Ampere、例: RTX 3090 および RTX A6000)sm_89(例:RTX 4090 の Ada)sm_120(Blackwell、例: RTX 5090)
sm_90H100やH200などのHopper GPUは、現在サポートされていません。
nvfp4 チェックポイントには、Blackwell 以降の NVIDIA GPU が必要です。Blackwell GPU を使用する場合、PyTorch >= 2.7 と CUDA >= 12.8 を使用してください。int4 チェックポイントには、Turing 以降の NVIDIA GPU が必要です。
| メソッド | 精度 | グループサイズ | 注記 |
|---|---|---|---|
svdq_w4a4 | nvfp4 | 16 | SVDQ低ランク補正を用いたNVFP4ランタイムカーネルを使用します。 |
svdq_w4a4 | int4 | 64 | SVDQ低ランク補正を用いたINT4 W4A4カーネルを使用します。 |
awq_w4a16 | int4 | 64 | INT4の重み専用AWQスタイルのカーネルを使用します。 |
NunchakuLiteQuantizationConfig
config.json には NunchakuLiteQuantizationConfig を含める必要があります。これにより、実行時の compute_dtype と、各 Nunchaku Lite 量子化手法のターゲットモジュールが定義されます。
compute_dtype: 量子化モジュール内の浮動小数点バッファのランタイム dtype。通常はtorch.bfloat16です。svdq_w4a4:precision、group_size、rank、targetsを持つ SVDQ W4A4 ターゲット設定。awq_w4a16:precision、group_size、targetsを持つ AWQ W4A16 ターゲット設定。
targets の各エントリは、線形層を指す必要があります。Diffusers は、各 svdq_w4a4 ターゲットを SVDQ W4A4 層に、各 awq_w4a16 ターゲットを AWQ W4A16 層に置き換えます。以下の例は、ターゲットリストを短縮した状態で、期待される形状を示しています。
svdq_w4a4 または awq_w4a16 の下に、量子化したい各モジュールを列挙してください。モジュールは1つの手法のみを使用できるため、同じターゲットを両方に列挙しないでください。
{
"_class_name": "ErnieImageTransformer2DModel",
"quantization_config": {
"quant_method": "nunchaku_lite",
"compute_dtype": "bfloat16",
"svdq_w4a4": {
"precision": "nvfp4",
"group_size": 16,
"rank": 32,
"targets": ["layers.0.self_attention.to_q"]
},
"awq_w4a16": {
"precision": "int4",
"group_size": 64,
"targets": ["final_linear"]
}
}
}融合カーネル
元のNunchakuエンジンは、モデル固有の融合実行パスによって大幅な高速化を実現しています。Q、K、Vの射影をRMSNormおよびRoPEと組み合わせ、MLPには融合されたGELUカーネルを使用します。一方、Nunchaku Liteは標準的なDiffusersモデルと汎用的な量子化線形層を使用するため、これらの融合は含まれていません。
以下の測定結果は、Flux Schnell を RTX 5090 で使用して、元の Nunchaku エンジンにおけるこれらの融合によるステップごとのレイテンシへの影響を示しています。
| 最適化 | OFF時のレイテンシ | ON時のレイテンシ | 高速化 |
|---|---|---|---|
| QKV+norm+RoPEの融合(統合) | 1.057 s | 0.834 s | 1.27× |
| — Q/K/V を 1 つの matmul にまとめる、単独 | 1.059 s | 1.034 s | 1.025× |
| — グルーピングの上にRMSNorm+RoPEエピローグ融合 | 1.034 s | 0.836 s | 1.236× |
| GELU-MLPの融合 | 0.766 s | 0.722 s | 1.06× |
これらの融合がない場合、GPU は projection、normalization、rotary-embedding、MLP の各操作を個別のカーネルとして起動するため、起動オーバーヘッドが発生します。torch.compile はこのオーバーヘッドの一部を軽減する可能性がありますが、元のエンジンの融合カーネルを必ずしも再現するわけではありません。対象のモデルとワークロードに対して、コンパイル済みパイプラインのベンチマークを実行してください。
torch.compile
Nunchaku Lite カーネルと量子化された線形層は、torch.compileと互換性があります。
パイプラインを読み込んだ後に量子化されたTransformerをコンパイルすると、推論が高速化されます。
pipe.transformer = torch.compile(pipe.transformer, mode="default", fullgraph=True)コンパイル済みの Nunchaku Lite NVFP4 パイプラインは、元の BF16 パイプライン(RTX PRO 6000 上で 2.271 秒 → 1.675 秒)と比較して 1.8 倍高速に動作します。