Stable Diffusion 2 + WSL + Ubuntuの環境を構築する

[Stable Diffusion] Stable Diffusion 2 + WSL + Ubuntuの環境を構築する

※ 当サイトは広告を含みます。

Stable Diffusion凄いですよね。登場時に内容を見て震えました。

ここでは勉強のため、純正のStable DiffusionをWSLとUbuntuの環境に構築したいと思います。
実用するなら別記事で紹介するStable Diffusion web UIを使ったほうが絶対に便利ですよ。

◆ Stable Diffusion web UIのインストール方法について

[]環境構築後にCUDA ToolkitやcuDNNを更新する方法です。
本記事のバージョンが合わない場合、以下の記事も参考にしてください。

構築環境の紹介

僕のPC環境です。必須じゃない項目は簡略化して記述します。

大切なのはGPU性能とインストールするソフトウェアのバージョン関係だと思います。
特にStable Diffusion 1はリポジトリ自体が異なり同方法では動きません。

  • Core i7 + 32GB
  • GeForce RTX 3090
  • Windows 11
  • WSL2 Ubuntu 22.04.1 LTS
  • Stable Diffusion 2.1

(Ubuntu側) 事前作業

最初にUbuntuを更新します。僕はトラブルを避けるためにストアからインストールした状態を元に構築してます。


sudo apt update
sudo apt upgrade -y

また、後に利用することになるので先行してgit-lfsも入れます。


sudo apt-get install git-lfs

(Windows側) WSL再起動

WSLは再起動が容易で便利です。ここでは無用なトラブルを避けるために結構な頻度で再起動させます。
これは実際には不要かもしれませんが、待ち時間も少ないので、とりあえずで実行することを推奨します。

作業はWindows側で行います。Windows側のTerminal(コマンドプロンプト等)から次のコマンドでWSLを再起動しましょう。


wsl.exe --shutdown

Python関連の導入

(Ubuntu側) Pythonのインストール

バージョン管理が必要になった場合に備えてPythonはpyenvを利用してインストールしましょう。


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"

次のコマンドでバージョンが表示されたらインストール成功です。


pyenv -v

(Ubuntu側) Anacondaのインストール

続いてpyenvでAnacondaをインストールします。

次のコマンドでインストール可能なバージョンを探しましょう。利用可能なバージョンがリストで表示されます。


pyenv install -l | grep anaconda

大抵は最新版を利用すれば良いと思います。ここではanaconda3-2022.10を利用します。


pyenv install anaconda3-2022.10
pyenv global anaconda3-2022.10
conda update conda

次のコマンドでPythonとAnacondaのバージョンが確認できればインストール成功です。


python -V
conda -V

さらに後に利用するAnaconda仮想環境の初期化を行います。


conda init bash
exec "$SHELL"

成功するとUser名の前に(base)と表示されるようになります。
これを使うのは後半なので、現時点では表示が変われば大丈夫です。

(Windows側) WSL再起動

ここでWSLを再起動します。


wsl.exe --shutdown

NVIDIA関連の導入

(Windows側) NVIDIAドライバのインストール

と言いたいところですが、NVIDIA製GPUを搭載して通常利用してるPCであれば普通はドライバが入ってます。
NVIDIA GeForce Experienceを利用するのが1番楽ですが、ドライバだけ欲しい人は公式サイトで探してください。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

(Ubuntu側) NVIDIAドライバ確認

最初の注意点としてUbuntu側にNVIDIAドライバは不要です。寧ろ導入しないほうが良いです。
Windows側にドライバが入っている場合、次のコマンドでUbuntu側からもGPUを認識できます。


nvidia-smi

こんな感じの表が出力されたらGPUは問題なく認識できてます。


+-----------------------------------------------------------------------------+
| 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

今回は過去版で1番新しい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)
Linux -> x86_64 -> WSL-Ubuntu -> 2.0 -> deb (local) を選択する

そうすると、こんな感じのコマンドが表示されるので順番に実行します。


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番目のコマンドを実行するとTo install the key, run this command:って感じに、次に実行するコマンドを指示されます。
指示されたコマンドと5番目のコマンドを見ると分かるのですが、cuda-*-keyringって感じに*でパスが記述されてます。
恐らくフルパス版でしょう。とりあえず、ここは指示に従って表示されたコマンドを実行します。

インストールが完了したらPATHを設定します。PATHにはバージョン番号が入るので僕と違う人は注意してください。


export CUDA_PATH=/usr/local/cuda-11.8
echo 'export CUDA_PATH=/usr/local/cuda-11.8' >> ${HOME}/.bashrc

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

export PATH=/usr/local/cuda-11.8/bin:${PATH}
echo 'export PATH=/usr/local/cuda-11.8/bin:${PATH}' >> ${HOME}/.bashrc

