PythonでFLUX.1-dev GGUF Q8を実行しています

GGUF量子化でFLUX.1-devを高速化

目次

FLUX.1-dev は、驚くほど美しい画像を生成できる強力なテキストから画像生成モデルですが、24GB以上のメモリが必要なため、多くのシステムでは実行が難しいです。 GGUF量化されたFLUX.1-dev は、メモリ使用量を約50%削減しながらも、優れた画像品質を維持するという解決策を提供します。

example output Q8 quantized FLUX.1-dev - asic この画像は、GGUF形式でQ8量化されたFLUX.1-devモデルを使用して生成され、メモリ使用量が減少しているにもかかわらず、品質が維持されていることが示されています。

GGUF量化とは?

GGUF(GPT-Generated Unified Format)は、もともとは言語モデルのために開発された量化形式ですが、現在ではFLUXなどの拡散モデルにもサポートされています。量化は、重みを16ビットまたは32ビットの完全な精度ではなく、8ビット、6ビット、または4ビットの低い精度形式で保存することで、モデルサイズを小さくします。

FLUX.1-devの場合、モデルの最大の部分であるTransformerコンポーネントを量化することで、Q8_0量化ではメモリ使用量を約24GBから12GBにまで削減でき、さらに積極的な量化レベルではさらに低くすることが可能です。

GGUF量化の利点

GGUF量化されたFLUXモデルを使用する主な利点には以下があります:

  • メモリ使用量の削減:VRAMの要件を半分に切り下げ、FLUX.1-devをより多くのハードウェアで使用可能にします
  • 品質の維持:Q8_0量化では、わずかな可視的な違いしかないにもかかわらず、画像品質が維持されます
  • ロード速度の向上:ファイルサイズが小さいため、量化されたモデルはより早くロードされます
  • 電力消費の低下:メモリ使用量の削減は、推論中の電力消費を低下させます

我々のテストでは、量化されたモデルはフルモデルの24GB以上に比べて約12〜15GBのVRAMを使用し、生成時間はほぼ同じです。

インストールとセットアップ

GGUF量化されたFLUX.1-devを使用するには、標準のdiffusers依存関係に加えてggufパッケージが必要です。すでにFLUXテキストから画像生成を使用している場合は、ベースのセットアップにすでに慣れているでしょう。

uvをPythonパッケージマネージャーとして使用している場合、必要なパッケージを次のようにインストールできます:

uv pip install -U diffusers torch transformers gguf

または標準のpipを使用して:

pip install -U diffusers torch transformers gguf

実装

GGUF量化モデルを使用する際の主な違いは、FluxTransformer2DModel.from_single_file()を使用してTransformerを個別にロードし、GGUFQuantizationConfigを渡してパイプラインに渡すことです。Python構文のクイックリファレンスが必要な場合は、Pythonチートシートを確認してください。以下は完全な動作例です:

import os
import torch
from diffusers import FluxPipeline, FluxTransformer2DModel, GGUFQuantizationConfig

# パス
gguf_model_path = "/path/to/flux1-dev-Q8_0.gguf"
base_model_path = "/path/to/FLUX.1-dev-config"  # 設定ファイルのみ

# GGUF量化されたTransformerをロード
print(f"GGUF量化されたTransformerをロード中: {gguf_model_path}")
transformer = FluxTransformer2DModel.from_single_file(
    gguf_model_path,
    quantization_config=GGUFQuantizationConfig(compute_dtype=torch.bfloat16),
    config=base_model_path,
    subfolder="transformer",
    torch_dtype=torch.bfloat16,
)

# 量化されたTransformerを使用したパイプラインを作成
print(f"ベースモデルを使用してパイプラインを作成中: {base_model_path}")
pipe = FluxPipeline.from_pretrained(
    base_model_path,
    transformer=transformer,
    torch_dtype=torch.bfloat16,
)

# CPUオフロードを有効にする(GGUFでは必須)
pipe.enable_model_cpu_offload()
# 注意: enable_sequential_cpu_offload()はGGUFと互換性がありません

# 画像を生成
prompt = "夕暮れ時にネオンライトが輝く未来都市の風景"
image = pipe(
    prompt,
    height=496,
    width=680,
    guidance_scale=3.5,
    num_inference_steps=60,
    max_sequence_length=512,
    generator=torch.Generator("cpu").manual_seed(42)
).images[0]

image.save("output.jpg")

重要な考慮事項

モデル設定ファイル

GGUF量化を使用する場合、オリジナルのFLUX.1-devモデルからモデル設定ファイルが必要です。これらには以下が含まれます:

  • model_index.json - パイプライン構造
  • コンポーネント設定(Transformer、text_encoder、text_encoder_2、vae、scheduler)
  • トークナイザーファイル
  • Text encoderとVAEの重み(これらは量化されていません)

Transformerの重みはGGUFファイルから取得しますが、他のすべてのコンポーネントにはオリジナルのモデルファイルが必要です。

CPUオフロードの互換性

重要enable_sequential_cpu_offload()はGGUF量化モデルと互換性がなく、KeyError: Noneエラーを引き起こします。私は、量化されたTransformerを使用する際にはenable_model_cpu_offload()を使用しています。

量化レベル

FLUX.1-devで利用可能な量化レベルには以下があります:

  • Q8_0:最高品質、~14-15GBメモリ(推奨)
  • Q6_K:良いバランス、~12GBメモリ
  • Q4_K:最大圧縮、~8GBメモリ(品質に悪影響を及ぼす可能性があると仮定)

ほとんどの使用ケースでは、Q8_0がメモリ節約と画像品質のバランスが最適です。

パフォーマンス比較

我々のテストでは、同じプロンプトと設定を使用して:

モデル VRAM使用量 生成時間 品質
フルFLUX.1-dev 24GB? 私にはそんな大きなGPUはありません 優れた(私はそう思っています)
フルFLUX.1-dev ~3GB(sequential_cpu_offload()を使用) ~329秒 優れた
GGUF Q8_0 ~14-15GB ~98秒 !!! 優れた
GGUF Q6_K ~10-12GB ~116秒 非常に良い

量化されたモデルは、今やCPUオフロードの必要が少なくなったため、3倍以上高速な生成速度を実現しながら、メモリ使用量を大幅に削減しており、限られたVRAMを持つシステムでも実用可能です。

私は両方のモデルを以下のプロンプトでテストしました:

未来のトランスフォーマー推論ASICチップのクローズアップ、複雑な回路構造、密な行列乗算ユニットと低精度ALUから発光する青い光、オンチップSRAMバッファと量化パイプラインに囲まれ、ハイパーディテールな写真リアリスティックスタイルで、冷たい臨床的な照明構成でレンダリングされたもの。

FLUX.1-dev Q8のサンプル出力は、この投稿の表紙画像です - 上記を参照してください。

非量化されたFLUX.1-devのサンプル出力は以下です:

example image produced by non-quantized FLUX.1-dev - asic

品質の違いはほとんど見られません。

結論

GGUF量化により、FLUX.1-devは、モデルが知られている高品質な画像生成を維持しながら、より幅広いハードウェアにアクセス可能になります。メモリ要件を約50%削減することで、高品質なテキストから画像生成を、コストが低いハードウェアでも実行できます。

diffusersライブラリを使用して実装は簡単で、標準のFLUXパイプラインセットアップにわずかな変更が必要です。ほとんどのユーザーにとって、Q8_0量化はメモリ効率と画像品質のバランスが最適です。

FLUX.1-Kontext-devで画像拡張を使用している場合、将来的には類似の量化技術が利用可能になる可能性があります。

関連記事

参考文献