2023年05月06日追記
GUIが必要なユーザー宛
この投稿で紹介しているソリューションにはGUIがない。GUIを求めるユーザーには、GIMPプラグインとしてのインストールをおすすめする。導入方法を、次の投稿で紹介している。
ちなみにGUIの有無に関わらず、画像出力に要する時間に変わりはない。
impsbl.hatenablog.jp
Anacondaユーザー宛
この投稿では、Microsoft Storeで配布されているPythonを用いている。その代わりにAnacondaを用いる場合の手順を、次の投稿で紹介している。関心があれば参照してほしい。
impsbl.hatenablog.jp
本文
いわゆる「AI」をPCで運用するには、GPUとVRAMをはじめとする潤沢な計算リソースが求められる。"bes-dev/stable_diffusion.openvino"*1(以下SDOV)が登場し、普及機レベルのPCでも画像生成AIを動作させることができるようになった。
この投稿では、GPUを搭載していない、ごく一般的なRAM=8GBのWindows PCでSDOVをインストールし、動作させるまでの手順を紹介する。
コンテナやWSLも用いない。RAM=8GBという、非常に制約のある環境においては、それらを用いるよりも直接動作させた方が良い。直接プログラムを動かすことで、RAM=8GBという制約のある環境においても、SDOVを安定して動作させることができる。
コンテナやWSLを用いる場合、それらに対する計算リソースの割り当てをWindows OSがコントロールする。結果として発生するのがOOM Kill、つまりメモリ不足に伴うプロセスの強制終了だ。RAM割当を管理したり、OOM Killを抑制したり、対処法はあるのだが推奨される方法ではない。
コンテナに対して --oom-kill-disable を指定したりするようなことはやめてください。
メモリ、CPU、GPU に対する実行時オプション — Docker-docs-ja 19.03 ドキュメント
この投稿では、Microsoft Surface Pro 4を使用している。次のスペックを有しており、これでも画像1枚を10~12分程度で出力できる。
OS | Windows 11 Pro 22H2 |
CPU | Intel Core i7-6650U |
RAM | 8GB |
Storage | SSD: 256GB SD card: 32GB |
ツール
作業を始めるに際し、必要なツールを揃える。次のツールを利用する。この投稿で使用しているバージョンを、"version"に示している。
version | |
---|---|
Visual Studio 2022 | 17.5.1 |
Python | 3.10.10 |
GitHub Desktop Git command |
3.2.0 |
Visual Studio、C++ build tools
Pythonパッケージのインストールに際し、C++ビルドツールが必要となる。このツールはVisual Studio、あるいは"Build Tools for Visual Studio"に収録されている。作業を開始する前に、いずれかを適切なオプションとともにインストールしておく。
Visual Studioの場合、次のようにアクセスして「C++によるデスクトップ開発」をインストールする。オプションはデフォルトで良い。
Tools > Get Tools and Features...
Python
PythonはMicrosoft Storeからダウンロード、インストールすることができる。バージョン「3.10」をインストールする。
最新版は「3.11」だが、これは使用できない。Intel OpenVINO*2がまだ対応していないのだ。次期バージョンで対応するということだ。
Python 3.11 is in progress and will be available in 2023.0 release.
GitHub Desktop、あるいはGit command
SDOBを導入するために、Gitを用いる必要がある。Gitコマンドが利用できないのであれば、GitHub Desktopをダウンロード、インストールすると良い。
desktop.github.com
フォルダ
この投稿での作業は、全て次のフォルダ下で実施する。このフォルダを「プロジェクト・フォルダ」と呼ぶことにする。
d:\2023\testrun\
Python仮想環境の名前を「myenv」とすると、そのパスは次のようになる。
d:\2023\testrun\myenv\
クローン(ダウンロード)されたSDOVは、次のフォルダに収容される。このフォルダを「SDOVフォルダ」と呼ぶ。
d:\2023\testrun\stable_diffusion.openvino\
画像は「output.png」として、このフォルダへ出力される。同名のファイルが存在していたら、上書きされる。
d:\2023\testrun\stable_diffusion.openvino\output.png
"bes-dev/stable_diffusion.openvino"
GitHub Desktopを用いるなら、次の画像の設定でダウンロードする。
Gitならば、次のコマンドを実行する。
git clone https://github.com/bes-dev/stable_diffusion.openvino
requirements.txtの編集
SDOVフォルダに"requirements.txt"というファイルが格納されている。必要なPythonパッケージと、それらのバージョンが定義されている。依存関係上の不整合を解消するため、特に次の事柄をファイルに反映する。
- 最新版のnumpyを使う
- "openvino-dev"をダウンロードする
- Ver 1.9.0よりも古いscipyを使う
新しい"requirements.txt"は次のように記述される。
🔎Descriptions of new "requirements.txt"
diffusers==0.2.4 ftfy==6.1.1 huggingface_hub==0.9.0 numpy opencv-python==4.5.5.64 openvino==2022.3.0 openvino-dev[onnx,pytorch]==2022.3.0 piexif==1.1.3 pillow==9.0.1 scipy<1.9.0 streamlit_drawable_canvas==0.9.1 streamlit==1.12.0 tqdm==4.64.0 transformers==4.16.2 watchdog==2.1.9
管理者権限
ここからのコマンド操作はWindows Terminal (PowerShell)を用いる。特に"demo.py"を実行するに際し、管理者権限を要求される。Windows Terminalを管理者として起動する必要があるので、注意すること。
環境構築
次のコマンドを実行することで、プロジェクト・フォルダへ入り、Python仮想環境を構築し、有効化する。
cd d:\2023\testrun\ python -m venv myenv .\myenv\Scripts\Activate.ps1
さらに次のコマンドを実行することで、SDOVフォルダへ入り、必要なPythonパッケージをインストールする。
cd .\stable_diffusion.openvino\ python -m pip install --upgrade pip pip install -r ./requirements.txt
Stable Diffusionの実行
ユーザーが求める画像の説明をpromptオプションに指定して、コマンドを実行する。"bes-dev/stable_diffusion.openvino"のGitHubページにある「Example Text-To-Image」では、次のように記述されている。
python demo.py --prompt "Street-art painting of Emilia Clarke in style of Banksy, photorealism"
これを実行すると、必要なモデルのダウンロード後に、次のような画像が出力される。
この投稿のトップ画像は、次にコマンドを実行したものだ。
python demo.py --prompt "Stable Diffusion on 8GB Windows PC, no GPU, no container"
いずれも約10分で出力されていることが分かる。
余談
学生時代、320×240の3D CGのレンダリングにすら数時間では済まない、下手をすると一昼夜から丸一日を超える時間を費やしていた。その経験からすれば、画像1枚とはいえ、それが膨大な計算の結果であることを思えば、10分程度の時間は何ということはない。
とはいえITの本質を前提に、それが適切に反映された使用方法を考えると、やはり普及機レベルのPCで動作させることに大きな意味はない。
ITの本質とは、コンピュータの特性を活かした力技だ。
- コンピュータは高速に処理できる。
- コンピュータは同じことを正確に繰り返しできる。
- コンピュータは疲れない。
今回の画像生成で言えば、一つの指示に対して高速に、多数出力させる。そのうち一つでも「当たり」と思える成果があれば、それでOKということだ。もし同じことを人手に頼るならば、どれだけの人数、工数が必要となるだろう。非常に優秀な一人に頼むにしても、物理的な限界がある。
さらに「ダメ出し」の可能性まで考えれば、OKまでの試行錯誤を考えても、やはり高速、正確に繰り返せるほど有利だ。
たとえ画像1枚の出力に10分を要したとしても、それが家庭用PCで実現できるならば、趣味や娯楽の面においては有意義なものだろう。しかし生産的な方面に向かおうとすれば、やはりこれではダメなのだ。
もはやオープンソースだからといって、それがたとえファッションの類であっても「民主的」等と表現できる時代ではなくなった。