17年前のCPUのメモリ4GBのPCで、stable-diffusion.cppを使って画像生成する
512x512の画像サイズだし、時間はかかりますが、古いパソコンでも画像生成できました
――――――――――――――――――――――――――――――――――――
前回はメモリ3GBのスマホで画像生成しました
( https://www.chichi-pui.com/posts/2090ade4-86a8-4e8c-a8dc-97d82aaf17c6/ )
しかし精度を落としたcheckpointを使っていることもあって、生成された画像は実用に耐えるものではありませんでした
その後にメモリが512MBのRaspberry Pi Zero WでOnnxStreamを使って画像生成しようと試みましたが、うまくいきませんでした
さて、手元には古いパソコンがあります。Windows Vistaが動いていたPCです
マザーボードは2回か3回交換した記憶があり、壊れるたびに部品を交換して使っていた古参のPCです
これで画像生成しましょう
まずはHDDを余っていたSSDに換装したり、OSを最新のUbuntuに変更して環境を整えました
・パソコンスぺック
Ubuntu 24.04 LTS
Intel Core2 Duo E8600
メモリ4GB
SSD 120GB
Linux版のStable Diffusion 1111やForgeやComfy UIを入れようとしたのですが うまくいかなかったので、stable-diffusion.cppを使います
導入の仕方や使い方は次のサイトなどを参考にしました
一番目のリンクが公式サイトです
――――――――――――――――――――――――――――――――――――
GitHub - leejet/stable-diffusion.cpp: Stable Diffusion and Flux in pure C/C++
https://github.com/leejet/stable-diffusion.cpp
C++でStable Diffusionを実行する方法:stable-diffusion.cpp
https://zenn.dev/kmitsunami/articles/1ab2b8c46e6593
stable-diffusion.cpp と Python バインディング #StableDiffusion - Qiita
https://qiita.com/7shi/items/f0942fda82fefcbbdb03
CPUでもOK,はじめてのローカル画像生成AI。Stable-Diffusion-ForgeとFastSD CPU,Draw Things他など。練習例題あり初心者向け講座。LCM-LoRa高速化,LLMと組み合わせ技などあり。NetBSDもOK。 | ドクセル
https://www.docswell.com/s/kapper1224/5WWE9R-2024-08-04-170351
stable-diffusion.cpp で CPU で FLUX.1 Schnell を動かす
https://zenn.dev/syoyo/articles/a2779def150fbb
――――――――――――――――――――――――――――――――――――
・生成環境を構築
stable-diffusion.cppを用意します
CPUが古いせいか、公式サイトからコンパイル済みのファイルをダウンロードしてきても動きませんでした
(sd-master--bin-Linux-Ubuntu-24.04-x86_64.zip を試しましたが、今回の環境では動きませんでした)
そこで上記の「C++でStable Diffusionを実行する方法」を見ながら自前でコンパイルします
できた「sd」のファイルは、デスクトップにstable-diffusion.cppのフォルダを作ってその中に置いておきます
sdの実行ファイルは5.9MBしかなくて、これで動作するのか不安になります。でも大丈夫です
次にcheckpointをダウンロードします
SD1.5のLCMモデルである「theHWondermix_v1.safetensors」を使います
https://civitai.com/models/585257?modelVersionId=653075
ダウンロードしてstable-diffusion.cppのフォルダの中に入れます
次に画像生成の高速化のためにTiny Decoderを用意してします
https://huggingface.co/madebyollin/taesd/blob/main/diffusion_pytorch_model.safetensors
「diffusion_pytorch_model.safetensors」をダウンロードしてstable-diffusion.cppのフォルダの中に入れます
44分43秒が22分3秒になるぐらい高速化できます
・環境が整ったので生成します
stable-diffusion.cppのフォルダの中でマウスを右クリックして出てきたメニューの「端末で開く」を選択します
コマンドプロントが起動しますので、次のコマンドを打って画像生成を開始します
コマンドをコピーして、コマンドプロンプトの中で貼り付けしてEnterを押せばコマンドを実行できます
./sd -m ./theHWondermix_v1.safetensors --cfg-scale 1 --steps 4 --sampling-method lcm -H 512 -W 512 --seed -1 --type q8_0 --taesd ./diffusion_pytorch_model.safetensors -p "a lovely cat"
しばらく待つとstable-diffusion.cppのフォルダの中にoutput.PNGができています
それが生成された画像です
常に同じ名前で生成されるので、次に生成するとできた画像が上書きされてしまいます。保存したい画像は名前を変更して別の場所に移動しておきましょう
・コマンドの解説
コマンドはsdの実行のほか、checkpointの指定や生成画像の設定やプロンプトの指定をしています
--type q8_0で量子化をしてメモリを節約しています
--cfg-scale 1や--steps 4や--sampling-method lcmなのは、LCMモデル用の設定だからです
-p "a lovely cat"がプロンプトなので、a lovely catの文字を変更することで違う内容の絵を作ることができます
--diffusion-faでFlashAttentionという高速化技術を有効にできるようですが、今回の環境では逆に遅くなってしまったので使っていません
(追記: 高速化ではなく速度を犠牲にしてメモリ使用量を低下させる技術みたい)
stable-diffusion.cppには、checkpointを量子化して保存する機能があります
量子化するとファイルサイズが小さくなって、メモリを節約することが期待できます
しかし今回の環境では逆にファイルサイズが大きくなってしまったので使っていません
q8_Kで量子化したところ、2.4GBのcheckpointが3GBほどに増えました
・生成時のパソコンの状態
4GBのメモリ中、使用メモリはシステム全体で3.3GB (スワップ 532MB)
アプリが使うメモリは2.2GBでした
生成時間は22分3秒でした
ロースペックパソコンで画像生成するのって楽しいね
・比較
Windows11の現役PCで同じ画像設定でCPUで画像生成した場合
生成時間31秒
公式サイトからコンパイル済みのファイル「sd-master-d9b5942-bin-win-avx2-x64.zip」をダウンロードして使いました
呪文
呪文を見るにはログイン・会員登録が必須です。