【ComfyUI】FLUXモデル使用時のメモリ不足エラー解決法:VRAM最適化テクニック

問題の概要:FLUXモデル使用時のメモリ不足エラー

ComfyUIで次世代の高品質画像生成モデルとして注目を集めているFLUX.1-devFLUX.1-schnellを使用する際、多くのユーザーがメモリ不足(Out of Memory, OOM)エラーに遭遇します。特に、8GBや12GB VRAMの一般的なGPU環境では、高解像度の画像生成やバッチ処理が困難です。

具体的には、以下のようなエラーメッセージがComfyUIのターミナルやUI上に表示されます。

RuntimeError: CUDA out of memory. Tried to allocate 2.34 GiB (GPU 0; 11.00 GiB total capacity; 7.21 GiB already allocated; 1.45 GiB free; 9.12 GiB reserved in total by PyTorch)
OutOfMemoryError: CUDA error: out of memory

このエラーが発生すると、画像生成プロセスが強制終了し、「Queue Prompt」が実行されなくなります。FLUXモデルはその高い表現力の代償として、Stable Diffusion XL(SDXL)などと比較しても多くのVRAMを消費するため、適切な最適化が必須となります。

原因の解説:なぜFLUXモデルはメモリを大量消費するのか?

FLUXモデルが大量のVRAMを必要とする主な原因は、そのアーキテクチャと高精度な推論にあります。

1. 大規模なモデルパラメータ

FLUX.1-devは約12B(120億)パラメータを持つ大規模モデルです。これはSDXL(約6.6Bパラメータ)の約2倍、SD 1.5(約0.86Bパラメータ)の約14倍に相当します。モデルをGPUメモリにロードするだけで、膨大なVRAMを消費します。

2. 高解像度推論のための中間特徴量

FLUXはデフォルトで1024×1024ピクセルなどの高解像度画像を生成することを前提としています。推論プロセス中、中間層で生成される特徴量マップ(feature maps)のサイズが非常に大きくなり、これがVRAM使用量を急増させます。

3. アテンション機構のメモリ使用量

Transformerベースのアーキテクチャを採用するFLUXモデルは、自己注意機構(Self-Attention)の計算において、シーケンス長の二乗に比例するメモリを必要とします。高解像度画像は長いシーケンスとして扱われるため、メモリ消費が指数的に増加します。

4. ComfyUIのノード実行によるオーバーヘッド

ComfyUIはノードベースのワークフローを逐次実行するため、複数のノードが同時にメモリ上にデータを保持することがあります。最適化されていないワークフローでは、不要な中間データがメモリを圧迫します。

解決方法:ステップバイステップでのメモリ最適化

以下に、ハードウェアをアップグレードすることなく、ソフトウェア的な設定とワークフロー最適化でVRAM使用量を削減する方法を紹介します。

ステップ1:ComfyUIマネージャーによる最適化ノードの導入

まず、ComfyUIの拡張機能「ComfyUI Manager」から、メモリ最適化に役立つカスタムノードをインストールします。

# ComfyUIのルートディレクトリで実行
cd custom_nodes
git clone https://github.com/pythongosssss/ComfyUI-Custom-Scripts.git

インストール後、ComfyUIを再起動すると、「efficiency」や「memory」関連のノードが利用可能になります。

ステップ2:VRAMセーバーモードの有効化(–lowvramオプション)

ComfyUIの起動オプションでVRAMセーバーモードを指定します。これは最も簡単で効果的な方法の一つです。

# Windows (run_cpu.bat または run_nvidia_gpu.bat を編集)
python main.py --lowvram

# Linux/macOS
python3 main.py --lowvram

このオプションは、モデルのレイヤーを逐次GPUにロード/アンロードするようにし、ピークメモリ使用量を大幅に削減します。ただし、推論速度が低下するトレードオフがあります。

ステップ3:FLUX専用の軽量版モデルを使用する

Black-forest-Labsからは、メモリ使用量を抑えた軽量版モデルが提供されています。

  • FLUX.1-schnell: 推論速度を優先したバージョン(VRAM使用量もやや低減)
  • FLUX.1-dev 8bit: 8ビット量子化されたバージョン(VRAM使用量が大幅削減)

これらのモデルは、Hugging FaceやCivitaiからダウンロードし、`ComfyUI/models/flux/`ディレクトリに配置します。

ステップ4:ワークフロー内でのメモリ最適化設定

ComfyUIのワークフロー(JSON)内で、特定のノードにメモリ最適化の設定を追加します。

