1時間でAMD ROCm環境を構築してStableDiffusionを走らせてみた

2022.12.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ここ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(私物)を使用していきたいと思います。

Radeon RX6900XTの箱

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でファイルをやり取りできるようにするなり、煮るなり焼くなりして便利に使いましょう。