Ubuntu日和

【第42回】RadeonだってStable Diffusionは高速だ。そう、Ubuntuならね

今回生成した、一見きれいだけど違和感しかない画像。たとえば架線はあるものの架線柱もパンタグラフもない

 画像生成AI、それは2023年を彩った大きなトピックであった。

 ただ、どれもこれも前提となるのはNVIDIAのGPUだ。AMDのRadeonユーザーは歯がゆい思いをしていることだろう。

 NVIDIAが画像生成で使用しているプラットフォームはCUDAであることはご存知であろう。Radeonでこれに当たるのはROCmだ。Windows用もあるが、ROCm component supportによると「AI Frameworks」は「Not available」となっている。現在の画像生成AIの多くはPyTorchをベースにしており、これに非対応ということはすなわち画像生成も非対応と考えていい。

 従ってWindowsユーザーはDirectMLを使用することになるが、これがあまり速くない。しかし、UbuntuだとROCmが使用できるのでDirectMLよりも速くなることが期待できる。

 今回使用するStable Diffusion WebUIもDirectMLで動作する派生版があるので、動かしてみよう。

使用するハードウェア

 その前に、今回使用するハードウェアを確認しておこう。

分類メーカー型番
CPUIntelCore i5-13500
メモリーCrucialCT32G4DFD832A
マザーボードASRockB660M Pro RS
SSDWestern DigitalWDS500G3X0C
dGPUASRockRX6600XT CLI 8G
ケースSilver StoneSST-SG11B
電源玄人志向KRPW-SXP600W/90+

 なおUbuntuもWindowsも同一のハードウェアにインストールしている。厳密にはWindowsのSSDはIntel製のSSDSC2KW480H6というSATA接続の2.5インチモデルだが、SSDの速度差は生成速度には影響しないと考えていいだろう。

Windowsでの結果

 Windowsでのインストール方法は省略して、結果を見てみよう。

DirectMLでの結果

 生成にかかった時間は左下にあり、今回は1分40秒かかっている。同じパラメータだと生成時間にほぼ差が出ないことは確認している。従って複数回やってもおおむね同じ結果と期待できる。

 512×512の画像を1枚生成するのに1分40秒はかかりすぎる。通常画像生成は1枚で済むものではなく、数十枚生成してそのうち使えるものは1枚とかそんな感じで、実用性があるかと問われると、厳しいと言わざるを得ない。

 実はCPUで処理しているのではと疑ってみたものの、タスクマネージャーを見る限り確かに生成中のGPU負荷が高くCPU負荷は低いので、疑う余地はなかった。

ROCmのインストール方法

 ではUbuntuに移って、実際にROCmをインストールしていこう。Ubuntuのバージョンは22.04.3 LTSとする。カーネルのバージョンは6.2で、ROCmのバージョンは執筆時点で最新である6.0.0だ。今後予定されているカーネルのバージョンアップにより6.5になるとそれに対応したROCmの新バージョンが必要となるので注意してほしい。セキュアブートはオフとする。

 なおROCmが対応するのはdGPUであり、iGPUは非対応とのことなので注意してほしい。

 インストールはすべてコマンドで行なう。端末を起動してコマンドを実行していこう。

 丁寧なインストールドキュメントがあるので、この通りなのだが、細かく見ていこう。

 まずはリポジトリの登録からだ。

$ wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | gpg --dearmor | sudo tee /etc/apt/keyrings/rocm.gpg > /dev/null
$ echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/amdgpu/6.0/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/amdgpu.list
$ echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/6.0 jammy main" | sudo tee --append /etc/apt/sources.list.d/rocm.list
$ echo -e 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600' | sudo tee /etc/apt/preferences.d/rocm-pin-600

 インストールは次の通りだ。

$ sudo apt update
$ sudo apt install amdgpu-dkms
$ sudo apt install rocm-hip-libraries
$ sudo usermod -a -G render,video $LOGNAME

 ここで一度再起動しよう。

 ROCmが正しく動作しているかどうかは、次のコマンドで確認できる。

$ rocminfo

 ここでdGPUが認識されていれば、インストールは成功したことになる。次は今回の例だ。

(前略)
*******
Agent 2
*******
  Name:                    gfx1032
  Uuid:                    GPU-XX
  Marketing Name:          AMD Radeon RX 6600 XT
  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:                      2048(0x800) KB
    L3:                      32768(0x8000) KB
  Chip ID:                 29695(0x73ff)
  ASIC Revision:           0(0x0)
  Cacheline Size:          64(0x40)
  Max Clock Freq. (MHz):   2900
  BDFID:                   768
  Internal Node ID:        1
  Compute Unit:            32
  SIMDs per CU:            2
  Shader Engines:          2
  Shader Arrs. per Eng.:   2
  WatchPts on Addr. Ranges:4
  Coherent Host Access:    FALSE
(後略)

Stable Diffusion WebUIのインストール

 Stable Diffusion WebUIのインストールは次の通りだ。

$ sudo apt install git python3.10-venv libstdc++-12-dev -y
$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui && cd stable-diffusion-webui
$ python3.10 -m venv venv
$ ./webui.sh --upcast-sampling

 コマンドは簡単だが、モデルのダウンロードなどに時間がかかる。高速なインターネット回線が役に立つ時だ。

 インストールが完了するとデフォルトのWebブラウザが起動し、画像生成できるようになる。なお、なぜか初回は生成に時間がかかるので、その時間は今回は考慮しない。従って2回目以降に生成した結果となる。

結果

 ROCmの効果はいかばかりであろうか。見てみよう。

ROCmでの結果

 25秒とのことで、DirectMLでの結果と比較すると4分の1となる。こうかはばつぐんだ!

NVIDIAとの比較

 とはいえNVIDIAのGPUとの比較はどうなんだというのが気になるところであろう。第25回で「やはりGeForce RTX 3060 AERO ITX 12G OCを買うことにした」と書いたが、本当に手に入れたのでこれを使用する。インストール方法は第25回を読んでほしい。ただし起動用のシェルスクリプトは不要で、webui.shを使用するか、webui-user.shにオプションを追加するのがいいだろう。本文にもある通りメモリが12GBもあれば「–lowmem」オプションは不要だ。

Geforce RTX 3060での結果

 約19秒とのことで、Radeon RX 6600XTとあまり変わらない結果になっている。もちろん100枚生成するとそれなりの時間差になるが、今回は画像生成AIのために手持ちのdGPUを使用するのがコンセプトなので、充分に満足できる結果であろう。

 生成する画像の解像度が512×512だとあまり差が出ないが、1,024×768などより大きな画像にすると、如実に差が出てきてしまう。しかし、これはおそらくVRAMの容量の違いによるものと考えられる。正直なところ画像生成AIを使用するにはVRAMが8GBでは足りない。RadeonでもミドルレンジでVRAM 12GBのモデルが出てきてほしいものだ。

Gefore RTX 3060では1分35秒ほど
Radeon RX 6600XTでは3分近くかかる

NPUはどうなるか

 本誌の読者であれば2024年のトピックになりそうなことの1つとしてNPU(Neural Processing Unit)の普及がある。すでにNPU内蔵CPUが市場に出回っており、今後増える上さらなる高速化も見込まれている。そう考えると、来年にはCUDAやROCmではなくNPUとそのライブラリで画像を生成するようになっているのかもしれない。1年後に本記事が無用の長物になっているのであれば、それはとても愉快なことだ。