
懲りずにUbuntu上のRADEON RX470でStable Diffusionを動かそうとして上手くいった
前にどうも私じゃ手に余ると諦めた、Ubuntu上からRADEON RX470でStable Diffusionを動かす件。
ちゃんとやればできるそうな。
RX470(などPolaris系GPU)では、新しいROCmに対応しないから駄目だという話だったんですけど、それは一般的な手段でインストールされるPyTorchやTorchVisionがPolarisを対象外にしてビルドされているだけで、自分でRX470で動くようにビルドすればよいと。
その手順が、個人サイト「忘備録」の上記記事に書かれていました。
やり方(もう少し細かく)
上記記事はわかってるひとが書いているので、私みたいなLinux経験値がほとんどない身には、結構試行錯誤がありました。
やり方の大枠としては、忘備録で紹介されている「Run A1111 WebUI on Ubuntu 22.04 with RX 7900 XTX」の、ある程度下に進めたところの「The old approach」でやります。
端末に打ち込むべきコマンドラインがほぼズバリ書かれているので、おおむねコピペで進みます。
「Install AMDGPU Driver」から。
頭の2行(コメント含まず)はネットからRADEONのドライバインストーラーを取ってきてインストールしてるので、これは私はブラウザからしました。(ドライバ自体が入るんじゃなくて、amdgpu-installというコマンドがインストールされます)
で、amdgpu-installコマンドは、「忘備録」の記載に合わせて変更。
sudo amdgpu-install --usecase=rocm,hip,hiplibsdk
としました。
それから最後の2行は、ちゃんと動作しているかの確認です。実行できてればRADEONのドライバは入ってます。
書いてないですが、ここで再起動。
「Install Ubuntu dependencies」は、これは単に書いてる通りに端末にコマンドを入れていきます。
これをやり漏れてると途中でエラー出るところがあります。
次「Build」。
「Enter venv environment」はそのままでOKです。
ここでPythonの仮想環境というのを作ってるので、この先でなにか上手く行かないことがあったら、端末を閉じて、ここでmkdirで作ってるフォルダを削除すればなかったことになる(ようです)。
それからここからやり直し。
「Build torch by yourself」が大仕事になります。
「Compile PyTorch 2.0.1」の手順は、export … の行を「忘備録」の記載に合わせて変更します。
export CMAKE_PREFIX_PATH=%HOME/stable-diffusion/venv:/opt/rocm/
export USE_CUDA=0
export PYTORCH_ROCM_ARCH=gfx803
私はこのようにしました。(「忘備録」の記載ではhogehogeになってるところ、どう入れるのかわからなかった。PYTORCH_ROCM_ARCHはとりあえずPolarisを指すgfx803だけにしました)
で、私がやったら何故か、最後のsetup.py installを実行してる途中で、/usr/lib/~~~~/librt.soというファイルがないと言われて止まってました。
でもlibrt.so.1というファイルがあったんで、これをコピーしてlibrt.soを作れば大丈夫でした。
これなんで発生したのだろう……?
このビルドは、めちゃくちゃ時間かかりました。寝てる間にやったら途中でうっかりサスペンドされたりしましたが、稼働時間だけで6時間くらいかかってたような……。
6時間かかる工程に入ると、端末の一番下の行に[nnnn/xxxx]と進捗表示が出ました。私がやったら6600くらいまであって長い長い……。
「Test PyTorch functionality」は動作確認です。
ひとつめのPython3を起動してからやるやつは、import torchがいきなりうまくいかず。You can also try this:の方がいけました。
テストを実行するときのカレントフォルダが違うとNGになるみたいでしたが、まあエラーメッセージをよく見ると判断できたので。
「Compile torchvision 0.15.2」は、CMAKE_PREFIX_PATHだけ直してそのまま実行。ここはそんな法外に時間はかかりませんでした。
「Install」は、いよいよStable Diffusion WebUIのインストール。
これはそのまま最後までいくと、WebUIが起動してきます。
いけた!

立ち上がってきたので、慣れてるモデルやLoRAを放り込んで、実行チェック。ちゃんと処理しますね。やった、ついに勝利だ。
まさかと思うけどCPU処理してるだけじゃないよな、と思い、演算中にrocm-smiを叩いてみると。
$ rocm-smi
=== ROCm System Management Interface ===
== Concise Info ==
GPU Temp (DieEdge) AvgPwr SCLK MCLK Fan Perf PwrCap VRAM% GPU%
0 80.0c 121.195W 1074Mhz 1750Mhz 99.22% auto 122.0W 71% 100%
=== End of ROCm SMI Log ===
大丈夫、RADEONが働いている。
体感速度でも、さすがにGeForce RTX3060 12GBよりはだいぶ遅いですが、CPUでこんな速度は出ないだろうという程度にはなってます。