// KSampler (FLUX) ノードの設定例
{
  "inputs": {
    "model": ["4", 0],
    "seed": 123456,
    "steps": 30,
    "cfg": 7.5,
    "sampler_name": "dpmpp_2m",
    "scheduler": "karras",
    // メモリ最適化のための追加設定
    "denoise": 1,
    "use_tiled_vae": true, // タイルドVAEデコードを有効化(高解像度時)
    "tile_size": 512 // タイルサイズを指定
  },
  "class_type": "KSampler"
}

「Use tiled VAE decode」オプションを有効にすると、高解像度画像のデコードを小さなタイルに分割して行うため、VRAMのピーク使用量を抑えられます。

ステップ5:バッチサイズと解像度の調整

FLUXモデルを使用する際の推奨設定は以下の通りです。

  • 初期設定: 解像度 1024×1024、バッチサイズ 1
  • VRAM 8GB環境: 解像度 768×768 または 896×896 にダウンスケール
  • VRAM 12GB環境: 解像度 1024×1024は可能だが、バッチサイズは1に固定
  • バッチ生成: 複数枚生成する場合は「Empty Latent Image」のバッチサイズではなく、複数回のキュー実行を推奨

ステップ6:WindowsのGPUメモリ設定(Windowsユーザー向け)

Windowsでは、GPUメモリの予約方法がLinuxと異なります。以下の設定を調整することで、利用可能なVRAMを増やせます。

# 環境変数の設定(コマンドプロンプトで実行、またはシステムプロパティで設定)
set PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6,max_split_size_mb:128
set XFORMERS_FORCE_DISABLE_TRITON=1

また、NVIDIAコントロールパネルで「テクスチャフィルタリング – 品質」を「高性能」に設定すると、VRAMの一部を解放できる場合があります。

コード例・コマンド例

最適化された起動スクリプトの例(run_flux_optimized.bat)

@echo off
cd /d "C:ComfyUI_windows_portableComfyUI"
set PYTHON=
set VENV_DIR=
set PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6,max_split_size_mb:128
set XFORMERS_FORCE_DISABLE_TRITON=1
python main.py --lowvram --auto-launch --listen 0.0.0.0 --port 8188
pause

メモリ使用量を監視するための簡単なPythonスクリプト

import torch
import pynvml

def print_gpu_memory():
    pynvml.nvmlInit()
    handle = pynvml.nvmlDeviceGetHandleByIndex(0)
    info = pynvml.nvmlDeviceGetMemoryInfo(handle)
    print(f"GPU Memory Total: {info.total / 1024**3:.2f} GB")
    print(f"GPU Memory Used: {info.used / 1024**3:.2f} GB")
    print(f"GPU Memory Free: {info.free / 1024**3:.2f} GB")
    
    # PyTorchのキャッシュメモリも表示
    print(f"PyTorch Allocated: {torch.cuda.memory_allocated() / 1024**3:.2f} GB")
    print(f"PyTorch Cached: {torch.cuda.memory_reserved() / 1024**3:.2f} GB")

# ワークフローの実行前後にこの関数を呼び出してメモリ使用量を比較
print_gpu_memory()

まとめ・補足情報

ComfyUIでFLUXモデルを安定して使用するためには、単一の解決策ではなく、多層的なメモリ最適化アプローチが効果的です。重要なポイントを以下にまとめます。

  1. 最初に「–lowvram」オプションを試す: 最も手軽で効果が高い方法です。
  2. モデル選択を見直す: タスクに応じてFLUX.1-schnellや8bit量子化版の使用を検討します。
  3. 解像度を現実的に設定する: GPU VRAM容量に合わせた解像度設定が基本です。
  4. ワークフローを最適化する:「タイルドVAE」や「メモリ効率の良いサンプラー」の利用を検討します。
  5. システム設定を調整する: 特にWindows環境では、環境変数による調整が有効です。

補足情報として、将来的なアップデートに期待できる点もあります。ComfyUIコミュニティでは、FLUXモデル専用のさらなる最適化ノードの開発が進んでいます。また、PyTorch 2.x以降の機能(`torch.compile`による最適化、より効率的なアテンション実装)を活用した高速化・省メモリ化も期待できます。

最後に、どうしてもVRAMが不足する場合は、Google Colab Pro(A100 GPU)や、クラウドGPUサービス(RunPod, Vast.aiなど)を利用する方法も現実的な選択肢となります。これらの環境では、大容量VRAMを比較的安価に利用できるため、高解像度・バッチ処理を必要とする本格的なFLUXモデルの使用に適しています。

この記事は役に立ちましたか?