GPUなしでStable DiffusionをCPUのみで動かす!Dockerで環境を汚さずに実行する方法

この記事の内容

  • GPU非搭載または貧弱なGPUしか持たないPCでも、CPUのみでStable Diffusionを動かす方法を解説します
  • Dockerを使って環境を汚さずに実行環境を構築します
  • モデルデータのダウンロード方法からDockerコンテナの起動、画像生成の実行まで手順を紹介します
  • WSLのメモリ上限設定の調整が必要になるケースと対処法も紹介します
  • AMD Ryzen 5 3500・メモリ16GBという比較的ローエンドな環境での動作検証結果をお伝えします

動作確認環境

今回の検証で使用したPCのスペックは以下のとおりです。

  • CPU: AMD Ryzen 5 3500(6コア)
  • メモリ: 16GB

GPUは貧弱で実用に耐えないため、CPUのみで動作させることを目標としています。

なお、Stable DiffusionをCPUで動かすには、以下の要件を満たす必要があります。

  • RAM: 10GB以上(スワップを含む)
  • ストレージ: モデルファイル約4GBの空き

前提条件:Docker for Windowsのインストール

まず、Docker for Windowsがインストールされていることが前提です。まだインストールしていない方は、Docker公式サイトから「Docker Desktop for Windows」をダウンロードしてインストールしてください。


手順1:リポジトリのダウンロード

CPU対応のStable DiffusionをDockerで動かすためのリポジトリを使います。CPUでも動作するバッチが含まれているリポジトリをZIPファイルとしてダウンロードして展開しておきます。

ダウンロードしたZIPファイルはプロパティからセキュリティのブロックを解除し、すべて展開しておきましょう。


手順2:モデルデータのダウンロード

次に、Stable Diffusionのモデルデータをダウンロードします。モデルデータはTorrentで配布されており、ファイルサイズは約3.97GBです。

TorrentクライアントはqBittorrentなどの無料ツールをインストールして使用します。マグネットリンクをクリックしてTorrentクライアントに渡すことでダウンロードが始まります。ダウンロード完了後、ステータスが「Seeding(シーディング)」になればダウンロード成功です。

ダウンロード速度によっては30〜40分程度かかる場合があります。


手順3:モデルファイルの配置

ダウンロードしたモデルファイルをリポジトリの所定の場所に配置します。

  1. リポジトリ内に以下のフォルダを作成します。
models/ldm/stable-diffusion-v1/
  1. ダウンロードしたモデルファイル(.ckptファイル)を以下の名前にリネームします。
model.ckpt
  1. リネームしたファイルを手順1で作成したフォルダ内に移動します。

手順4:DockerイメージのPullと起動

次に、Dockerイメージをpullしてコンテナを起動します。ターミナル(PowerShellまたはコマンドプロンプト)で以下のコマンドを実行します。

まず、Dockerイメージをpullします。

docker pull hlky/sd

次に、リポジトリをコンテナにマウントしてコンテナを起動します。リポジトリのパスは各自の環境に合わせて書き換えてください。

docker run -it --rm -v C:\path\to\repo:/sd hlky/sd

コンテナが起動したら、コンテナ内のディレクトリに移動して環境をアクティベートします。

cd /sd
conda activate ldm

手順5:画像生成の実行

環境のアクティベートが完了したら、いよいよ画像生成スクリプトを実行します。

python scripts/txt2img.py --prompt "a photo of an apple" --plms --seed 27 --n_samples 1

各オプションの意味は以下のとおりです。

  • --prompt: 生成したい画像の説明(英語)
  • --plms: サンプリングアルゴリズムの指定
  • --seed: 生成のシード値(同じ値を指定すると同じ結果になります)
  • --n_samples: 生成枚数

初回実行時は追加でファイルのダウンロードが行われるため、しばらく時間がかかります。

生成された画像はリポジトリ内のoutputs/txt2img-samples/フォルダに保存されます。


トラブルシューティング:メモリ不足でプロセスがKillされる場合

Windows上のWSL(Windows Subsystem for Linux)環境では、Dockerが使用できるメモリがWindowsのデフォルト設定で**物理メモリの50%**に制限されています。この制限が低すぎると、Stable Diffusionの実行中にメモリ不足でプロセスがKillされてしまいます。

この問題を解消するには、WSLのメモリ上限を引き上げます。

  1. %USERPROFILE%\.wslconfig ファイルを作成または編集します。
  2. 以下の内容を記述して保存します(例: メモリ上限を12GBに設定する場合)。
[wsl2]
memory=12GB
  1. PowerShellで以下を実行してWSLを再起動します。
wsl --shutdown
  1. Docker Desktopも再起動してから、改めて画像生成を実行します。

この設定変更後、プロセスが途中でKillされることなく最後まで実行できるようになります。


生成にかかる時間

今回の検証環境(Ryzen 5 3500・16GB RAM)では、1枚あたり約11〜12分かかりました。GPUを使う場合と比べると非常に遅いですが、CPU処理中はタスクマネージャーでCPU使用率がほぼ100%に張り付いており、GPUはほとんど使われていないことが確認できます。


まとめ

本記事では、DockerとCPUのみを使ってStable Diffusionを動作させる手順を紹介しました。

  • GPU非搭載・貧弱なGPU環境でも、CPUのみでStable Diffusionによる画像生成が可能です
  • Dockerを使うことでホスト環境を汚さずに実行環境を整えられます
  • WSLのメモリ上限設定を見直すことで、メモリ不足によるプロセスKillを回避できます
  • 生成速度はGPU利用時と比べて非常に遅く、1枚あたり10分以上かかりますが、画像は正常に生成されます

ハイエンドGPUを持っていなくても、手元のPCでStable Diffusionを試せる手軽な方法ですので、ぜひ活用してみてください。