2023/09/16 # Stable Diffusion web UI + WSL + Ubuntu で環境構築 ## ブログの引っ越し 当ブログは[takemi.blog](https://takemi.blog/)に移行しました。 より見やすい[Stable Diffusion web UI + WSL + Ubuntuの環境を構築する](https://takemi.blog/6e7ab7a6bcba4be8bd8997262f8f1954/)をご利用ください。 ## 作成日時 2023/01/30 ## 概要 コマンドで実行する通常のStable Diffusionを使っていましたが、色々と使い勝手が悪いので、一番人気のあるStable Diffusion web UIに環境を変更しました。 最初は共存させようと思ったけど色々考えるのが面倒くなり、前環境を捨てて作り直しました。気軽にこれが出来るのがWSLのメリットですね。 ## 筆者の環境 筆者の環境は以下です。 + Core i7 + 32GB + GeForce RTX 3090 + Windows 11 + WSL2 Ubuntu 22.04.1 LTS + Stable Diffusion web UI \(2023/01/29時点のCommit\) ## \[Ubuntu\] 前準備 まずはUbuntuを更新しておきましょう。 インストール済みのUbuntuは削除しているので、私の環境はストアからインストールした初期状態です。 ```sh sudo apt update sudo apt upgrade -y ``` あって困るものでは無いのでgit-lfsも入れておきます。 ```sh sudo apt-get install git-lfs ``` ## \[Windows\] NVIDIAドライバのインストール と言いたいところですが、NVIDIA製GPUを搭載して通常利用しているPCであれば普通はドライバが入っています。 筆者のようにNVIDIA GeForce Experienceを利用すると楽ですが、ドライバだけ欲しい人は[公式サイト](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)で必要なの探してください。 ## \[Ubuntu\] NVIDIAドライバ確認 注意点としてUbuntu側にNVIDIAドライバは不要です。 先程のWindows側ドライバが入っている場合、以下のコマンドでUbuntu側からもGPUを認識できます。 ```sh nvidia-smi ``` これを実行すると、こんな感じの表が出ます。 この途中に`NVIDIA GeForce....`みたいな表示があればGPUは認識できています。 ```sh +-----------------------------------------------------------------------------+ | NVIDIA-SMI 527.92.01 Driver Version: 528.02 CUDA Version: 12.0 | |-------------------------------+----------------------+----------------------+ | 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 NVIDIA GeForce ... On | 00000000:01:00.0 On | N/A | | 43% 32C P8 33W / 350W | 1799MiB / 24576MiB | 21% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 23 G /Xwayland N/A | +-----------------------------------------------------------------------------+ ``` ## \[Ubuntu\] CUDA Toolkitのインストール 次にCUDA Toolkitをインストールするのですが、ここで注意点があります。 本記事を作成した時点の最新版は*CUDA Toolkit 12.0*となるのですが、後にインストールするcuDNNが12.0に対応してないので、過去版をインストールします。 なお、nvidia-smiでCUDA Version: 12.0と出てますが、NVIDIAドライバを古くする必要はありません。 それでは以下から過去のバージョンを探しましょう。 https://developer.nvidia.com/cuda-toolkit-archive 今回は過去版で一番新しい*CUDA Toolkit 11.8*を採用します。 https://developer.nvidia.com/cuda-11-8-0-download-archive 入手と言ってもファイルを落とす形式ではなく、自身の利用する環境を選択すると、インストールに必要なコマンドを表示してくれます。 と言うことで、上から順番に以下を選択します。なお、対象のUbuntuがWSLであることを忘れずに! Linux -> x86_64 -> WSL-Ubuntu -> 2.0 -> deb (local) ![環境選択](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjatQ3SHGSsyTV_-YUJ235z5zAW_enNV6rZVQYlrPozsOGoYF0_HYcP30pp7HJzUAZSLKVFprXqAJCB8r9sBSg8rLRjmERsU-9oKpS2icpluwpFuazWwKFSwf9fyulQzF_ssA_FenCqMt--3B1xKBtGNZX8sGhJRP-OZX8NW1XEYeuebxyPxfF5g4D1gw/s320/20230111.0213.CUDA%20Toolkit.png) そうすると、こんな感じのコマンドが表示されるので順番に実行します。 ```sh wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600 wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb sudo dpkg -i cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb sudo cp /var/cuda-repo-wsl-ubuntu-11-8-local/cuda-*-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get -y install cuda ``` ただし、4番目のコマンド`sudo dpkg -i cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb`を実行すると`To install the key, run this command:`って感じに、次のコマンドを実行せよと指示されます。 指示されたコマンドと次の5番目のコマンドを良く見ると分かるのですが、cuda-\*-keyringって感じに\*でパスが記述されており、これのフルパス版だと思います。 とりあえず、指示に従ってフルパス版のコマンドを実行しておきましょう。\(Linux良く分からん。きっとワイルドカード的なやつだな\) インストールが完了したらPATHを設定します。PATHにはバージョン番号が入るので筆者と違う人は注意してください。 心配な人はlsとかでインストールしたPath自体を存在確認しましょう。 ```sh export CUDA_PATH=/usr/local/cuda-11.8 echo 'export CUDA_PATH=/usr/local/cuda-11.8' >> ${HOME}/.bashrc ``` ```sh export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:${LD_LIBRARY_PATH} echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:${LD_LIBRARY_PATH}' >> ${HOME}/.bashrc ``` ```sh export PATH=/usr/local/cuda-11.8/bin:${PATH} echo 'export PATH=/usr/local/cuda-11.8/bin:${PATH}' >> ${HOME}/.bashrc ``` そしてシェル再起動 ```sh exec "$SHELL" ``` 最後に、以下のコマンドでインストールしたCUDA Toolkitのバージョンを確認します。 ```sh nvcc -V ``` こんな感じの表示が出ればOK ```sh nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Wed_Sep_21_10:33:58_PDT_2022 Cuda compilation tools, release 11.8, V11.8.89 Build cuda_11.8.r11.8/compiler.31833905_0 ``` ## \[Windows\] WSL再起動 一度Ubuntuから出てWindows側からWSLを再起動 ``` wsl.exe --shutdown ``` ## \[Windows\]\[Ubuntu\] cuDNNのインストール cuDNNはUbuntuから直接入手が出来ないのでWindows経由\(正確には公式Web経由\)で入手します。 なお、このファイルの取得にはアカウント登録が必要です。この辺の話は本題とは無関係なのでカットします。 それでは次のリンクからcuDNNを入手しましょう。 https://developer.nvidia.com/rdp/cudnn-download よくある、こんな感じの同意文言にチェックすると、さらに選択肢が出現します。 *I Agree To the Terms of the cuDNN Software License Agreement* ここで先程インストールしたCUDA Toolkitのバージョンに合うcuDNNをゲットします。 この時点での最新版は*v8.7.0*となります。 *Download cuDNN v8.7.0 (November 28th, 2022), for CUDA 11.x* これを選ぶと、さらに選択肢が出現します。ここから自分の環境に合うファイルが選べます。 Ubuntuのバージョンも筆者と同じなら、実際に落とすのは以下のファイルですね。 *Local Installer for Ubuntu22.04 x86_64 (Deb)* ファイルを入手できたら、このファイルをLinux側に転送します。 転送と言ってもWSLにはLinux側のディレクトリをWindows側のエクスプローラ経由で参照できる機能があります。 エクスプローラ左側に表示されるフォルダツリーからLinuxって部分を辿るか、以下のようにパスを指定します。 これはLinux側をuserってユーザー名で作っている場合にログイン時に指定されるディレクトリです。 `\\wsl.localhost\Ubuntu-22.04\home\user` で、ファイルをコピーしたらUbuntu側からインストールするので、ここからはUbuntuで作業します。 それでは先程ファイルをコピーしたディレクトリに移動しましょう。僕と同じ場所に配置したならログインした場所にあります。 インストールは以下のコマンドを実行します。 ```sh sudo dpkg -i cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb ``` そうすると、`To install the key, run this command:`って感じに次のコマンドを実行しろって言われます。 指示に従ってコマンドを実行します。筆者の場合は以下のコマンドでした。 ```sh sudo cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/ ``` 次のコマンドで実際にインストールする。 ```sh sudo apt update sudo apt -y install libcudnn8 libcudnn8-dev libcudnn8-samples ``` 本来ならcuDNNの動作確認とかしたほうが良いのですが、調べたら色々めんどかったのでOK前提でスルーしました。 ## \[Ubuntu\] CUDA関連のError対策 このままだと画像生成時に以下のErrorが出るので、先に解決しておきます。 ```sh could not load library libcudnn_cnn_infer.so.8. Error: libcuda.so: cannot open shared object file: No such file or directoryM Sampler: ``` 解決用のコマンドは以下です。 ```sh sudo ln -s /usr/lib/wsl/lib/libcuda.so.1 /usr/local/cuda/lib64/libcuda.so ``` ## \[Windows\] WSL再起動 一度Ubuntuから出てWindows側からWSLを再起動 ``` wsl.exe --shutdown ``` ## \[Ubuntu\] Python3のインストール 次にPython3をインストールします。 ```sh sudo apt install wget git python3 python3-venv -y ``` ## \[Ubuntu\] Stable Diffusion web UI \(本体\) 次に本体部分のインストールです。 ```sh git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git cd stable-diffusion-webui ./webui.sh ``` ここで一部のファイルがダウンロードされるため、コマンドの終了まで時間が掛かります。 また、この時点では学習モデルの配置をしていないため、以下のErrorで起動は失敗します。 ```sh No checkpoints found. When searching for checkpoints, looked at: - file /home/user/stable-diffusion-webui/model.ckpt - directory /home/user/stable-diffusion-webui/models/Stable-diffusion Can't run without a checkpoint. Find and place a .ckpt file into any of those locations. The program will exit. ``` ## \[Ubuntu\] Stable Diffusion web UI \(学習モデル\) 利用する学習モデルを配置します。*2.1版*だとErrorが出て解決できなかったので*2.0版*を使います。 ※ 将来的には別のModelを使う予定なので気が向いたら調査します。 ```sh cd ~/stable-diffusion-webui wget https://huggingface.co/stabilityai/stable-diffusion-2/resolve/main/768-v-ema.ckpt -O ./models/Stable-diffusion/768-v-ema.ckpt wget https://raw.githubusercontent.com/Stability-AI/stablediffusion/main/configs/stable-diffusion/v2-inference-v.yaml -O ./models/Stable-diffusion/768-v-ema.yaml ``` \[2023/04/18 追記\] 2.1版のモデルを追加する方法です。モデルが2種類あったので両方載せておきます。 ```sh cd ~/stable-diffusion-webui wget https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-ema-pruned.safetensors -O ./models/Stable-diffusion/v2-1_768-ema-pruned.safetensors ``` ```sh cd ~/stable-diffusion-webui wget https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-nonema-pruned.safetensors -O ./models/Stable-diffusion/v2-1_768-nonema-pruned.safetensors ``` ## \[Ubuntu\]\[Windows\] Stable Diffusion web UI \(実行\) Ubuntuで以下のコマンドを実行します。 ```sh cd ~/stable-diffusion-webui ./webui.sh ``` そうするとWindows側のブラウザで以下のURLにアクセスできます。 ``` http://127.0.0.1:7860 ``` 分かりやすいUIなので、フィーリングでも操作できると思います。 ![WebUI](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4hubCUvjI6npvBJfAqhfzbLhGvDd3d1WMaOLVJvkysIaMrQugbSFoXsbR3znLlU2th024e5kDg9qJz4GS7ze8Bv0UWfV5LNMquM2KgWLjFgNiGGZtk8i0YwSgGISRZFHPxhCYK4n8vxaAdMfxOOVMMgYRaFRAe99oc-DvjC4ZgPDLBDnhO5cvfmzorg/s2436/20230130.0000%20WebUI.png) ## \[Ubuntu\] Stable Diffusion web UI \(停止方法\) Ubuntu側は単にコマンド実行中になっているので*Ctrl+C*で止めれます。 ## \[Ubuntu\] xformers \(Option\) 今は自動でインストールされるらしい。故にBuildとか面倒な手間は不要。 起動時に毎回指定で良ければ以下で有効にできます。 ```sh ./webui.sh --xformers ``` それが面倒な場合は同階層にある*webui-user.sh*の以下の部分を変更します。 \[変更前\] ``` #export COMMANDLINE_ARGS="" ``` \[変更後\] ``` export COMMANDLINE_ARGS="--xformers" ``` ## おわりに Stable Diffusionのインストール部分は殆ど全自動です。さらに拡張されている機能も優れており、UIも使いやすい。もしかして開発者の方は神ですか。 Stable Diffusion Ubuntu WSL