2023/09/16 # Stable Diffusion 2 + WSL + Ubuntu で環境構築 ## ブログの引っ越し 当ブログは[takemi.blog](https://takemi.blog/)に移行しました。 より見やすい[Stable Diffusion 2 + WSL + Ubuntuの環境を構築する](https://takemi.blog/4bd58ccb483646f2bdcc1c1c48ad72a6/)をご利用ください。 ## 作成日時 2023/01/12 ## 概要 Stable Diffusion凄いですよね。登場時に内容見て震えました。僕みたいな絵を描けないエンジニアでも神絵師になれちゃうの!マジ?って。 ゲームのために無駄に高性能なGPUを買ったこともあり、こっちの環境構築にもチャンレンジしました。 ## 筆者の環境 まずは筆者の環境です。CPUとか、さほど重要じゃなさそうな項目は簡略化します。 大事なのはGPU性能とインストールするソフトウェアのバージョン関係かと。 なお、Stable Diffusion 1 はリポジトリも異なるので同方法では動かないと思います。 合わせて、この記事ではWSL2でUbuntuを動かす部分は本題ではないので紹介しません。 + Core i7 + 32GB + GeForce RTX 3090 + Windows 11 + WSL2 Ubuntu 22.04.1 LTS + Stable Diffusion 2.1 ## \[Ubuntu\] 前準備 まずはUbuntuを更新しておきましょう。 ついでに伝えると私が利用したUbuntuはストアからインストールした状態で、この時点では何も入っていません。 ```sh sudo apt update sudo apt upgrade -y ``` また、後に利用することになるのでgit-lfsも入れておきます。 ```sh sudo apt-get install git-lfs ``` ## \[Ubuntu\] Python系のインストール バージョン管理が必要になった場合に備えてPython系はpyenvを利用してインストールします。 ```sh git clone https://github.com/pyenv/pyenv.git ~/.pyenv echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc exec "$SHELL" ``` 以下のコマンドを実行してバージョンが表示されたらインストール成功です。 ```sh pyenv -v ``` 次はpyenvでAnacondaをインストールすることでPython系の環境を整えます。 まずは以下のコマンドを利用してインストール可能なバージョンを一覧表示しましょう。 ```sh pyenv install -l | grep anaconda ``` 表示されたリスト内からインストールするバージョンを選んで次のコマンドを実行します。 本記事においては最新版*anaconda3-2022.10*を利用することにします。 ```sh pyenv install anaconda3-2022.10 pyenv global anaconda3-2022.10 conda update conda ``` インストールが完了したら以下コマンドでPythonとAnacondaのバージョンを確認しましょう。 ```sh python -V conda -V ``` 後に利用するAnaconda仮想環境のために以下を実行しておきます。 ```sh conda init bash exec "$SHELL" ``` これを実行するとUser名の前に(base)と表示されるようになります。 実際に活用するのは後半なので、現時点では表示されていれば大丈夫です。 ## \[Windows\] WSL再起動 WSLの利点は再起動が気軽なことだと思います。本記事では無用なトラブルを避けるために度々再起動しますが、実際は不要かもしれません。 それでは一度Ubuntuから出てWindows側のコマンドプロンプトやTerminalから次のコマンドを実行してWSLを再起動します。 ``` wsl.exe --shutdown ``` ## \[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前提でスルーしました。 ## \[Windows\] WSL再起動 一度Ubuntuから出てWindows側からWSLを再起動 ``` wsl.exe --shutdown ``` ## \[Ubuntu\] Stable Diffusion \(本体\) 先に伝えておくと、Stable Diffusionに関する部分は容量が非常に大きく、各コマンドの実行にかなりの時間を要します。 特に長いのがxformersのインストールと学習モデルのダウンロードとなりますので、実行したら気長に待ちましょう。 それでは以下のコマンドを実行してStable Diffusionを入手します。 ```sh git clone https://github.com/Stability-AI/stablediffusion.git cd stablediffusion/ ``` 次にAnaconda仮想環境の作成を行います。 これにより必要なライブラリとか良い感じに揃います。\(たぶん。いや初めて利用したので\) ```sh conda env create -f environment.yaml ``` 次のコマンドで仮想環境を有効にします。 成功すればユーザー名の部分が\(base\)から\(ldm\)に変わります。 ```sh conda activate ldm ``` ちなみに解除する場合は次のコマンドです。当然、今回は実行しなくて良いです。 今後Stable Diffusionを利用する場合は仮想環境を切り替える必要があるので、有効化の方は覚えておくと良いでしょう。 ```sh conda deactivate ``` 最後に次のコマンドでインストールします。 ```sh conda install pytorch==1.12.1 torchvision==0.13.1 -c pytorch pip install transformers==4.19.2 diffusers invisible-watermark pip install -e . ``` ## \[Ubuntu\] Stable Diffusion \(xformers\) とりあえずはディレクトリを戻しましょう。 ```sh cd ~/ ``` そして必要なファイルを入手します。 ```sh git clone https://github.com/facebookresearch/xformers.git cd xformers/ ``` 最後に次のコマンドで実際にインストールします。 ```sh git submodule update --init --recursive pip install -r requirements.txt pip install -e . ``` ## \[Ubuntu\] Stable Diffusion \(学習モデル\) まずStable Diffusionのディレクトリに移動します。 ```sh cd ~/stablediffusion ``` そしたら必要なファイルを入手します。 せっかくなので学習モデルは*2.1版*を使いましょう。 ```sh git lfs install git clone https://huggingface.co/stabilityai/stable-diffusion-2-1 ``` ## \[Ubuntu\] Stable Diffusion \(実行\) 公式に書いてある情報を参考にコマンドを作ります。こんな感じです。 ```sh python scripts/txt2img.py --prompt "a professional photograph of an astronaut riding a horse" --ckpt ./stable-diffusion-2-1/v2-1_768-ema-pruned.ckpt --config configs/stable-diffusion/v2-inference-v.yaml --H 768 --W 768 ``` このタイミングでダウンロードされるファイルもあるので 成功 or 失敗 を問わず結構時間が掛かります。 ..... .... ... さて、成功したでしょうか。残念ながら私の初回実行は失敗でした。 こんな感じでエラーが表示されて、途中で失敗します。 ```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 ``` 本来ならLibrary?とかを入れるタイミングで実施するのでしょうね。 待ってる時は暇すぎて画面を見ないので見逃したかもです。 さぁ、それではもう一度コマンドを実行しましょう! ```sh python scripts/txt2img.py --prompt "a professional photograph of an astronaut riding a horse" --ckpt ./stable-diffusion-2-1/v2-1_768-ema-pruned.ckpt --config configs/stable-diffusion/v2-inference-v.yaml --H 768 --W 768 ``` 今回はどうでしょうか?。僕の場合はGPU使用率とGPU専用メモリが一気に上昇して正常終了しました。 コマンドに問題が無ければ画像が生成されているはずなので、前の方で紹介したWindows経由でアクセスできる方法で画像ファイルを見てみましょう。 stablediffusion\outputs\txt2img-samples\samplesってフォルダに出力されています、僕の場合のフルパスは以下ですね。 `\\wsl.localhost\Ubuntu-22.04\home\user\stablediffusion\outputs\txt2img-samples\samples` ちなみにコマンドの中身を翻訳サイトに投げると「馬に乗っている宇宙飛行士のプロによる写真」らしい。確かにそれっぽい画像が生成されています。 ![生成画像](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEI3bkEOtRupYrfO5DOf069S3Z1ceq1SFefHYJE3ELudLmaG2m5k6Va0eV3ykh18_zTIvPTU4-Z1usAjX8S-E3e6Jj1FSrTnRPe_i0XiVTdDwWXs2B8Y43teFLGz5S40I9Ji5SkJ0Dg9S4ERQD2dYpxX3MJ7BTney4BOO1kK2TLnUP2S9J6lDqqshYPQ/s320/20230111.0213.00003.png) ## おわりに コマンドの書式とか分からないことが多いで色々遊べそうです。 実際にまともな絵を出力するにはモデルを切り替える必要もありそうなので、この辺も楽しそうですね。 失敗のたびにUbuntuをリセット、色々チャレンジして成功しました。 軽い気持ちでリセットできて、ホストOSにも影響しないのでWSLは本当に便利だと思います。 Stable Diffusion Ubuntu WSL