Negative prompt: verybadimagenegative_v1.3, easynegative, (bad hands, bad fingers)Steps: 20, Sampler: Restart, CFG scale: 7, Seed: 629249516, Size: 512x512, Model hash: d673b53e80, Model: dorayakimix_v30Fp16, Denoising strength: 0.45, Hires upscale: 1, Hires upscaler: R-ESRGAN 4x+ Anime6B, Lora hashes: "USS_Mississippi_v1: 0e05dc84f493", Version: v1.6.0
Time taken: 1 min. 51.2 sec.
A: 3.46 GB, R: 4.86 GB, Sys: 5.4/8 GB (67.7%)
はい生成OK。よし。
LoRA/LyCORISもちゃんと動いてる。それなりに遊べそう。
処理速度について
GeForce RTX3060だと、512x512の生成は15秒くらいで済んでます。今回のRADEON RX470だと2分弱で、速度差はざっと8倍。
RADEON RX470は2017年頃のだから、同時期の競合製品はGeForce GTX 1060あたり。クラスとしては中級の下くらいだから、2世代も違えば性能差はあるでしょう。
ゲームやってフレームレートが8倍違っちゃうなんてことはないと思うんですが、まあAI関係となると新世代ほどより機能的によくなったりしてると思うので、それでこんな差になるんでしょう。
OutOfMemoryError
512x512の生成は上手くいったんですけど、これをHires. Fixで大きくしようとすると駄目。
12GBで512x512→2048x2048(4倍)にできるのに、8GBで512x512→1024x1024(2倍)すら駄目だとは。なんかエラー表示を見ると、メモリを8GB使い切らずに手を上げてるようにも見えましたが。
じゃあlaunch.pyの呼び出しにオプション付けてみますか。
cd ~/stable-diffusion
source venv/bin/activate
python3 launch.py --medvram
定番--medvramオプション。
medvramをつけると、512x512から1024x1024の2倍拡大はできました。

Negative prompt: verybadimagenegative_v1.3, easynegative, (bad hands, bad fingers)
Steps: 20, Sampler: Restart, CFG scale: 7, Seed: 366296035, Size: 512x512, Model hash: d673b53e80, Model: dorayakimix_v30Fp16, Denoising strength: 0.45, Hires upscale: 2, Hires upscaler: R-ESRGAN 4x+ Anime6B, Lora hashes: "USS_Mississippi_v1: 0e05dc84f493", TI hashes: "verybadimagenegative_v1.3: d70463f87042, easynegative: c74b4e810b03", Version: v1.6.0
processing | 13.3/28.4s
Time taken: 8 min. 56.0 sec.
A: 5.92 GB, R: 6.43 GB, Sys: 6.9/8 GB (85.6%)
ちょっとNSFWな絵になっちゃったので一部規制。(from belowとかプロンプトつけるからではありますが、このキャラは巨人的な存在なもので)
2倍拡大で4倍の面積を生成するせいか、やっぱり4倍強の時間がかかっちゃう。--medvramは速度が犠牲になるし。
しかし--medvramでも、2.5倍(1280x1280)でエラーになっちゃった。
これ以上は、--medvramを--lowvramに変えてやるしかないかな。
それにしても、RADEONはRX470くらいの世代・クラスでも8GBモデルがある、という点で、メモリ量が大事なStable DiffusionではGeForceより有利かなあと思ったんですけど、8GBあっても--medvramで1280x1280が駄目とは意外だった。
あんまりメモリの使用効率がよくないんだろうか。それとも8GBってこんなもんなのかな。GeForceの8GBを知らないからなんとも。
ちょっと遊ぶ程度なら遅いのは許容できると思うんですが、出力解像度が低いんじゃ寂しいな。
他にやってみること
Windows環境だと、起動オプションに--listenをつけて、他のPCのブラウザからIPアドレスを見に行ったらWebUIを開けたんですけど、今回の環境だったら駄目でした。なんか設定要りそうだから追って調べよう。
それができたら、Softetherを入れてVPNサーバーを建てて、外からでも自宅LANに入って共有ファイル見たりStable Diffusionを触ったりできるように、と。