Radeon RX 500シリーズでROCmを使用してStable Diffusionで遊ぶ

RX 470, RX 480, RX 570, RX 580(Polarisアーキテクチャ)はROCm 4.5でサポートされなくなって残念と勘違いしていましたが、リンク先の記事をちゃんと読んだらOpenCLがサポートされないだけで、ROCm自体は普通に動くようです。ROCm 5.5で確認済み。ROCm 6.0でついにバイナリから除外されたみたいですが、ROCmを自分でビルドすればまだいけそう・・・みたいです。てか最近はOpenCLじゃなくてHIPっていうライブラリの方がメジャーみたいなんですね。全然知りませんでした。

なお、OpenCL環境変数ROC_ENABLE_PRE_VEGA=1を設定すればRX 500シリーズでも使用できるようです。ROC_ENABLE_PRE_VEGA=1 clinfoROC_ENABLE_PRE_VEGA=0 clinfoで、clinfoの出力が変化することを確認しました。もちろんOpenCLを使わないなら設定する必要はないです。

ROCmは今も普通に動くのですが、各ディストリビューションのアプリはRX 500シリーズを対象にビルドされていないのでアプリが動かないです。Arch LinuxだけはRX 500シリーズを対象にしたパッケージを今も提供してくれてるようですが。

ということで自分でアプリをビルドすればROCmでRX 500シリーズを動作させることができます。Stable Diffusionで遊ぶ場合は、pytorchとtorchvisionを自分でビルドしてやればよいです。ROCmを使用するアプリを自分でビルドするには、開発用ライブラリをインストールする必要があります。よってGPUドライバのインストールを次のオプションで行います。

amdgpu-install --usecase=rocm,mllib,mlsdk

or

amdgpu-install --usecase=rocm,hip,hiplibsdk

mlsdkhiplibsdkの違いはよく解りません。どちらでもだいたい同じライブラリがインストールされるようです。

ライブラリは/opt/rocm/にインストールされるので、ここにパスを通した上で、アプリがRX 500を使用するように設定してビルドすればOKです。

あと、グループの設定が必要でした。反映させるのに再起動が必要。

sudo usermod -a -G render $LOGNAME
sudo usermod -a -G video $LOGNAME

pytorchのビルド方法はだいたい以下リンクのThe old approachというセクションのとおり。 are-we-gfx1100-yet.github.io

pytorchビルド時に変更すべき設定はこんな感じです。

export CMAKE_PREFIX_PATH=hogehoge:/opt/rocm/
export USE_CUDA=0
export PYTORCH_ROCM_ARCH="gfx803;gfx900;gfx906;gfx908;gfx90a;gfx1030"

gfx803がRX 500シリーズを指します。

Radeonアーキテクチャーはrocminfo | grep gfxで調べられます。

PYTORCH_ROCM_ARCHの記述はArch Linuxの設定を参考にしました。PKGBUILD · 2.0.1-2 · Arch Linux / Packaging / Packages / python-pytorch · GitLab