ここでシェルを再起動します。


exec "$SHELL"

最後に次のコマンドでインストールしたCUDA Toolkitのバージョンを確認します。


nvcc -V

こんな感じの表示が出ればインストールは問題ありません。


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再起動

ここでWSLを再起動します。


wsl.exe --shutdown

cuDNNのインストール

(Windows側) cuDNNのダウンロード

cuDNNはUbuntuから直接的な入手が出来ないためWindows経由で入手します。
なお、このファイルのダウンロードにはNVIDIAアカウントが必要になります。

それでは次のリンクから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って部分を辿るか、以下のようにパスを指定します。


\\wsl.localhost\Ubuntu-22.04\home\(ユーザー名)

(Ubuntu側) cuDNNのインストール

ここからはインストール作業となるので、Ubuntuで作業します。
それでは先程ファイルをコピーしたディレクトリに移動しましょう。

移動したらインストール用のコマンドを実行します。


sudo dpkg -i cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb

そうするとTo install the key, run this command:って感じに次のコマンドを指示されます。

僕の場合は次のコマンドでした。


sudo cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/

続いて次のコマンドを実行します。


sudo apt update
sudo apt -y install libcudnn8 libcudnn8-dev libcudnn8-samples

これでインストールは完了です。cuDNNの動作確認は手間なのでスルーして先に進みます。

(Windows側) WSL再起動

ここでWSLを再起動します。


wsl.exe --shutdown

Stable Diffusion関連の導入

ここで注意点となりますが、ここから先のコマンドは容量が非常に大きく、各コマンドの実行にかなりの時間を要します。
軽く30分くらい掛かる部分もあるので、時間的な余裕があるときに作業することを推奨します。

(Ubuntu側) Stable Diffusion(本体)のダウンロード

次のコマンドを実行してStable Diffusionを入手します。


git clone https://github.com/Stability-AI/stablediffusion.git

(Ubuntu側) Anaconda仮想環境の有効化

最初にディレクトリを移動します。


cd stablediffusion/

次にAnaconda仮想環境の作成を行います。これにより必要なライブラリとか良い感じに揃います。


conda env create -f environment.yaml

次に仮想環境を有効にします。成功すればユーザー名の部分が(base)から(ldm)に変わります。


conda activate ldm

ちなみに解除する場合は次のコマンドを使います。当然、今回は実行しないでください。
今後、Stable Diffusionを利用する場合は仮想環境を切り替える必要があるので、有効/無効を覚えておくと便利です。


conda deactivate

(Ubuntu側) Stable Diffusion(本体)のインストール

最後に次のコマンドを実行してインストールします。


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)のインストール

最初にカレントディレクトリを戻します。


cd ~/

次に必要なファイルを入手します。


git clone https://github.com/facebookresearch/xformers.git
cd xformers/

最後に次のコマンドでインストールします。


git submodule update --init --recursive
pip install -r requirements.txt
pip install -e .

(Ubuntu側) Stable Diffusion(学習モデル)の入手

最初にStable Diffusionをインストールしたディレクトリに移動します。


cd ~/stablediffusion

次に学習モデルを入手します。せっかくなので学習モデルは2.1版を使いましょう。


git lfs install
git clone https://huggingface.co/stabilityai/stable-diffusion-2-1

(Ubuntu側) 動作確認

公式サイトを参考にコマンドを作ります。こんな感じです。


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

実行すると初回は必要なファイルのダウンロードが始まります。それなりの時間が掛かるので気長に待ちましょう。

. . . . .

. . . .

. . .

さて、成功したでしょうか。残念ながら僕はエラーが表示されて途中で失敗しました。


could not load library libcudnn_cnn_infer.so.8. Error: libcuda.so: cannot open shared object file: No such file or directoryM Sampler:

このエラーですが次のコマンドで解決できます。本来ならLibraryを導入するタイミング(どこ?)で実施するのですかね。


sudo ln -s /usr/lib/wsl/lib/libcuda.so.1 /usr/local/cuda/lib64/libcuda.so
管理人

では、気を取り直してLet's try!


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経由で確認するのが楽なので、エクスプローラからWSLのフォルダにアクセスしましょう。


\\wsl.localhost\Ubuntu-22.04\home\user\stablediffusion\outputs\txt2img-samples\samples

ちなみに生成コマンドの意味は「馬に乗っている宇宙飛行士のプロによる写真」らしいです。完成した画像もそれっぽいと思います。

馬に乗っている宇宙飛行士のプロによる写真

あとがき

最初にも言いましたが実用は困難です。あくまで勉強って印象ですね。
素直にStable Diffusion web UIを使ったほうが賢明です。

この記事は参考になりましたか?

関連記事

コメント

この記事へのコメントはありません。