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:モデルファイルの配置
ダウンロードしたモデルファイルをリポジトリの所定の場所に配置します。
- リポジトリ内に以下のフォルダを作成します。
- ダウンロードしたモデルファイル(
.ckptファイル)を以下の名前にリネームします。
- リネームしたファイルを手順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のメモリ上限を引き上げます。
%USERPROFILE%\.wslconfigファイルを作成または編集します。- 以下の内容を記述して保存します(例: メモリ上限を12GBに設定する場合)。
[wsl2]
memory=12GB
- PowerShellで以下を実行してWSLを再起動します。
wsl --shutdown
- 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を試せる手軽な方法ですので、ぜひ活用してみてください。