C++でStable Diffusionを実行する方法:stable-diffusion.cpp
はじめに
Stable Diffusionは、高品質な画像生成が可能なディープラーニングモデルですが、通常はPythonなどの高レベル言語で使用されます。本記事では、C++によるStable Diffusionの実装であるstable-diffusion.cpp
をローカル環境でビルドし、実行する方法を解説します。
実行環境
今回、Stable DiffusionをC++で実行するため以下の環境を用いました。
- Ubuntu 2022.04 (WSL2)
- Python 3.10.12
- https://github.com/leejet/stable-diffusion.cpp
ビルド手順
GitHubからプロジェクトのリポジトリをクローンします。その後ビルドディレクトリを作成してビルド。今回はCPU上で実行させるデフォルト設定。その他の設定はプロジェクトのドキュメントを参照してください。
git clone --recursive https://github.com/leejet/stable-diffusion.cpp
cd stable-diffusion.cpp
mkdir build
cd build
cmake ..
cmake --build . --config Release
ビルドが成功すると、実行ファイル sd
が ./bin/
ディレクトリ下に生成されます。
実行手順
モデルファイルのダウンロード
Stable Diffusionの事前学習済みモデルをダウンロードして、適切なディレクトリに配置します。今回使用したモデルは下記です。 ../../models/
以下に下記ファイル名で配置しています。
- Stable Diffusion v1.5:
stable-diffusion-v1-5/v1-5-pruned-emaonly.safetensors
- Tiny AutoEncoder (TAESD):
taesd/diffusion_pytorch_model.safetensors
- Latent Consistency Model (LCM):
lcm/LCM_Dreamshaper_v7_4k.safetensors
- LCM-LoRA:
lcm-lora/lcm-lora-sdv1-5.safetensors
基本的な実行コマンド
通常、実行ファイルに必要な引数を渡して実行します。例えば、Text-to-image は以下のように実行します。
./bin/sd -m ../../models/stable-diffusion-v1-5/v1-5-pruned-emaonly.safetensors -p "a lovely cat"
TXT2IMG with Tiny Decoder
最終段階のデコーダにTiny Decoderを用いることで、多少精度を犠牲にすることで画像生成を高速にすることができます。
./bin/sd -m ../../models/stable-diffusion-v1-5/v1-5-pruned-emaonly.safetensors --taesd ../../models/taesd/diffusion_pytorch_model.safetensors -p "a lovely cat" -o output_taesd.png
TXT2IMG with LCM-LoRA/Tiny Decoder
LCM-LoRAを用いることで画像生成のStep数を大幅に削減することができます。
./bin/sd -m ../../models/stable-diffusion-v1-5/v1-5-pruned-emaonly.safetensors --taesd ../../models/taesd/diffusion_pytorch_model.safetensors --lora-model-dir ../../models/lcm-lora --sampling-method lcm --cfg-scale 1 --steps 4 -p "a lovely cat<lora:lcm-lora-sdv1-5:1>" -o output_lcm_taesd.png -v
TXT2IMG with LCM-LoRA/Tiny Decoder/4-bit Quantization
さらにモデルを量子化することで高速化を実現できます。ただし、出力画像の精度に大きく影響を与えるので注意が必要です。軽くテストしたところQ4_1の方がQ4_0よりも精度が高そうでした。
./bin/sd -m ../../models/stable-diffusion-v1-5/v1-5-pruned-emaonly.safetensors --taesd ../../models/taesd/diffusion_pytorch_model.safetensors --lora-model-dir ../../models/lcm-lora --sampling-method lcm --cfg-scale 1 --steps 4 --type q4_0 -p "a lovely cat<lora:lcm-lora-sdv1-5:1>" -o output_lcm_taesd.png -v
まとめ
本記事では、C++によるStable Diffusionの実装であるstable-diffusion.cppのビルドと実行方法について解説しました。C++による画像生成を行うことが可能になり、様々な場所へ組み込むことが容易になります。
Discussion