WSLでStable Diffusionを動かしてみた

最近生成AIめちゃくちゃ注目されてますね。

普段はGithub Copilotでコードを書いてもらったりChat GPTでちょっとしたブレストに活用したりしていますが、画像生成AIも気になってはいます。

そんな中、先日OSSカンファレンスが名古屋で開催されました。

ospn.connpass.com

今年はセミナーもオフラインになって久々の完全オフラインが復活し久々にお会いする方たちとお話できて、最高に楽しい1日でした。

このセミナーの中でも生成AIをテーマにしたセッションがいろいろあり、その中でStable DiffusionをさくらのクラウドGPUインスタンスで動かすセッションがありました。

以下のQiita記事がベースです。

qiita.com

この記事では、さくらクラウドGPUインスタンスを使用してStable Diffusionを動かしている話なのですが、インスタンスで使用しているGPUのスペックは固定で、NVIDIA V100(VRAM 32GB)を使っています。

AI用の演算に特化したGPUクラウドで使えるのは便利だと思いますが、ちょっとお試しするのに契約が手間だと感じました。

せっかく手元にCUDAに対応した低スペGPUを持っているわけなのでそれでやったほうが安上がりだと思いました。

つまり何が言いたいかというと、ローカルで手軽にStable Diffusionを手軽に試してみたいと思います。(前置き長い…)

スペック

普段遣いしているメインPCは、DELL Precision 3430でスペックは以下の通りです。大須の佐古前装備で購入し、メモリとGPUはその時在庫にあったもので換装しています。

今まで実家ではもっとハイスペックなPCを使ってましたが、めちゃくちゃ電気を食うのと場所を取るので、一人暮らしにあたり程よい大きさのメーカー製PCで良さげなやつを使うようになりました。

ミニタワーPCなので使えるGPUに限りがありますが、Quadroなら古のミニディスプレイが4つもあるのでデュアルディスプレイがかなり快適になります。何より今まで寝かせてたミニディスプレイアダプタがまたこうやって活用できたのもデカいです。

動作環境

今回の動作環境は以下の通りです。今回はGPUを動かしてみたかったのでWSL上でDockerを動かす想定で進めていきます。Ubuntuをインストールしても良かったですが、わざわざセットアップするのも面倒だったので、WindowsをホストOSとして動かせるようにしていきます。

  • Windows11
  • WSL2
  • Docker Desktop 4.30.0

セットアップ

NVIDIAドライバのインストール

まずは以下のURLからGPUのドライバーをお使いのPCのOS、GPUに合わせてインストールします。

今回はWSL上で動作させるようにしますが、GPUドライバについてはホストOSであるWindows用のドライバでセットアップする必要があります。

www.nvidia.co.jp

ここからはWSL上でセットアップを進めていきます。

WSLはコマンドプロンプトPowerShellwsl と入力するだけで起動できます。

WSLを起動したら以下のコマンドを実行し、GPUドライバがあたっているか確認します。

nvidia-smi

以下の実行結果が表示されれば問題ありません。もし、エラーが出る場合はPCを再起動してお試しください。

Sun Jun  2 23:44:09 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 555.42.02              Driver Version: 537.70         CUDA Version: 12.2     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Quadro P620                    On  |   00000000:01:00.0  On |                  N/A |
| 37%   50C    P8             N/A /  N/A  |     686MiB /   2048MiB |     20%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

NVIDIA Container Runtimeのセットアップ

続いてNVIDIA Container Runtimeをセットアップします。

まずは以下のコマンドでパッケージのレポジトリを登録します。

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

続いてパッケージリストを更新して、NVIDIA Container Runtimeをインストールします。

sudo apt update
sudo apt install nvidia-container-toolkit

インストールできたか確認するために、以下のコマンドで動作確認用のコンテナを動かしてみます。

docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

wsl上で確認した時と同様に nvidia-smi の実行結果が返ってきたらDockerのGPU環境は正常セットアップできています。

Stable Diffusionを動かす

セットアップ

以下のコマンドでソースコードをクローンします。

git clone https://github.com/AbdBarho/stable-diffusion-webui-docker.git

クローンしたら以下のコマンドで必要なモデル、ファイルをダウンロードします。ダウンロードするファイルは12GBほどあるので結構時間がかかります。

cd stable-diffusion-webui-docker
docker compose --profile download up --build

WebUIを起動する

実際にStable Diffusionを起動します。

起動には以下のコマンドを実行します。

docker compose --profile auto up --build

実行するとログが流れますが、以下の通りローカルのURLが表示されたら正常に起動しています。

auto-1  | Installing extension dependencies (if any)
auto-1  | Loading weights [c6bbc15e32] from /stable-diffusion-webui/models/Stable-diffusion/sd-v1-5-inpainting.ckpt
auto-1  | Running on local URL:  http://0.0.0.0:7860

ブラウザで http://localhost:7860 を入力するとWebUIが開きます。

動かしてみる

これでStable Diffusionが立ち上がりました。

試しに犬の画像を生成してもらいます。pronptに dog と入力して「Generate」ボタンをクリックすることでしばらく待ちます。

すると以下の通り無事に画像が生成されたことが確認できました。

画像生成中に nvidia-smi を叩くと以下の通りGPUが機能していることが確認できます。

Mon Jun  3 00:58:00 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 555.42.02              Driver Version: 537.70         CUDA Version: 12.2     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Quadro P620                    On  |   00000000:01:00.0  On |                  N/A |
| 46%   61C    P0             N/A /  N/A  |    1808MiB /   2048MiB |    100%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A        72      C   /python3.10                                 N/A      |
+-----------------------------------------------------------------------------------------+

タスクマネージャで確認してもGPUが問題なく機能していることが確認できました。こうしてみるとやはりVRAMが2GBということもあって100%近く使っていますが、それでも問題なく画像生成できています。

余談ですが、冒頭の画像は今回構築した環境でプロンプトを hacker 、ネガティブプロンプトで worst quality,ugly,bad anatomy,jpeg artifacts を設定して生成した画像です。

まとめ

今回はWSLを使ってWindowsでStable Diffusionを動かす方法を試しました。

昔はWSLはあまり使い勝手がいい印象がなかったのですが、ここ最近公式でもGPU対応するようになり、これでGPUを使うためだけにデュアルブートをする必要がなくなります。

そして、話題の生成AIなのでハイスペックなGPUを使わないといけないのかと思いきやVRAMの少ないロープログラボでもちゃんと動作することがわかりました。

そんなにPCでゲームをするわけでもなくて普段遣いのGPUはそこまでハイスペックである必要もないなので、これは結構助かりますね!

参考

learn.microsoft.com

romptn.com