AMD Radeon(RX7900XTX)でUbuntu+ROCm+Pytorch+Stable Diffusion WebUI

タイトルまんまの構築手順です。
Web上にもちらほら動作手順があるんですが、必要最小限まで削ってみました。

・AMD公式のLinuxドライバ＋ROCm5.5（23/05/12?）
・PytorchのROCm5.5版リリース(23/06/17?)

などあり、手順が大幅に簡略化されすぐに試せるようになりました。有り難いことです。
今回の手順だと30分かからず動作確認まで行けます。（ほとんどDLの待ち時間です）

1. Ubuntu22.04.2のインストール
1. GPUドライバ＋ROCm5.5インストール
1. Stable Diffusion WebUIインストール
1. 動作確認

# 1. Ubuntu22.04.2のインストール

Linux自体のインストール手順は世の中に山程あるのでここでは割愛しますがポイントは１点、
* Ubuntu 22.04.2を使うこと

ここで別のイメージを使うと、インストール直後にGUIが使えなかったり、
あとの方の手順でちゃんとドライバがインストールされなかったりするので注意。
（22.04と22.04.2は別物です）
https://jp.ubuntu.com/download
なりから、22.04.2のイメージを取得し、これを元にLinuxをインストールします。

# 2. GPUドライバ＋ROCm5.5インストール

RX7900XTX用のドライバ（＋ROCm）を取得します。「RX7900 Linux Driver」とかで出てきたAMDのページ、
https://www.amd.com/ja/support/previous-drivers/graphics/amd-radeon-rx-7000-series/amd-radeon-rx-7900-series/amd-radeon-rx-7900xtx

から、1.に対応する"Radeon™ Software for Linux® version 22.40.5 **for Ubuntu 22.04.2**"を選んでDL。
DLしたら以下の通り実行。（[上のドライバページからリンクされる手順](https://amdgpu-install.readthedocs.io/en/latest/install-installing.html#uninstalling-the-amdgpu-stack)のUbuntu版を要約）

なお、初出時誤っていましたが、"apt-get install xxx.deb"ではなく、apt-get install ./xxx.debとしないとだめです。（コメント欄でご指摘頂きました。ありがとうございます）
```bash
$ cd ~/Downloads #DLした場所
$ sudo apt-get update #事前に最新パッケージに更新
$ sudo apt-get dist-upgrade #被っているライブラリなどの解決が行われるらしい
$ sudo apt install ./amdgpu-install_5.4.50405-1_all.deb #最新のバージョンに適宜読み替えてください
$ sudo apt-get update #関連パッケージに更新があるかもしれないのでもう一度アップデート
$ amdgpu-install --usecase=rocm,graphics #GPUドライバとROCmのインストール
```

インストール後、以下のようなコマンドでGPU情報が読めるのが正解。PwrCap（所謂PL)は291W。
ちなみに私の使ったモデルはリファレンス版なのでこれがデフォルトですが、カスタムモデルだともっと高いみたいですね。
１秒毎に繰り返し表示するオプションとかないかしら。。。
```
$ sudo rocm-smi

======================= ROCm System Management Interface =======================
================================= Concise Info =================================
GPU  Temp (DieEdge)  AvgPwr  SCLK   MCLK   Fan    Perf  PwrCap  VRAM%  GPU%  
0    50.0c           24.0W   18Mhz  96Mhz  9.02%  auto  291.0W    2%   1%    
================================================================================
============================= End of ROCm SMI Log ==============================
```
ただ、毎回情報を見るのにsudoするのも面倒なので、[こちら](https://github.com/RadeonOpenCompute/ROCm-docker/blob/master/quick-start.md "Preparing a machine to run with ROCm and docker")の情報に従い、sudoなしで使えるようにします。
```
$ sudo usermod -a -G render $LOGNAME
$ echo 'ADD_EXTRA_GROUPS=1
EXTRA_GROUPS=video
EXTRA_GROUPS=render' | sudo tee -a /etc/adduser.conf
```
ここまで済んだら一度再起動。再起動後はマルチモニタなども動くようになります。

# 3. Stable Diffusion WebUIインストール

[stable-diffusion-webuiのGitHubページ](https://github.com/AUTOMATIC1111/stable-diffusion-webui) 内、「Automatic Installation on Linux」情報に従い、
以下の通り実行します。

上のページ内手順にないlibstdc++-12-devを入れているのは、
私のUbuntuインストール手順(22.04.2の最小インストール)だとこのパッケージが入っていなかったため。
また、webui.shを直接実行にしていないのは、このスクリプトだとROCm5.5対応のPytorchが入らないためです。
```
$ sudo apt install wget git python3 python3-venv libstdc++-12-dev
$ wget https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh
```

wgetで取得したwebui.shの中にある、Pytorchインストール部分を、ROCm5.5対応のバージョンに差し替えます。
テキストエディタなどでwebui.shを開き、Pytorchをインストールしている部分を探した上で
[Pytorch公式](https://pytorch.org/get-started/locally/)で出てくるインストールコマンドに置き換えてやればOK。
![スクリーンショット 2023-06-21 215010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262860/be3649a1-b1e6-631b-a69f-7a1f261b8a61.png)
なおpip3 install ..　の部分はpip install .. に変えてください。

書き換え終えたら、
```
$ bash webui.sh
```
とすると、大量のDLが始まりますが、10分程度（回線速度により変動）待ってやると、
「127.0.0.1:7860を見ろ」的な表示が出るので、その通りブラウザで繋いでやればよいです。

GPUメモリもいっぱいあって、速度もそこそこ早く良い感じ。
ちなみに初回だけ遅いのは裏でHIPコードコンパイルしてるせいです。
（libstdc++-12-devはここで使われる）

![Screenshot from 2023-06-21 21-08-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262860/ee795d93-13ae-df5f-16cc-346023525729.png)

# 4. その他

--xformersが使えない（動かない）こともあって、batch=1x10ベンチ取ると4070よりも遅いですが
batch=8にして8枚1セットでガンガン回す、とかだとテンポよく使えますね。(1セット15秒くらい)

ROCm5.5＋Pytorch、OpenCALMのLoRAファインチューニングも普通に回りました。素晴らしい！
最後まで回してないですが(一応Val Lossとかが下がるのは確認）、
[npakaさん](https://note.com/npaka/n/na5b8e6f749ce) の手順を試し、予想時間4時間半とか出てたので※
ColabのA100に近い速度は出てそうです。

そしてVRAM24GBはお絵描きにせよLLMにせよ「メモリ不足に悩まされることが少ない」という
絶対的な安心感があります。

これで最安14万（6/20時点)、コスパ的にはかなり良くないですか？
[WindowsでROCmが動くかも](https://videocardz.com/newz/amd-working-on-rocm-support-for-windows-os)的な話もあり、[PytorchがAMD向けの最適化を積極的にやる](https://pc.watch.impress.co.jp/docs/column/ubiq/1508816.html)的な話もあり
ようやくAMDでも他と同じようにMLができる環境が整いつつある、的な感があります。※2
ぜひとも一択と言われがちな今のGPU環境が変わってほしいですね。

※実は8bit量子化のところだけエラーになって、量子化外すと7bモデル＋LoRAが24GBに収まりませんでした…
「4時間半」はメインモデルを3bにした場合の速度です。

※2 この記事の関連で出てくる、３年位まえの記事を読むと「ようやくここまで」的な感があります。長かった...