1時間でAMD ROCm環境を構築してStableDiffusionを走らせてみた
ここ12年ほど、グラフィックスボードはRadeonを使い続けている水島が大阪よりお届けします。
AMD Radeonをこれでもかと推す内容となっておりますが、単に個人的な好みですのでご承知いただければ幸いです。
昨今世間を賑わわせているいくつかの画像生成AIですが、中でもStable Diffusionはオープンソースソフトウェアとして公開され、自分のマシンで実行できることが話題となりました。ローカルで実行できれば順番待ちも利用費も気にせず、リソースの限り好きなだけ試行できます。必要なのは時間と電気代と、そう、グラフィックスボードです。
幸い、高騰していたグラフィックスボードの価格も落ち着いてきておりますので、価格を理由に購入を見合わせていた方もそろそろ動き出す頃合いではないでしょうか。
用意するもの
AMD Radeon グラフィックスボード
ではまず、最新のROCmが動作するグラフィクスボードを見ていきましょう。
- Radeon RX Vega 56
- Radeon RX Vega 64
- Radeon VII
- Radeon RX 6000シリーズ
そして、本日19時にRX 7900XTXが発売となりますが、こちらもROCm動作対象になるとの情報があります。
手ごろな価格で人気を博したRX480やRX580がROCmのサポート対象外となってしまったのは少し残念ですが、動作させるための情報があるようなので、引き続き情報を追ってみたいと思います。
今回使用するものは
こちらの「発売日にうっかりPCショップに行ったら買ってしまった」RX 6900XT(私物)を使用していきたいと思います。
PCの構成は下記のようになっております。
- M/B BIOSTAR B550M-SILVER
- CPU Ryzen7 3900X
- GPU Radeon RX 6900XT
- RAM DDR4-3200 32GB
- PSU Enhance 850W
- SSD 1TB
- HDD 10TB
セットアップ開始
ここからタイマーをスタートしていきましょう。時間は1時間です。
Linuxのインストール(20分)
AMD ROCmの動作環境として推奨されているのはUbuntu 20.04あるいは22.04となりますが、他の環境で動かないというわけではありません。 Windowsと同居する予定の方はパーティションを縮めるなり、新しいディスクを追加するなりしてLinuxの居場所を確保しましょう。
ここでは、いつものようにDebian11(GUIなし)をインストールしましたが、インストールの過程は退屈なので割愛します。 ログインが出来て、sudoを実行できるようにしてある前提でお話を進めます。
AMDGPUのインストール(30分)
ここからが本題です。下記のリンクよりRadeonのドライバダウンロードページに行き、お使いの環境に適したインストール用ツールをダウンロードして導入します。
AMD Radeon™ & Radeon PRO™ グラフィックス用の Linux® ドライバー
$ wget https://repo.radeon.com/amdgpu-install/22.20/ubuntu/jammy/amdgpu-install_22.20.50200-1_all.deb (中略) 2022-11-16 00:14:07 (450 MB/s) - `amdgpu-install_22.20.50200-1_all.deb' へ保存完了 [13924/13924] $ sudo dpkg -i amdgpu-install_22.20.50200-1_all.deb 以前に未選択のパッケージ amdgpu-install を選択しています。 (データベースを読み込んでいます ... 現在 35689 個のファイルとディレクトリがインストールされています。) amdgpu-install_22.20.50200-1_all.deb を展開する準備をしています ... amdgpu-install (22.20.50200-1438747~22.04) を展開しています... amdgpu-install (22.20.50200-1438747~22.04) を設定しています ...
これで、インストール用ツールamdgpu-installがインストールされました。
$ sudo amdgpu-install --usecase=rocm (中略) インストールすることができないパッケージがありました。おそらく、あり得ない状況を要求したか、(不安定版ディストリビューションを使用しているのであれば) 必要なパッケージがまだ作成されていなかったり Incoming から移動されていないことが考えられます。 以下の情報がこの問題を解決するために役立つかもしれません: 以下のパッケージには満たせない依存関係があります: rocm-gdb : 依存: libpython3.8 しかし、インストールすることができません rocm-llvm : 依存: libstdc++-5-dev しかし、インストールすることができません または libstdc++-7-dev しかし、インストールすることができません 依存: libgcc-5-dev しかし、インストールすることができません または libgcc-7-dev しかし、インストールすることができません 推奨: gcc-multilib しかし、インストールされようとしていません 推奨: g++-multilib しかし、インストールされようとしていません E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
ライブラリのバージョン指定が細かいせいでエラーになってしまいますが、こちらに解決法がありました。 Can't install rocm-dev on Debian Bullseye #1125
下記の2ファイルを作成します。
fake-libgcc-7-dev
Section: misc Priority: optional Standards-Version: 3.9.2 Package: fake-libgcc-7-dev Version: 1.0 Provides: libgcc-7-dev, libstdc++-7-dev Architecture: all Description: Fake libgcc7-dev package to satisfy dependencies Fake libgcc7-dev package to satisfy dependencies
fake-libpython3.8
Section: misc Priority: optional Standards-Version: 3.9.2 Package: fake-libpython3.8 Version: 1.0 Depends: libpython3.9 Provides: libpython3.8, libpython3.8-minimal, libpython3.8-stdlib Architecture: all Description: Fake libpython3.8 package to satisfy dependencies Fake libpython3.8 package to satisfy dependencies
ダミーのパッケージを作成しインストールします。
$ sudo apt install libpython3.9 $ sudo apt install equivs $ equivs-build fake-libgcc-7-dev (中略) The package has been created. $ equivs-build fake-libpython3.8 (中略) The package has been created. $ sudo dpkg -i fake-libgcc-7-dev_1.0_all.deb (中略) fake-libgcc-7-dev (1.0) を設定しています ... $ sudo dpkg -i fake-libpython3.8_1.0_all.deb (中略) fake-libpython3.8 (1.0) を設定しています ... $ cd /usr/lib/x86_64-linux-gnu $ sudo ln -s libpython3.9.so.1 libpython3.8.so.1 $ sudo ln -s libpython3.9.so.1 libpython3.8.so.1.0 $ sudo ln -s libpython3.9.so.1 libpython3.8.so
これでカタは付いたはずです。気を取り直してもう一回。
$ sudo amdgpu-install --usecase=rocm ヒット:1 http://security.debian.org/debian-security bullseye-security InRelease ヒット:2 http://deb.debian.org/debian bullseye InRelease ヒット:3 http://deb.debian.org/debian bullseye-updates InRelease ヒット:4 https://repo.radeon.com/amdgpu/22.20/ubuntu jammy InRelease ヒット:5 https://repo.radeon.com/rocm/apt/5.2 ubuntu InRelease パッケージリストを読み込んでいます... 完了 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています... 完了 状態情報を読み取っています... 完了 以下の追加パッケージがインストールされます: amdgpu-dkms-firmware comgr dctrl-tools dkms g++-10-multilib g++-multilib gcc-10-multilib gcc-multilib hip-dev hip-doc hip-runtime-amd hip-samples hsa-amd-aqlprofile hsa-rocr hsa-rocr-dev hsakmt-roct-dev lib32asan6 lib32atomic1 lib32gcc-10-dev lib32gcc-s1 lib32gomp1 lib32itm1 lib32quadmath0 lib32stdc++-10-dev lib32stdc++6 lib32ubsan1 libbabeltrace-ctf1 libbabeltrace1 libc6-dev-i386 libc6-dev-x32 libc6-i386 libc6-x32 libdrm-amdgpu1 libdrm-common libdrm-dev libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 libdrm2 libdw1 libelf-dev libfile-basedir-perl libfile-copy-recursive-perl libfile-listing-perl libfile-which-perl libgl-dev libgl1 libgl1-mesa-dri libglapi-mesa libglib2.0-0 libglib2.0-data libglvnd0 libglx-dev libglx-mesa0 libglx0 libgpm2 libhttp-date-perl libipc-system-simple-perl libllvm11 libncurses5 libpciaccess0 libpthread-stubs0-dev libpython2-stdlib libpython2.7-minimal libpython2.7-stdlib libsensors-config libsensors5 libtimedate-perl libtinfo5 liburi-encode-perl libvulkan1 libwayland-client0 libx11-dev libx11-xcb1 libx32asan6 libx32atomic1 libx32gcc-10-dev libx32gcc-s1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc++-10-dev libx32stdc++6 libx32ubsan1 libxau-dev libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcb1-dev libxdamage1 libxdmcp-dev libxfixes3 libxshmfence1 libxxf86vm1 libz3-4 linux-compiler-gcc-10-x86 linux-headers-5.10.0-19-common linux-headers-amd64 linux-kbuild-5.10 mesa-common-dev mesa-vulkan-drivers openmp-extras python-is-python2 python2 python2-minimal python2.7 python2.7-minimal rocm-clang-ocl rocm-cmake rocm-core rocm-dbgapi rocm-debug-agent rocm-device-libs rocm-gdb rocm-llvm rocm-ocl-icd rocm-opencl rocm-opencl-dev rocm-smi-lib rocm-utils rocminfo rocprofiler-dev roctracer-dev shared-mime-info x11proto-dev xdg-user-dirs xorg-sgml-doctools xtrans-dev zlib1g-dev 提案パッケージ: debtags menu lib32stdc++6-10-dbg libx32stdc++6-10-dbg gpm lm-sensors libx11-doc libxcb-doc python2-doc python-tk python2.7-doc binfmt-support 推奨パッケージ: libdrm-amdgpu-amdgpu1 以下のパッケージが新たにインストールされます: amdgpu-dkms amdgpu-dkms-firmware comgr dctrl-tools dkms g++-10-multilib g++-multilib gcc-10-multilib gcc-multilib hip-dev hip-doc hip-runtime-amd hip-samples hsa-amd-aqlprofile hsa-rocr hsa-rocr-dev hsakmt-roct-dev lib32asan6 lib32atomic1 lib32gcc-10-dev lib32gcc-s1 lib32gomp1 lib32itm1 lib32quadmath0 lib32stdc++-10-dev lib32stdc++6 lib32ubsan1 libbabeltrace-ctf1 libbabeltrace1 libc6-dev-i386 libc6-dev-x32 libc6-i386 libc6-x32 libdrm-amdgpu1 libdrm-common libdrm-dev libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 libdrm2 libdw1 libelf-dev libfile-basedir-perl libfile-copy-recursive-perl libfile-listing-perl libfile-which-perl libgl-dev libgl1 libgl1-mesa-dri libglapi-mesa libglib2.0-0 libglib2.0-data libglvnd0 libglx-dev libglx-mesa0 libglx0 libgpm2 libhttp-date-perl libipc-system-simple-perl libllvm11 libncurses5 libpciaccess0 libpthread-stubs0-dev libpython2-stdlib libpython2.7-minimal libpython2.7-stdlib libsensors-config libsensors5 libtimedate-perl libtinfo5 liburi-encode-perl libvulkan1 libwayland-client0 libx11-dev libx11-xcb1 libx32asan6 libx32atomic1 libx32gcc-10-dev libx32gcc-s1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc++-10-dev libx32stdc++6 libx32ubsan1 libxau-dev libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcb1-dev libxdamage1 libxdmcp-dev libxfixes3 libxshmfence1 libxxf86vm1 libz3-4 linux-compiler-gcc-10-x86 linux-headers-5.10.0-19-amd64 linux-headers-5.10.0-19-common linux-headers-amd64 linux-kbuild-5.10 mesa-common-dev mesa-vulkan-drivers openmp-extras python-is-python2 python2 python2-minimal python2.7 python2.7-minimal rocm-clang-ocl rocm-cmake rocm-core rocm-dbgapi rocm-debug-agent rocm-dev rocm-device-libs rocm-gdb rocm-llvm rocm-ocl-icd rocm-opencl rocm-opencl-dev rocm-smi-lib rocm-utils rocminfo rocprofiler-dev roctracer-dev shared-mime-info x11proto-dev xdg-user-dirs xorg-sgml-doctools xtrans-dev zlib1g-dev アップグレード: 0 個、新規インストール: 137 個、削除: 0 個、保留: 0 個。 923 MB のアーカイブを取得する必要があります。 この操作後に追加で 1,285 MB のディスク容量が消費されます。 続行しますか? [Y/n] Y
沢山のパッケージがインストールされるのでしばらく待ちます。インストールが完了したら再起動します。再起動するまではROCmエージェントとしてGPUが使用可能にならないようです。
インストールされているか確認しましょう。
$ sudo dkms status amdgpu, 5.16.9.22.20-1438747~22.04, 5.10.0-19-amd64, amd64: installed $ sudo rocminfo rocminfo: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory
ドライバはOK、ツールが足りない。
$ sudo apt install libnuma (略) $ sudo rocminfo ROCk module is loaded ===================== HSA System Attributes ===================== Runtime Version: 1.1 System Timestamp Freq.: 1000.000000MHz Sig. Max Wait Duration: 18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count) Machine Model: LARGE System Endianness: LITTLE ========== HSA Agents ========== ******* Agent 1 ******* Name: AMD Ryzen 9 3900X 12-Core Processor Uuid: CPU-XX Marketing Name: AMD Ryzen 9 3900X 12-Core Processor Vendor Name: CPU Feature: None specified Profile: FULL_PROFILE Float Round Mode: NEAR Max Queue Number: 0(0x0) Queue Min Size: 0(0x0) Queue Max Size: 0(0x0) Queue Type: MULTI Node: 0 Device Type: CPU Cache Info: L1: 32768(0x8000) KB Chip ID: 0(0x0) Cacheline Size: 64(0x40) Max Clock Freq. (MHz): 5796 BDFID: 0 Internal Node ID: 0 Compute Unit: 24 SIMDs per CU: 0 Shader Engines: 0 Shader Arrs. per Eng.: 0 WatchPts on Addr. Ranges:1 Features: None Pool Info: Pool 1 Segment: GLOBAL; FLAGS: FINE GRAINED Size: 32879188(0x1f5b254) KB Allocatable: TRUE Alloc Granule: 4KB Alloc Alignment: 4KB Accessible by all: TRUE Pool 2 Segment: GLOBAL; FLAGS: KERNARG, FINE GRAINED Size: 32879188(0x1f5b254) KB Allocatable: TRUE Alloc Granule: 4KB Alloc Alignment: 4KB Accessible by all: TRUE Pool 3 Segment: GLOBAL; FLAGS: COARSE GRAINED Size: 32879188(0x1f5b254) KB Allocatable: TRUE Alloc Granule: 4KB Alloc Alignment: 4KB Accessible by all: TRUE ISA Info: ******* Agent 2 ******* Name: gfx1030 Uuid: GPU-9e09f60c341d01cc Marketing Name: Vendor Name: AMD Feature: KERNEL_DISPATCH Profile: BASE_PROFILE Float Round Mode: NEAR Max Queue Number: 128(0x80) Queue Min Size: 64(0x40) Queue Max Size: 131072(0x20000) Queue Type: MULTI Node: 1 Device Type: GPU Cache Info: L1: 16(0x10) KB L2: 4096(0x1000) KB L3: 131072(0x20000) KB Chip ID: 29631(0x73bf) Cacheline Size: 64(0x40) Max Clock Freq. (MHz): 2660 BDFID: 2304 Internal Node ID: 1 Compute Unit: 80 SIMDs per CU: 2 Shader Engines: 8 Shader Arrs. per Eng.: 2 WatchPts on Addr. Ranges:4 Features: KERNEL_DISPATCH Fast F16 Operation: TRUE Wavefront Size: 32(0x20) Workgroup Max Size: 1024(0x400) Workgroup Max Size per Dimension: x 1024(0x400) y 1024(0x400) z 1024(0x400) Max Waves Per CU: 32(0x20) Max Work-item Per CU: 1024(0x400) Grid Max Size: 4294967295(0xffffffff) Grid Max Size per Dimension: x 4294967295(0xffffffff) y 4294967295(0xffffffff) z 4294967295(0xffffffff) Max fbarriers/Workgrp: 32 Pool Info: Pool 1 Segment: GLOBAL; FLAGS: COARSE GRAINED Size: 16760832(0xffc000) KB Allocatable: TRUE Alloc Granule: 4KB Alloc Alignment: 4KB Accessible by all: FALSE Pool 2 Segment: GROUP Size: 64(0x40) KB Allocatable: FALSE Alloc Granule: 0KB Alloc Alignment: 0KB Accessible by all: FALSE ISA Info: ISA 1 Name: amdgcn-amd-amdhsa--gfx1030 Machine Models: HSA_MACHINE_MODEL_LARGE Profiles: HSA_PROFILE_BASE Default Rounding Mode: NEAR Default Rounding Mode: NEAR Fast f16: TRUE Workgroup Max Size: 1024(0x400) Workgroup Max Size per Dimension: x 1024(0x400) y 1024(0x400) z 1024(0x400) Grid Max Size: 4294967295(0xffffffff) Grid Max Size per Dimension: x 4294967295(0xffffffff) y 4294967295(0xffffffff) z 4294967295(0xffffffff) FBarrier Max Size: 32 *** Done ***
ROCmでGPUが使用可能になりました。Agent2のgfx1030がRX 6900XTを指しています。
ROCm環境の構築はこれで完了です。お疲れさまでした。
Stable Difussion WebUIのインストール(10分)
こちらのガイドの通りにインストールしていきます。お好みのモデルデータも導入しておきましょう。
AUTOMATIC1111 / stable-diffusion-webui Install and Run on AMD GPUs
$ sudo apt install git python3-venv pip $ sudo git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui $ cd stable-diffusion-webui $ scp user@hoge.local:~/very-good-trained-model.ckpt models/Stable-diffusion/ $ python -m venv venv $ source venv/bin/activate [venv]$ python -m pip install --upgrade pip wheel [venv]$ TORCH_COMMAND='pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/rocm5.1.1' python launch.py --listen
初回起動時はROCm対応のpytorchなど、必要なライブラリが自動的にインストールされます。
モデルの読み込みに少々時間がかかりますが、落ち着いたらブラウザからアクセスしてみましょう。
うまく動きましたでしょうか。
あとは、supervisordを使用してサービス化するなり、nginxのリバースプロキシ利用して外部に公開するなり、sambaでファイルをやり取りできるようにするなり、煮るなり焼くなりして便利に使いましょう。