はじめに
数ヶ月前、「NVIDIA Tesla K20」というサーバー用のグラフィックボードをジャンク品として、税込み2480円で購入しました。
2012年に発売されたKeplerアーキテクチャ搭載のグラフィックボードで、Geforce600番台と同世代というかなり骨董品になります。
今回はそんなレガシーマシンを使用し、Stable Diffusionで画像を生成するまでの過程を紹介します。
実行環境
項目 | 内容 |
---|---|
CPU | Intel(R) Xeon(R) CPU E5-1660 (6c 12t 3.90 GHz) |
GPU | NVIDIA Tesla K20 |
メモリー(仮想マシン) | 16GB |
マザーボード | Intel DX79TO |
OS(仮想マシン) | Ubuntu 20.04.6 LTS |
簡単に環境を壊せるようにProxmoxで仮想マシンを作成し、パススルーで対象のGPUを繋いでいます。
$ lspci | grep -i nvidia
01:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20c] (rev a1)
Nvidiaドライバー周りのインストール
NVIDIA Tesla K20が対応しているnvidia-driverのバージョンは470までなので、「nvidia-driver-470」をインストールします。
$ sudo apt update -y
$ sudo apt upgrade -y
$ sudo apt install ubuntu-drivers-common
$ ubuntu-drivers devices
$ sudo apt install nvidia-driver-470
再起動後、
$ nvidia-smi
Sun Dec 29 10:50:33 2024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.256.02 Driver Version: 470.256.02 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| 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 Tesla K20c Off | 00000000:06:10.0 Off | 0 |
| 30% 39C P0 53W / 225W | 0MiB / 4743MiB | 100% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
と表示されれば、Nvidia Driverのインストールは完了です。
つぎに、CUDA Toolkitをインストールします。NVIDIA DEVELOPERにアクセスして、ダウンロードとインストール方法を確認します。
ページに書かれてる方法に従って、ダウンロードとインストールを行います。
インストール完了して再起動後、~/.bashrc
に
export PATH=/usr/local/cuda:/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
を追記し、source .bashrc
で変更を確定します。最後に
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Wed_Jun__2_19:15:15_PDT_2021
Cuda compilation tools, release 11.4, V11.4.48
Build cuda_11.4.r11.4/compiler.30033411_0
でバージョンの確認が出来ればCUDA Toolkitのインストールが完了となります。
最後にCuDNNをインストールをします。cuDNN Archiveにアクセスをして、CUDA 11.4に対応したバージョンをダウンロードします。今回はDownload cuDNN v8.9.7 (December 5th, 2023), for CUDA 11.x
のLocal Installer for Ubuntu20.04 x86_64 (Deb)
をダウンロードしました。
ダウンロード後、
$ sudo apt-get install zlib1g
$ sudo dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.0-470.42.01-1_amd64.deb
$ sudo cp /var/cudnn-local-repo-ubuntu2004-8.9.7.29/cudnn-local-CD2C2DD4-keyring.gpg /usr/share/keyrings/
$ sudo apt update
$ sudo apt -y install libcudnn8 libcudnn8-dev
でCuDNNのインストールをします。インストール後
$ dpkg -l | grep cudnn
ii cudnn-local-repo-ubuntu2004-8.9.7.29 1.0-1 amd64 cudnn-local repository configuration files
ii libcudnn8 8.9.7.29-1+cuda11.8 amd64 cuDNN runtime libraries
ii libcudnn8-dev 8.9.7.29-1+cuda11.8 amd64 cuDNN development libraries and headers
と出ればインストール完了です。(cuDNNのバージョンの後ろに「cuda11.8」と書かれていますが、問題はありません)
Python3.10のインストール
PyTorchが対応しているPythonのバージョンは3.9, 3.10, 3.11
なので、他のライブラリの兼ね合いから3.10
をインストールします。
$ sudo apt install -y software-properties-common
$ sudo add-apt-repository ppa:deadsnakes/ppa
2行目を実行したあとに
For nightly builds, see ppa:deadsnakes/nightly https://launchpad.net/~deadsnakes/+archive/ubuntu/nightly
More info: https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa
Press [ENTER] to continue or Ctrl-c to cancel adding it.
と表示された時にはEnterキーを押してください。
$ sudo apt update
$ sudo apt list python3.*
を実行したときに
python3.10-dbg/focal 3.10.16-1+focal1 amd64
python3.10-dev/focal 3.10.16-1+focal1 amd64
python3.10-distutils/focal 3.10.16-1+focal1 all
python3.10-examples/focal 3.10.16-1+focal1 all
python3.10-full/focal 3.10.16-1+focal1 amd64
python3.10-gdbm-dbg/focal 3.10.16-1+focal1 amd64
python3.10-gdbm/focal 3.10.16-1+focal1 amd64
python3.10-lib2to3/focal 3.10.16-1+focal1 all
python3.10-minimal/focal 3.10.16-1+focal1 amd64
python3.10-tk-dbg/focal 3.10.16-1+focal1 amd64
python3.10-tk/focal 3.10.16-1+focal1 amd64
python3.10-venv/focal 3.10.16-1+focal1 amd64
python3.10/focal 3.10.16-1+focal1 amd64
とPython3.10がインストール可能であることを確認できれば
sudo apt install -y python3.10 python3.10-venv
でPython3.10と仮想環境をインストールします。
GPUのCompute CapabilityとPyTourchのバージョン
ここで、GPUのCompute CapabilityとPyTourchのバージョンについて解説します。
Compute Capabilityとは、NVIDIAのCUDAプラットフォームにおいて、GPUの機能やアーキテクチャのバージョンを示す指標となります。Compute Capabilityはcuda-gpusで確認することができ、今回使用している「NVIDIA Tesla K20」のCompute Capabilityは3.5
になります。
PyTourchはNVIDIAのGPUを使用するため、Compute Capabilityのバージョンとの兼ね合いが非常に重要となります。関係表で確認すると、3.5
に対応している最新のバージョンはpytorch-1.12.1-py3.10_cuda10.2_cudnn7.6.5_0
であり、CUDAのバージョンは10.2
までです。しかし、今回インストールしているCUDAのバージョンは11.4
であるためバージョンが合致しません。
以上より、CUDA11.4
に対応しつつ、Compute Capability 3.5
にも対応しているPyTourchを探す必要があります。
探してみると、stable-diffusion-webuiのレポジトリ内のDiscussionで非常に興味深い投稿がありました。以下に引用します。
So everywhere I've seen in discussion it is impossible to run stable diffusion in Kepler GPUs except K80 because it supports CUDA compute capability 3.7. Main limitation to run it on CUDA 3.5 is that started pytorch packages come compiled without support for it, you can check it with:
import torch torch.cuda.get_arch_list()
But what if we compile torch with support for CUDA 3.5 support? Or even better, use precompiled torch from https://github.com/nelson-liu/pytorch-manylinux-binaries.
上記の内容から、pytorch-manylinux-binariesにCUDA11.4
に対応しつつ、Compute Capability 3.5
にも対応しているPyTourchがあるらしいため、確認するとPyTorch v1.12.1
にtorch-1.12.1+cu113-cp310-cp310-linux_x86_64.whl
がありました。今回はこちらのバージョンを使用します。(cu113でCUDA11.3
用ではありますが、どうやらCUDA11.4
と互換性があるため、こちらを使用します)
PyTourchのインストールとテスト
ここで、先程のPyTorch v1.12.1
がCUDA11.4
とCompute Capability 3.5
が対応しているか確認をします。
適当なフォルダで
$ python3.10 -m venv .venv
$ source .venv/bin/activate
$ pip install wheel
とPython3.10の仮想環境を作成します。
$ wget https://github.com/nelson-liu/pytorch-manylinux-binaries/releases/download/v1.12.1/torch-1.12.1+cu113-cp310-cp310-linux_x86_64.whl
$ pip install torch-1.12.1+cu113-cp310-cp310-linux_x86_64.whl
でPyTorchをインストールします。最後に
$ python
>>> import torch
>>> print(torch.__version__)
1.12.1+cu113
>>> print(torch.cuda.is_available())
True
>>> print(torch.cuda.device_count())
1
>>> print(torch.cuda.get_device_name())
Tesla K20c
>>> print(torch.cuda.get_device_capability())
(3, 5)
>>> print(torch.cuda.get_arch_list())
['sm_35', 'sm_37', 'sm_50', 'sm_60', 'sm_70', 'sm_75', 'sm_80', 'sm_86']
とPyTourchがGPUを認識しており、かつarch_listに「sm_35」が含まれているため、使用可能なことが分かります。
Stable Diffusionのダウンロードと依存関係を考えたライブラリのインストール
ここからStable Diffusionをダウンロードし、依存関係を考えつつライブラリのインストールをしていきます。
先程の投稿の方はコミットIDがcommit c9c8485bc1e8720aba70f029d25cba1c4abf2b5c
のバージョンを使用しているため、今回は同じものを使用します。
$ wget https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.5.2
$ tar -zxvf v1.5.2.tar.gz
$ cd stable-diffusion-webui-1.5.2
$ python3.10 -m venv .venv
$ source .venv/bin/activate
$ pip install --upgrade pip
$ pip install wheel
$ pip install torch-1.12.1+cu113-cp310-cp310-linux_x86_64.whl
これで、Stable DiffusionとPyTourchのインストールは完了です。ここから、torch-1.12.1+cu113
に対応したライブラリをインストールしていきます。
PyTourchに依存関係を持ちそうなライブラリはpip install *** --no-deps
で本体のみインストールし、pip check
で依存関係が壊れてないか、何が関係しているかを探りつつインストールを進めました。
最終的なバージョンは、以下の通りです。
absl-py 2.1.0
accelerate 1.2.1
addict 2.4.0
aenum 3.1.15
aiofiles 24.1.0
aiohappyeyeballs 2.4.4
aiohttp 3.11.11
aiosignal 1.3.2
altair 5.5.0
annotated-types 0.7.0
antlr4-python3-runtime 4.9.3
anyio 4.7.0
async-timeout 5.0.1
attrs 24.3.0
basicsr 1.4.2
blendmodes 2024.1.1
certifi 2024.12.14
charset-normalizer 3.4.1
clean-fid 0.1.35
click 8.1.8
colorama 0.4.6
contourpy 1.3.1
cycler 0.12.1
einops 0.8.0
exceptiongroup 1.2.2
facexlib 0.3.0
fastapi 0.115.6
ffmpy 0.5.0
filelock 3.16.1
filterpy 1.4.5
fonttools 4.55.3
frozenlist 1.5.0
fsspec 2024.12.0
ftfy 6.3.1
future 1.0.0
gfpgan 1.3.8
gitdb 4.0.11
GitPython 3.1.43
gradio 3.32.0
gradio_client 1.5.2
grpcio 1.68.1
h11 0.14.0
httpcore 1.0.7
httpx 0.28.1
huggingface-hub 0.27.0
idna 3.10
imageio 2.36.1
inflection 0.5.1
Jinja2 3.1.5
jsonmerge 1.9.2
jsonschema 4.23.0
jsonschema-specifications 2024.10.1
kiwisolver 1.4.8
kornia 0.7.4
kornia_rs 0.1.7
lark 1.2.2
lazy_loader 0.4
lightning-utilities 0.11.9
linkify-it-py 2.0.3
llvmlite 0.43.0
lmdb 1.5.1
Markdown 3.7
markdown-it-py 2.2.0
MarkupSafe 3.0.2
matplotlib 3.10.0
mdit-py-plugins 0.3.3
mdurl 0.1.2
multidict 6.1.0
narwhals 1.19.1
networkx 3.4.2
numba 0.60.0
numpy 1.26.4
omegaconf 2.3.0
open_clip_torch 2.29.0
opencv-python 4.10.0.84
orjson 3.10.12
packaging 24.2
pandas 2.2.3
piexif 1.1.3
pillow 10.4.0
pip 24.3.1
platformdirs 4.3.6
pretty-errors 1.2.25
propcache 0.2.1
protobuf 5.29.2
psutil 6.1.1
pydantic 2.10.4
pydantic_core 2.27.2
pydub 0.25.1
Pygments 2.18.0
pyparsing 3.2.0
python-dateutil 2.9.0.post0
python-multipart 0.0.20
pytorch-lightning 2.1.4
pytz 2024.2
PyYAML 6.0.2
realesrgan 0.3.0
referencing 0.35.1
regex 2024.11.6
requests 2.32.3
resize-right 0.0.2
rpds-py 0.22.3
safetensors 0.4.5
scikit-image 0.25.0
scipy 1.14.1
semantic-version 2.10.0
setuptools 65.5.0
six 1.17.0
smmap 5.0.1
sniffio 1.3.1
starlette 0.41.3
tb-nightly 2.19.0a20241229
tensorboard-data-server 0.7.2
tifffile 2024.12.12
timm 1.0.12
tokenizers 0.13.3
tomesd 0.1.3
tomli 2.2.1
torch 1.12.1+cu113
torchaudio 0.12.1+cu113
torchdiffeq 0.2.5
torchmetrics 1.4.0
torchsde 0.2.6
torchvision 0.13.1+cu113
tqdm 4.67.1
trampoline 0.1.2
transformers 4.25.1
typing_extensions 4.12.2
tzdata 2024.2
uc-micro-py 1.0.3
urllib3 2.3.0
uvicorn 0.34.0
wcwidth 0.2.13
websockets 14.1
Werkzeug 3.1.3
wheel 0.45.1
yapf 0.43.0
yarl 1.18.3
全てのライブラリをインストール出来れば
$ bash ./webui.sh --listen
で起動し、他のマシンからアクセスすれば
と無事起動できていることが分かります。
課題
問題なくStable Diffusionが起動し、また「-–medvram」などを加えることで画像の生成も出来ていることは確認が出来ました。しかしながら、一つ問題が残っています。
それは、xformersが使えないということです。
今回のバージョンに合致するxformersが見つからなかったため、メモリなどの最適化が出来ていません。恐らく、PyPIに載っていない0.0.14
もしくは0.0.15
が対応しているのではないかと睨んでいますが、Githubにも載っていないためお手上げ状態です。
今後、もし見つかればxformersのインストール方法も記載しようと考えています。
余談
以前
で紹介した、Radeonによる画像生成と速度を比較すると、今回の方が圧倒的に早いですね。
世代的には圧倒的にRadeon RX570(大体GTX1060と同世代)が上ですが、もともとデータセンター向けに開発されていたモデルだからか、NVIDIA Tesla K20の方が早かったです。
税込み2480円でこれは優秀と言っても良いのではないでしょうか。
最後に
今回は、Keplerアーキテクチャ世代の「NVIDIA Tesla K20」で、Stable Diffusionを使用する方法について解説をしました。皆さんの参考になりましたら幸いです。
参考文献