Ubuntu日和
【第25回】Stable DiffusionをUbuntuとGTX 1650で動作させる方法
2023年4月15日 06:19
最近は猫も杓子もAIということで、本連載でも扱うことになった。まず最初に扱うのがStable Diffusionというのは、おおむね適切な選択であろう。
Stable Diffusionはさまざまな実行環境があり、今回はStable Diffusion web UIを使用する。これも適切な選択であろう。プラットフォームを問わないので、もちろんUbuntuでも動作する。
Stable Diffusionは機械学習ライブラリであるPyTorchを採用している。PyTorchはハードウェアアクセラレーションに対応しており、現在はNVIDIAのCUDAとAMDのROCmに対応している。Intelも独自版PyTorchを用意しており、理屈の上ではNVIDIA、AMD、Intelのどのプラットフォームでも快適に動作するはずだ。現実的にはなかなか難しいのだが(経験者談)。
しかしStable Diffusion web UIはNVIDIAがおすすめとのことで、これもCUDAの普及状況を考えれば適切な選択といえる。
今回使用したハードウェア
今回使用したハードウェアのスペックは次のとおりだ。
機材 | 型番 |
---|---|
CPU | Ryzen 7 3700X |
CPUクーラー | SCYTHE 手裏剣2 |
メモリー | Crucial CT2K32G4DFD832A |
SSD | Western Digital WDS100T2B0C |
dGPU | GeForce GTX 1650 AERO ITX 4G OC |
ベアボーン | ASRock DeskMeet X300/B/BB/BOX/JP |
そう、第15回で使用したものほぼそのままである。
賢明な読者諸氏はすでにお気づきのことだろうが、Stable Diffusionを使用するにはGeForce GTX 1650では著しく性能が足りない。ただしこれも考えようで、とりあえず手持ちのハードウェアで動作させてみて、より興味が湧いたら上位のdGPUを購入するといい。筆者の場合はDeskMeet X300という制約があるのでGeForce RTX 3060 AERO ITX 12G OCあたりが狙い目だが、約5万円(本記事掲載時点)はなかなかの出費だ。
Ubuntuの設定
使用するUbuntuのバージョンは22.04 LTSとする。Stable Diffusion web UIで要求しているPythonのバージョンは3.10.6とのことで、実はUbuntu 22.04 LTSにインストールされているバージョンと合致している。そう、Windowsのように別途Pythonをインストールする必要はないのだ。
あとはNVIDIAのプロプライエタリなドライバーをインストールする必要もある。これは第15回で紹介したとおり、「追加のドライバー」を使用するのが簡単だ。第15回の段階では最新版が520だったが、現在は525だ。これをインストールしよう。
nvidia-smiコマンドを実行すると、CUDAのバージョンを表示できる。12.0とのことで少し新しすぎるので、dGPUが許せば515を選択するのも手だ。こちらだとCUDAのバージョンは11.7であり、PyTorchが要求しているバージョンと近くなる。ただし今回は525を使用する。
Stable Diffusion web UIのインストール
ではいよいよStable Diffusion web UIをインストールし、実際に動作させる。ただひたすらに次のコマンドを実行して欲しい。
$ sudo apt install curl gnupg2 git python-is-python3 python3.10-venv python3-pip
$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
$ cd stable-diffusion-webui
$ python launch.py
実行後はいろいろとダウンロードするので待つ必要がある。
なおUbuntuではpythonコマンドを実行すると暗黙としてPython 2が実行される。しかしこの22.04 LTSにはデフォルトではPython 2はインストールされないため、pythonコマンドが存在しないことになる。そこで「python-is-python3」というパッケージをインストールすると、pythonコマンドを実行すればPython 3が使用されるようになる。まさに今回の用途にピッタリだ。代わりにpython3コマンドを実行する手もある。
もし途中で失敗するようなことがあれば、4行目をもう1度実行して欲しい。
Stable Diffusion web UIを使用する
端末に「Running on local URL」が表示されたら、Stable Diffusion web UIが正しく動作したことになるので、Firefoxでアクセスしてみよう。
Stable Diffusion web UIの具体的な使い方に関しては、検索すれば山ほど情報が出てくるのでここでは紹介しない。今回試しに、たまたまその時聴いていたGeorge Harrisonの歌にちなんで「sour milk sea」というプロンプトを入力してみた。厳密にいえばGorge Harrisonがほかのミュージシャンに贈った曲だが。
もちろんこんな無茶ぶりにも答えてくれる。
しかし画像の生成途中でエラーが出てしまった。「CUDA out of memory」とのことである。
GeForce GTX 1650のメモリは4GBしかないため、足りなくなって当然だ。このような場合は、「lowvram」というオプションをつける。さらに「xformers」というオプションを追加すると、新しくライブラリをインストールしてメモリー等の負荷を減らすことができる。
具体的には次のようなコマンドを入力する。
$ python launch.py --lowvram --xformers
「lowvram」のほかにも「medvram」というオプションもある。また「share」オプションをつけると、インターネット経由でアクセスできるようになる。
Stable Diffusion web UIを簡単に使用するために、シェルスクリプトを作成するといいだろう。次はあくまで例であるが、このような感じでいいだろう。
$ mkdir ~/bin
$ editor ~/bin/sd-webui.sh
#!/bin/bash
#上1行と下2行をスクリプトに転記する
cd ~/stable-diffusion-webui
python launch.py --lowvram --xformers
$ chmod +x ~/bin/sd-webui.sh
これでホームフォルダー直下にあるsd-webui.shを端末から実行すると、起動するようになった。なお現在のUbuntuはシェルスクリプトをダブルクリックして実行する機能はなくなっているため、原則としては端末から起動することになる。
ほかのPCから接続するのにインターネット経由(しかも時間制限つき)はちょっと大掛かりすぎるので、もっと別の方法はないか考えるのは自然であろう。単純にApacheやNGINXでリバースプロキシを設定すればいいのだが、今回の主旨からはだいぶ外れるので具体的な方法は紹介しない。WindowsだとほかのPCからのアクセスにはライセンス上制限があったように記憶しているが、Ubuntuには特にないので、そのあたりはUbuntuを使用するメリットであろう。
肝心の生成時間は、デフォルトで1分20秒、オプションを盛ると2分40秒にまで増え、正直なところ実用的とはいえない。やはりGeForce RTX 3060 AERO ITX 12G OCを買うことにした。買ってきてGPUを交換してlowvramオプションを削除するだけで速くなるのはお手軽だ。
おまけ: GNOME ShellからStable Diffusion web UIを起動する
いちいち端末を起動してStable Diffusion web UIを起動するのが面倒な場合は、GNOME Shellから起動できるようにする方法もある。
まずは、以下の内容でホームフォルダー直下にsd-webui.desktopを作成する。
[Desktop Entry]
Type=Application
Name=Stable Diffusion web UI
Comment=Stable Diffusion web UI wrapper script
Exec=/home/(ユーザー名)/bin/sd-webui.sh
Icon=/home/(ユーザー名)/stable-diffusion-webui/screenshot.png
Terminal=true
「(ユーザー名)」はログインしているユーザー名に置き換えて欲しい。拡張子がdesktopのファイルは、フルパスにする必要があるからだ。
続けて次のコマンドを実行する。
$ desktop-file-install --dir=$HOME/.local/share/applications ~/sd-webui.desktop
$ update-desktop-database ~/.local/share/applications
アイコンの画像は適当なものだが、これでGNOME Shellから起動できるようになった。