Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

GPU無し、コンテナも使わない、RAM=8GBのWindows PCでStable Diffusion - Anaconda編

2023年05月06日追記

GUIが必要なユーザー宛

この投稿で紹介しているソリューションにはGUIがない。GUIを求めるユーザーには、GIMPプラグインとしてのインストールをおすすめする。導入方法を、次の投稿で紹介している。
ちなみにGUIの有無に関わらず、画像出力に要する時間に変わりはない。
impsbl.hatenablog.jp

Pythonユーザー宛

この投稿では、通常のPythonではなく、Anacondaを用いている。通常のPythonを用いる場合の手順を、次の投稿で紹介している。関心があれば参照してほしい。
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
Anaconda 3.9
GitHub Desktop
Git command
3.2.0
Visual StudioC++ build tools

Pythonパッケージのインストールに際し、C++ビルドツールが必要となる。このツールはVisual Studio、あるいは"Build Tools for Visual Studio"に収録されている。作業を開始する前に、いずれかを適切なオプションとともにインストールしておく。

Visual Studioの場合、次のようにアクセスして「C++によるデスクトップ開発」をインストールする。オプションはデフォルトで良い。

Tools > Get Tools and Features...

visualstudio.microsoft.com

Anaconda

www.anaconda.com
もしAnacondaのインストールが初めての場合、インストール後に”Anaconda Powershell Prompt (anaconda3)”で次コマンドを実行すること。

conda update conda -y
cond aupdate anaconda -y


この投稿時点では、AnacondaはPython 3.9.16を提供している。最新版は「3.11」だが、これは使用できない。Intel OpenVINO*2がまだ対応していないのだ。次期バージョンで対応するということだ。

Python 3.11 is in progress and will be available in 2023.0 release.

Failed install - following step by step instructions - no requirements of Python mentioned upfront. It fails on Python 3.11 · Issue #15287 · openvinotoolkit/openvino · GitHub

GitHub Desktop、あるいはGit command

SDOBを導入するために、Gitを用いる必要がある。Gitコマンドが利用できないのであれば、GitHub Desktopをダウンロード、インストールすると良い。
desktop.github.com

フォルダ

この投稿での作業は、全て次のフォルダ下で実施する。このフォルダを「プロジェクト・フォルダ」と呼ぶことにする。

d:\2023\testrun\

Anacondaが”d:\myapp\anaconda3\”にインストールされている場合、Python仮想環境は、その配下の”envs”フォルダに収容される。その名前が「myenv」とすれば、そのパスは次のようになる。

d:\myapp\anaconda3\envs\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

管理者権限


ここからのコマンド操作は”Anaconda Powershell Prompt (anaconda3)”を用いる。特に"demo.py"を実行するに際し、管理者権限を要求される。Windows Terminalを管理者として起動する必要があるので、注意すること。

環境構築

次のコマンドを実行することで、プロジェクト・フォルダへ入り、Python仮想環境を構築し、有効化する。

cd d:\2023\testrun\
conda create -n myenv python=3.9 -y
conda activate myenv

”conda”コマンドと”pip”コマンドの併用を、Anacondaは推奨していない*3。どちらか一つだけを使用するのが、一つのベストプラクティスだ。この投稿では”pip”のみを用いる。
次のコマンドを実行することで、SDOVフォルダへ入り、必要なPythonパッケージをインストールする。

cd .\stable_diffusion.openvino\
pip install -r ./requirements.txt
Stable Diffusionの実行

ユーザーが求める画像の説明をpromptオプションに指定して、コマンドを実行する。

python demo.py --seed 1 --num-inference-steps 18 --prompt "Emilia Clarke in style of MuCha"
python demo.py --seed 1 --num-inference-steps 18 --prompt "Emilia Clarke in style of Utamaro"
python demo.py --seed 1 --num-inference-steps 18 --prompt "Emilia Clarke in style of MuCha and Utamaro"

”num-inference-steps”の規定値は32だ。処理時間を短縮するため、推論回数を18へと減らしている。これを実行すると、必要なモデルのダウンロード後に、次のような画像が出力される。

少ない推論回数で始めて、方向性を確認し、問題が無ければ推論回数を増やす。先の出力に基づいて推論を深めるために”seed”を設定しておく。

python demo.py --seed 1 --num-inference-step 6 --prompt "AI painter in style of MuCha"
python demo.py --seed 1 --prompt "AI painter in style of MuCha"

6回の推論では2分で、32回では8分で画像が出力された。推論回数を深めると、女性像がよりミュシャ的になっていく。

余談

学生時代、320×240の3D CGのレンダリングにすら数時間では済まない、下手をすると一昼夜から丸一日を超える時間を費やしていた。その経験からすれば、画像1枚とはいえ、それが膨大な計算の結果であることを思えば、10分程度の時間は何ということはない。
とはいえITの本質を前提に、それが適切に反映された使用方法を考えると、やはり普及機レベルのPCで動作させることに大きな意味はない。

ITの本質とは、コンピュータの特性を活かした力技だ。

  • コンピュータは高速に処理できる。
  • コンピュータは同じことを正確に繰り返しできる。
  • コンピュータは疲れない。

今回の画像生成で言えば、一つの指示に対して高速に、多数出力させる。そのうち一つでも「当たり」と思える成果があれば、それでOKということだ。もし同じことを人手に頼るならば、どれだけの人数、工数が必要となるだろう。非常に優秀な一人に頼むにしても、物理的な限界がある。
さらに「ダメ出し」の可能性まで考えれば、OKまでの試行錯誤を考えても、やはり高速、正確に繰り返せるほど有利だ。

たとえ画像1枚の出力に10分を要したとしても、それが家庭用PCで実現できるならば、趣味や娯楽の面においては有意義なものだろう。しかし生産的な方面に向かおうとすれば、やはりこれではダメなのだ。

もはやオープンソースだからといって、それがたとえファッションの類であっても「民主的」等と表現できる時代ではなくなった。