こんにちは。ポン吉です。
MidJourneyによるAIによる画像描画が流行っていますね~。文字のテキスト情報を指定するだけでAIが画像を描画してくれる時代が到来。かなりリアルな描画となっておりAI技術のブレークスルーを実感します。そんなAIによる画像描画技術がOSSとして無料公開されました。
その名は「Stable Diffusion」。これはラズパイで使ってみるしかない!
超非力なラズパイで最新AI技術(激重)を実行するぜ!
こいつ・・・正真正銘のドM変態野郎だな
結論を言うと非力なラズパイでもStable Diffusionを動かせました!ローカル環境のラズパイで動かすための情報が無く、簡単に動かせずに色々とハマりましたが、なんとか動かせるようになったので情報を公開したいと思います。下記のような画像を描くのに1~2時間の処理時間が必要ですが…
「素敵な画像を出力したいけど、なかなか呪文詠唱がうまくいかない・・・」とお悩みの召喚士さんのために、高レベル召喚士様の貴重な情報を調べてみました。「呪文詠唱」パターン&召喚画像を300枚以上のボリュームで紹介していますので、下記リンク先の記事も参考にしてみてください。
今回のテーマはこちら!
- Stable Diffusionをローカル環境であるLinux(ラズベリーパイ)にインストール
- 非力なラズベリーパイ(GPUなし)で動かすためのチューニングノウハウを公開
- Stable Diffusionによる画像描画結果を紹介
それではやってみましょう~
Stable Diffusionの紹介
Stable Diffusionとは
AIによる画像生成については「MidJourney」が有名だと思います。画像イメージをテキスト情報で入力することで、AIがそのテキスト情報にあった画像を自動生成します。「Stable Diffusion」についてもテキスト情報から画像を自動生成する部分は同じです。
「MidJourney」には無料枠である程度はタダで使えますが、月額費用が必要になる有料サービスです。一方、2022/8/23にオープンソースとしてStability.AI社が公開した「Stable Diffusion」は誰でも無料で使うことができます。こちらにブラウザから試せる本家のデモサイトがありますので、この凄さを是非実感してみてください!
This application is too busy! Try again soon.
って出るんだけど!
デモサイトのアクセスが増えているようで
エラーになる事が多くなってきました…
私はまだ呪文詠唱の練度が低いため、あまり理想の画像を生み出せていませんが、Stable Diffusionで描画した画像ギャラリーを一部紹介します。
\Stable Diffusionで描画した画像ギャラリー/
入力はテキスト文字列、出力が画像 とシンプルなため、Stable Diffusionを活用したサービスが次々に生まれてくる予感です!AIが生成した画像を活用した漫画・動画など盛り上がってくる気がします。
Stable Diffusionでイイ感じの画像を出力するには?
「なかなか良い感じの画像が出力できない・・・」とお悩みの方向けに、「呪文詠唱」のおすすめパターンと「出力画像」をセットにした記事を記載しました。是非下記リンク先の記事も参考にしてみてください。
Stable Diffusionを動かすためのラズベリーパイ環境
注意
最新Raspberry Pi OS bullseye 64bit版 での構築例を紹介します。32bit版では動作しないので注意。
ラズパイ初期セットアップの詳細は、上記記事を参照してください。
ちなみにStable Diffusionは実行時に大量のメモリが必要となるため、ラズパイ4(8GB)でも物理メモリが足りません。私の環境でおおまかに計測してみると、約9.5GB程度のメモリ(OS・システムが使用するメモリ込み)が必要な状況でした。よって、使用メモリが少ないコマンドライン版Raspberry Pi OS 64bit Liteで環境構築することを推奨します。
また、SDカードの容量についても注意が必要です。Stable DiffusionのモデルデータのダウンロードやSWAP領域拡張で10GB以上のストレージ容量が必要となるため、32GBあたりのSDカードを使用することを推奨します。
ラズパイ自体も品薄で購入が難しい状況が続いています。ラズパイの在庫と価格をリアルタイム確認できるページを作りました。ラズパイを購入しようとしている方は是非参考にしてみてください。
SWAP領域を拡大
先述した通り、ラズベリーパイ4の8GBでもメモリが足りません。普通にStable Diffusionをラズパイで実行してもOut Of Memoryでプロセスが落ちます。不足しているメモリ領域については、SWAP領域を拡大して無理やり動くように設定変更していきます。
sudo vi /etc/dphys-swapfile
SWAPの設定ファイルを以下のように書き換えましょう。
# /etc/dphys-swapfile - user settings for dphys-swapfile package
# author Neil Franklin, last modification 2010.05.05
# copyright ETH Zuerich Physics Departement
# use under either modified/non-advertising BSD or GPL license
# this file is sourced with . so full normal sh syntax applies
# the default settings are added as commented out CONF_*=* lines
# where we want the swapfile to be, this is the default
#CONF_SWAPFILE=/var/swap
# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have an special disk situation
#CONF_SWAPSIZE=100
CONF_SWAPSIZE=4096
# set size to computed value, this times RAM size, dynamically adapts,
# guarantees that there is enough swap without wasting disk space on excess
#CONF_SWAPFACTOR=2
# restrict size (computed and absolute!) to maximally this limit
# can be set to empty for no limit, but beware of filled partitions!
# this is/was a (outdated?) 32bit kernel limit (in MBytes), do not overrun it
# but is also sensible on 64bit to prevent filling /var or even / partition
#CONF_MAXSWAP=2048
CONF_MAXSWAP=4096
デフォルトで100MBとなっているSWAPファイルのサイズを4GBまで拡張します。CONF_SWAPSIZEとCONF_MAXSWAPの両方を4GBに設定しましょう。設定ファイル更新後に、dphys-swapfileサービスを再起動します。
sudo systemctl restart dphys-swapfile
サイズが4GBと大きいので、上記コマンドを実行すると2~3分ほど長く待たされると思います。コマンドの実行が終わらない・・・と心配になるかと思いますが、安心して粘り強くコマンドが終わるのを待ちましょう。
コマンドの実行が終わったら、swaponコマンドで変更を確認しておきましょう。
swapon -s
Filename Type Size Used Priority
/var/swap file 4196348 0 -2
このようにSizeの箇所の数値(KB)が指定した4GBに変わっていればSWAPの設定変更は完了です。
SWAP機能とは?
ラズパイの物理メモリ容量以上の領域が必要になった場合、あまり使われていない領域をメモリからマイクロSDカードに移動(スワップアウト)させる機能。ちなみにマイクロSDカードはメモリと比べて1000倍以上性能が遅いため、Swapは性能低下にもつながります。
Stable Diffusion の前提パッケージをインストール
Stable Diffusion 前提パッケージのインストール
Stable Diffusion を動かすために必要となる前提パッケージをインストールします。コピーボタンを押してコンソールに貼り付けて実行しましょう。
sudo apt-get update
sudo apt-get install -y python3-pip libjpeg-dev libopenblas-dev libopenmpi-dev libomp-dev
sudo -H pip3 install setuptools==58.3.0
sudo -H pip3 install Cython
sudo -H pip3 install gdown
Pytoachのインストール
ラズベリーパイではpipコマンドでpytoachを簡単に入れることが出来ません。そこで、有志の方によるmake済みのパッケージを使用してインストールしましょう。自前でmakeするよりトラブルも時間も掛からないのでオススメです。
cd ~/
gdown https://drive.google.com/uc?id=1A2Lc-7y3-ATauRa4FntiYGH90b1GjAzx
sudo -H pip3 install torch-1.12.0a0+git67ece03-cp39-cp39-linux_aarch64.whl
rm torch-1.12.0a0+git67ece03-cp39-cp39-linux_aarch64.whl
注意
外部サイトのファイルなので、今後ファイルが無くなってしまう可能性もあります。その場合は、GitHubにも各種make済みのパッケージが転がっているので探して入れましょう。
transformersのインストール
pip install transformers
特に問題なく簡単にインストールできると思います。
diffusersのインストール
pip install diffusers
特に問題なく簡単にインストールできると思います。
Stable Diffusion の使い方
ユーザアカウントの登録
まずは下記サイトでアカウントを作成する必要があります。登録用のメールアドレスが1つあればOKです。
パスワード条件が厳しめなのでそこだけ注意を。
UsernameとFull nameを入力。合意のチェックボタンを入れて「Create Account」のボタンを押します。
ポイント
登録したメールアドレス宛に認証メールが届いています。メール本文にあるURLリンクから忘れずに認証しておきましょう。これを忘れるとこの先のアクセストークンの取得が出来ません。
利用規約の同意
登録したユーザでログイン後、以下のサイトにて利用規約の同意をします。
https://huggingface.co/CompVis/stable-diffusion-v1-4
利用規約を読み、同意のチェックボタンを押して「Access repository」のボタンをクリックします。
ポイント
利用規約の同意をしておかないと、Stable Diffusion 実行時に以下のようなエラーが出ます。
Access to model CompVis/stable-diffusion-v1-4 is restricted and you are not in the authorized list. Visit https://huggingface.co/CompVis/stable-diffusion-v1-4 to ask for access.
アクセストークンの取得
続いて、アクセストークンの取得を行います。ここで取得したアクセストークンをプログラム側で指定する必要があります。
https://huggingface.co/settings/tokens
「New token」のボタンをクリック
Nameに名前を入れます。ここで指定するNameは、プログラム実行時には使わない論理名称なので「sd」など適当でよいです。Roleは読みだして使うだけなので、デフォルト値の「read」のままで問題ありません。「Generate a token」をクリックしてアクセストークンを作成します。
ここで取得したアクセストークンの文字列は、プログラム実行時に指定する必要があります。事前にコピーしておきましょう。
Stable Diffusion の実行
Stable Diffusion公式サイトのブログ情報を元にラズパイでも動くようにソースをカスタマイズしてみました。
テキスト情報から画像情報を生成
import torch
from diffusers import StableDiffusionPipeline
from torch import autocast
MODEL_ID = "CompVis/stable-diffusion-v1-4"
DEVICE = "cpu"
YOUR_TOKEN = "XXXXXXXX"
pipe = StableDiffusionPipeline.from_pretrained(MODEL_ID, use_auth_token=YOUR_TOKEN)
pipe.to(DEVICE)
prompt = "raspberry pi painted by Katsushika Hokusai"
image = pipe(prompt, guidance_scale=7.5)["sample"][0]
image.save("raspi-hokusai.png")
ポイント
YOUR_TOKEN = "XXXXXXXX" のところは、取得したアクセストークンの内容を記載してください
ラズパイ(CPUのみ)でも動くように改編したポイント
気にしなくても良いですが、公式サイト情報からラズパイ用(CPUのみ)で動くように変更した箇所は下記になります。エラーメッセージ情報と合わせて記載しておきます。
- DEVICE = "cuda" を "cpu" に変更
AssertionError: Torch not compiled with CUDA enabl エラー対処(あたりまえ…) - StableDiffusionPipeline.from_pretrainedの revision="fp16", torch_dtype=torch.float16 を削除
RuntimeError: "LayerNormKernelImpl" not implemented for 'Half' エラー対処 - Pytorchの with autocast 部分を削除
RuntimeError: expected scalar type BFloat16 but found Float エラー対処
上記ファイルを「sd.py」として保存。pythonコマンドで実行してみましょう。
python sd.py
ここからだいぶ待ちます。リモート接続で放置する場合は
Win/Macのスリープでコンソール切断とならないよう注意!
寝る前に仕掛けておくかな
初回実行時にモデルのダウンロードが自動実行されます。約5.4GBほどのダウンロードにとなるので気長に少し待ちましょう。ちなみにダウンロード先は「~/.cache/huggingface/diffusers」ディレクトリになります。こちらのディレクトリの位置を意識する必要はありませんが、一応覚えておきましょう。
Downloading: 100%|??????????????????????????| 1.34k/1.34k [00:00<00:00, 251kB/s]
Downloading: 100%|?????????????????????????| 14.3k/14.3k [00:00<00:00, 80.6kB/s]
Downloading: 100%|?????????????????????????????| 342/342 [00:00<00:00, 67.9kB/s]
Downloading: 100%|??????????????????????????????| 543/543 [00:00<00:00, 109kB/s]
Downloading: 100%|??????????????????????????| 4.56k/4.56k [00:00<00:00, 802kB/s]
Downloading: 100%|?????????????????????????| 1.22G/1.22G [02:18<00:00, 8.78MB/s]
Downloading: 100%|?????????????????????????????| 209/209 [00:00<00:00, 96.5kB/s]
Downloading: 100%|??????????????????????????????| 592/592 [00:00<00:00, 119kB/s]
Downloading: 100%|???????????????????????????| 492M/492M [00:55<00:00, 8.82MB/s]
Downloading: 100%|????????????????????????????| 525k/525k [00:00<00:00, 699kB/s]
Downloading: 100%|??????????????????????????????| 472/472 [00:00<00:00, 220kB/s]
Downloading: 100%|??????????????????????????????| 806/806 [00:00<00:00, 159kB/s]
Downloading: 100%|??????????????????????????| 1.06M/1.06M [00:01<00:00, 984kB/s]
Downloading: 100%|??????????????????????????????| 743/743 [00:00<00:00, 147kB/s]
Downloading: 100%|?????????????????????????| 3.44G/3.44G [06:45<00:00, 8.47MB/s]
Downloading: 100%|??????????????????????????| 71.2k/71.2k [00:00<00:00, 385kB/s]
Downloading: 100%|??????????????????????????????| 522/522 [00:00<00:00, 234kB/s]
Downloading: 100%|???????????????????????????| 335M/335M [00:40<00:00, 8.21MB/s]
ftfy or spacy is not installed using BERT BasicTokenizer instead of ftfy.
ここから次の表示が出るまで相当時間が掛かると思います。裏でメモリ上にモデルを展開しているのですが、ラズパイの8GBのメモリでは足りず、SWAP領域を使って展開するため鬼のように時間が掛かります・・・topコマンドで状況見てみると、SWAP領域で約1.5GBほど使用したあたりで準備完了となり、ここからCPUによる画像描画処理の開始となります。
なんかコマンド受け付けられないくらい
メモリ枯渇するんですけど!
メモリ展開時は仕方ないので何も操作せず
ひたすら無事に終わる事を祈り耐えましょう(苦行)
データモデルの読み込みが終わると、以下のような表示が出力され、実際に画面描画処理が実行されるフェーズになります。ここまでくると、メモリ枯渇問題も解消されるので、並行して裏でラズパイ等を操作可能です。
19it [33:42, 106.67s/it]
0it ~ 51itまで終わると画像描画が完了します。(itってなんだろ?)上記の実行中の例だと、1it単位で約1分47秒かかっているので、推定1時間32分待つことになります。51it完了してからも数分待たされますが粘り強く待ちます。pythonコマンドが完了したら、ローカルディレクトリに「raspi-hokusai.png」という画像ファイルが出力されているはずです。
初回描画にかかった時間:約2時間半!!
2回目以降で1時間半くらいでした(遅すぎる…)
今回、Stable Diffusionに与えたpromptは「raspberry pi painted by Katsushika Hokusai」となります。
確かにラズベリーパイ!(期待と違うけど)
うーむ 北斎テイスト出ている!AI凄い!
まとめ
超非力なラズベリーパイでも、最新AI技術である画像描画処理を実行する事ができました!処理時間はいろいろ試すにはしんどいですが、こんな小型PCでも動かせるのは素晴らしい!ちなみに、同じ「呪文詠唱」でも作成される画像はランダムに変化します。同じ画像を確実に出力するのは出来ないので、この辺りはいろいろと試して、「呪文詠唱」のコツを調べていきたいですね!(ラズパイ以外で)
まとめ
- グラフィックカードもなく低メモリなラズパイでもStable Diffusionが動かせた!
- 処理時間が数時間単位!Stable Diffusionの「呪文」を試す環境としては不適切。
- ローカル環境で課金せずに使用制限なく使えるのは魅力的!
ラズベリーパイでも動かせるんだ!と「夢と希望」を
与えたかっただけなので実用的ではありません…
「素敵な画像を出力したいけど、なかなか呪文詠唱がうまくいかない・・・」とお悩みの召喚士さんのために、高レベル召喚士様の貴重な情報を調べてみました。「呪文詠唱」パターン&召喚画像を300枚以上のボリュームで紹介していますので、下記リンク先の記事も参考にしてみてください。