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 - GIMP編


いわゆる「AI」をPCで運用するには、GPUとVRAMをはじめとする潤沢な計算リソースが求められる。Intel OpenVINO*1を利用する"bes-dev/stable_diffusion.openvino"*2が登場し、普及機レベルのPCでも画像生成AIを動作させることができるようになった。
さらに"intel/openvino-ai-plugins-gimp"が登場し、GIMPプラグインGUIを介して、Stable Diffusionを操作できるようになった。Stable Diffusionを含む、5つの独自プラグインが用意されている。
github.com

この投稿では、GPUを搭載していない、ごく一般的なRAM=8GBのWindows PCで"intel/openvino-ai-plugins-gimp"をインストールし、動作させるまでの手順を紹介する。

コンテナや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

ツール

作業を始めるに際し、GIMPを含め次のツールを利用する。この投稿で使用しているバージョンを、"version"に示している。

version
GIMP 2.99.14
Visual Studio 2022 17.5.1
Python 3.10.11
GitHub Desktop
Git command
3.2.0
GIMP

GIMPは一般向けリリースではなく、開発版を利用すること。この投稿時点での最新バージョンは2.99.14だ。一般向けリリースの最新版は2.10.34だが、これでは動作しない。

既に一般向けリリースがインストールされていたとしても、開発版と並行利用することができる。開発版のインストールが一般向けリリースを上書きすることはない。

www.gimp.org

Visual StudioC++ build tools

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

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

Tools > Get Tools and Features...

visualstudio.microsoft.com

Python

PythonMicrosoft Storeからダウンロード、インストールすることができる。バージョン「3.10」をインストールする。

最新版は「3.11」だが、これは使用できない。Intel OpenVINO*3がまだ対応していないのだ。次期バージョンで対応するということだ。

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

www.microsoft.com

GitHub Desktop、あるいはGit command

プログラムとモデルのダウンロードにGitを用いる必要がある。Gitコマンドが利用できないのであれば、GitHub Desktopをダウンロード、インストールすると良い。
desktop.github.com

フォルダ

"intel/openvino-ai-plugins-gimp"の実態はPython仮想環境だが、GIMPプラグインとして機能するため、永続的に運用する前提でフォルダ構成を決める。

このプログラムはインストール用のbatファイル(install.bat)を用意しており、Python仮想環境名、パッケージの導入が定義されているのだが、さらに後続するPythonスクリプト中でもパッケージ導入、フォルダ作成などが定義されており、下手にユーザー独自の設定を介在させない方が良い。
この投稿では作業フォルダを除き、デフォルト構成を踏襲している。

path
作業フォルダ c:\myapp
git cloneしたフォルダ
インストール・フォルダ
c:\myapp\openvino-ai-plugins-gimp
Python仮想環境 c:\myapp\openvino-ai-plugins-gimp\gimpenv3
weightを保存 %userprofile%\openvino-ai-plugins-gimp\weights\
モデルを保存 %userprofile%\openvino-ai-plugins-gimp\weights\stable-diffusion-ov\stable-diffusion-1.4
プラグインの場所 C:\myapp\openvino-ai-plugins-gimp\gimpopenvino\plugins

"intel/openvino-ai-plugins-gimp"

プログラムのダウンロード

作業フォルダに移動し、GitHub Desktopあるは、Gitコマンドでプログラムをダウンロードする。

git clone git clone https://github.com/intel/openvino-ai-plugins-gimp.git
"install.bat"の編集と実行

インストール・フォルダ内の"install.bat"について、次の記述に含まれるパスを、インストール・フォルダの絶対パスへ書き直す。

🔎書き直し前

gimpenv3\Scripts\python.exe -m pip install openvino-ai-plugins-gimp\.


🔎書き直し後

gimpenv3\Scripts\python.exe -m pip install C:\myapp\openvino-ai-plugins-gimp.

相対パスを指定した場合、"install.bat"の実行場所次第では、本来意図されていない場所で導入作業が実施されることになる。そのような事態を避けるため、導入場所を明示している。

編集したbatファイルを実行する。

weights情報のコピー

batファイルの一連の作業が終了したら、次の「コピー元」配下にある全データを、「コピー先」配下へコピーする。

🔎コピー元

C:\myapp\openvino-ai-plugins-gimp\weights\


🔎コピー先

%userprofile%\openvino-ai-plugins-gimp\weights\

GitHubではWindows環境変数である「%userprofile%」を含む引数を指定したxcopyコマンドを実行しているが、これは注意したほうが良い。コマンドプロンプトで実行するには問題ないが、PowerShellで実行する場合、環境変数の記述「$env:userprofile」のように変更しなければならない。
フォルダ中の全データをコピー&ペーストするだけなのだから、File Explorer上の手作業で済ませればよい。

Stable-Diffusion-1.4モデルのダウンロード、コピー

適当なフォルダに移動し、GitHub Desktopあるは、Gitコマンドでプログラムをダウンロードする。

git clone https://huggingface.co/bes-dev/stable-diffusion-v1-4-openvino/tree/main

ダウンロードした全ファイルを、次のフォルダへコピーする。

%userprofile%\openvino-ai-plugins-gimp\weights\stable-diffusion-ov\stable-diffusion-1.4
"gimp_openvino_config.json"のコピー

次の「コピー元」に保存されている"gimp_openvino_config.json"を、「コピー先」のフォルダへコピーする。

🔎コピー元

C:\myapp\openvino-ai-plugins-gimp\gimpopenvino\tools\


🔎コピー先

C:\myapp\openvino-ai-plugins-gimp\gimpenv3\Lib\site-packages\gimpopenvino\tools\

GIMPプラグイン設定、再起動

GIMPを起動し、次のメニュー、設定画面を辿る。

Edit > Preferences
Folders > Plug-ins

次のフォルダを登録し、GIMPを再起動する。

C:\myapp\openvino-ai-plugins-gimp\gimpopenvino\plugins


GIMPを再起動し、新規作成すると、OpenVINO-AI-Pluginsが有効化される。次のメニューからStable Diffusionを含む、それぞれの機能にアクセスできる。

Layer > OpenVINO-AI-Plugins

Stable Diffusionの実行

Stable Diffusion設定画面の主要項目は以下の通りだ。

Enter text to generate imge いわゆるプロンプト
求める画像の説明を指定する
Negative Prompt いわゆるプロンプト
求める画像に反映したくない要素を指定する
Number of Inherence steps 推論回数
回数が多いほど、画像出力までの時間が長くなる
Seed 乱数シード
乱数生成の再現を担保する

この投稿で使用しているSurface Pro 4の様なスペックの環境を前提としたとき、画像出力までに要する時間、推論回数は以下の通りだ。

推論回数 出力時間
8 3分
16 6分
32 10分
50 15分

なるべく少ない推論回数で試行錯誤し、方向性が定まったら、その時のSeedを引き継いで推論回数だけを増やすと、効率よく画像出力できる。次の画像は、推論回数=8, 16, 32, 50と変化させて出力したものだ。

prompt Cleopatra, art of Mucha and Utamaro, in style of movie
negtive prompt ugly, deformed

ミュシャ歌麿風にクレオパトラを描写させるべく推論させた。推論回数が進むほどに、ラフから詳細化していくかのように、

  • 背景、装飾→よりミュシャ的に
  • 顔立ち→よりハーフ的に

特定部位の特徴が鮮明になっていくのが理解できる。より顔のアップが描写されるようプロンプトを微調整し、推論回数=50で仕上げたのが冒頭の画像だ。