Radeon ZLUDA

Last-modified: 2024-06-30 (日) 23:34:45
 

Radeon ZLUDA

 

AMD Radeonで Stable Diffusion wewbui A1111をwindows10直起動で使ってるよ (初版: 2024年6月)

 

本記事は、既にRadeonを持っていて Stable Diffusion をwindowsでちょっとやってみよう、という
お手軽ライトユーザー向けね。
ガチ勢向けではないよ。またこれからVGAを買おうという人向けでもないからね。

まず現在のAI対応Radeon GPU一覧はココ
https://rocm.docs.amd.com/projects/install-on-windows/en/develop/reference/system-requirements.html
Windows-supported GPUsのタブがAMD Radeon PROタブになっていてその脇のAMD Radeonタブのところ。
RX7000シリーズ、および、RX6950XT, RX6900XT, RX6800XT, RX6800 これらが公式対応GPU。
(非対応GPUでも別途ライブラリを投入すればいけるらしい。)

 

Radeonでは、2024年の2月にZLUDAが公開されて以降、状況がガラリと変わってて、
もうwindowsで普通に使えてるよ。
2024年2月以前の情報は無視してOK。
それ以降も相変わらず的外れな情報が氾濫しているけど、それらは古い情報の受け売りだから、
あまり真に受けないように。AI関連では半年前の情報ですら既に古くて役に立たないどころが
害悪ですらあるからね。
特に、生成スピードとインストールの難易度がZLUDAで断然良くなったから。
生成スピードについては、wikiの グラボについて のZLUDA使用時の値と 5-3生成時間 を参考に。

インストールについては、下記長々と書いてるけど手数はNvidiaのときと基本変わらなくて、
Pythonのインストール、gitのインストール、AI開発キットのHIP SDKのインストール、
そしてA1111のインストールだ。

 

おおまかな流れ

1. 準備 (Nvidiaと共通)
ストレージ、SDXLモデルの用意, Python, git, Visual C++ Runtime, VGAのドライバ更新

2. AMDのAI用開発キット HIP の導入(AMD Radeon限定)

3. A1111のZLUDA版のインストール、起動 (Forgeも基本的に同じ)

4. APU機にGPUを挿して使っている場合限定の追加設定

つづく5, 6, 7, 8, 9 は おまけ

5 トラブルシューティング

6 ComfyUI ZLUDA版

7. SD.Next

8. おススメは

9. ZLUDAとは

1. 準備 (Nvidiaと共通)

ストレージ、SDXLモデルの用意, Python, git, Visual C++ Runtime, VGAのドライバ更新

 

1-1 ストレージ

なんだかんだで100GBくらい消費するので空きを用意しておく。
Pythonがらみのファイルが数十GBと、結構消費する。

 

1-2 SDXLモデルの用意

SDXLモデルをひとつ、あらかじめダウンロードしておく。
ファイルサイズは7GBくらいある。
事前にモデルをダウンロードしておかないとどうなるかというと、
A1111などはインストール処理の途中でモデルの有無をチェックしていて、
モデルが無い場合は自動でモデルをひとつ、ダウンロードする。
そしてなぜかこういうときに限ってネットワークやサーバーが遅くなるもんで、
GB級のダウンロードで数時間待たされたあげく、最後の最後でダウンロードが
切れて失敗なんてことに。

モデル選びは、最初は流行りのモデルにしとけ。
いま2024年春なら、
昼向け: animagineXLV31_v31.safetensors (SHA256: 1449E5B0B9DE87B0F414C5F29CB11CE3B3DC61FA2B320E784C9441720BF7B766)
昼夜兼用: ebara_pony_2.1.safetensors (SHA256: cc6db13c9135afbb75df7cfed4fa99208a510da7c3d2d8bf9634e5576e6f1532)
これら2つはVAE内蔵なので初に使うのに向いている。
なお最初が実写系だといきなりトラウマレベルの絵が生成されたときのショックが
おおきいから最初はやめとけ。

次に進む前に、
モデル配布元にはSHA256などのhash値が書かれているので、
ダウンロードしたのモデルのhash値があっているか確認しておく。
#microsoft純正だとfcivというツールがいちおうあるが、hash値が出せればなんでもよい。
hashの確認は、ファイル破損のほかにセキュリティの意味がある。
実際、つい最近(2024年6月)も、ComfyUIのとあるcustom nodeにmalicious codeが仕組まれていて
PCがhackされることが起こってる。
どこもhashを載せてるのはそういうこと。

 

1-3 Pythonインストール

Pythonhttps://www.python.org/ から入手する。
Microsoft WINDOWS STOREにもPythonがあったりするが、それは使ってはいけない。
必ずpython.orgから入手する。
旧バージョンの、Python 3.10.6の64bit版をインストールする。
Windows installer (64-bit) とある、python-3.10.6-amd64.exe これ。
新しいバージョンの3.12などではなく、3.10.6をインストールする。
なおインストールの際、インストーラーのデフォルトのままどんどん進めると

Add Python 3.10 to PATH

のチェックボックスが非チェックになっているので、
ここをチェック済みにしてインストールを進める。
インストール後、PCを再起動。

次に進む前に一旦確認したい場合、コマンドプロンプトを開き、

python -V

と入力し(ここのVは、小文字のvではなく大文字のV。)、

Python 3.10.6

と表示されればOK。
エラーになったらそれは先のチェックボックスのチェックを
忘れてる。Pythonの再インストールだ。

 

1-4 git インストール

インストーラーでデフォルトのままどんどん進めるだけでOK。
途中で

Git from the command line and also from 3rd-party software

これ大事で、デフォルトだとこれが選択されている。
(将来的にもデフォルトで選択されてるかはわからん)

次に進む前に一旦確認したい場合、コマンドプロンプトを開き、

git -v

と入力し、

git version (バージョン番号)

と表示されればOK。
エラーになったらそれは先のGit from the command line …が選択され
てない。gitの再インストールだ。

 

1-5 Visual C++ Runtime インストール

通常は既にPCにインストールされているので、わざわざ再インストールする必要はない。
ただ、新品PCやOS再インストール直後だとこのRuntimeが入っていないので、
下記をインストールする。
https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist
ここのx86用とx64用の2つ。コレら。
https://aka.ms/vs/17/release/vc_redist.x86.exe
https://aka.ms/vs/17/release/vc_redist.x64.exe
インストールはデフォルトのままどんどん進めるだけでOK。

 

1-6 VGAドライバ更新

すでに最新にしているのなら、そのままでよい。
最新以外なら、Radeon, Nvidiaともに適切なバージョンのドライバに更新する。
Radeonの場合は、2023年の30週以降のドライバにする。2023年11月以降ならOKなのは確認済み。
Nvidiaの場合は、バージョンによって出来ることと出来ないことが変わるので、
wikiを参考にバージョンを選ぶ。
なお、公開から日が浅いドライバ(2週間が目安)は、更新する前に情報を収集すること。
RadeonもNvidiaもどちらもやらかすことがある。
このやらかしとは過電圧過電流ドライバで物理破損なんてのも含まれるので公開直後は要注意だ。
やらかし放題の業界だからしょうがない。

 

2. AMDのAI用開発キットHIP の導入(AMD Radeon限定)

AMDのAI用開発キット AMD HIP SDK for Windows をインストールする。
https://www.amd.com/en/developer/resources/rocm-hub/hip-sdk.html
ここの

5.7.1のHIP SDK
AMD-Software-PRO-Edition-23.Q4-Win10-Win11-For-HIP.exe

インストーラーでデフォルトのままどんどん進めるだけでOK。
インストール時、ほとんどのチェックボックスは最初からチェック済みになってるが、
VGAドライバのところだけは未チェックになっている。先にVGAドライバの更新を済ませて
あるので、ここではVGAドライバのチェックボックスは未チェックのままで先にすすめる。

ネット上の情報だとこれをインストール後にPATHの設定するなどとあるが、
インストールの際にデフォルトのままどんどん進めるとインストーラーが自動的にPATHを設定
するので、この点も大丈夫。
HIP SDKインストール完了後、ここでPCを再起動しておく。

#なお、対応GPUは、RX7000シリーズ、および、RX6950XT, RX6900XT, RX6800XT, RX6800だが、
#ここに無いGPUでも非公式ながら別途ライブラリを投入すればいけるらしい。
#ライブラリはソースから自ビルドするのが基本。
#ネット上だとここにビルド済み追加ライブラリがある。
https://github.com/brknsoul/ROCmLibs
RX6600用: Optimised_ROCmLibs_gfx1032.7z
RX6700用: Optimised_ROCmLibs_gfx1031.7z
それ以外(旧々型やAPU付属GPUなど): ROCmLibs.7z
#HIP SDKをインストールののち、
#ROCm HIP SDK ライブラリフォルダ
C:\Program Files\AMD\ROCm\5.7\bin\rocblas\library
#ここにライブラリを投入し、PCを再起動する。

##これは私見だが、
##いまはAIの過渡期なのでこのようにAI用の開発キットを別途インストールしなければ
##ならないけど、そのうちVGAドライバに含まれるようになると思う。

次に進む前に一旦確認したい場合、コマンドプロンプトを開き、

hipinfo

と入力。ずらずらと情報が出てきて、
その先頭付近に

Name: AMD Radeon RX なんとか

そして最後あたりに

gcnArchName: gfx10xx

とPCに挿したVGAの名前とアーキテクチャ名が表示されてればOK。
もしここに

AMD Radeon(TM) Graphics

などと表示されてたらそれはAPU内蔵GPUなので、別途設定が必要。
後述する、 4. APU機にGPUを挿して使っている場合限定の追加設定 を参照のこと。

 

3 A1111 のZLUDA対応Fork版のインストール、起動 (Forgeも基本的に同じ)

方法はNvidiaのときとさほど変わらない。相違点は3つ。
ひとつ、ZLUDA用に別のフォルダに新規にインストールすること。
ふたつ、A1111の入手元をZLUDA Frok版にすること。
みっつ、起動オプションに --use-zluda を加えること。

 

3-1 A1111のZLUDA Fork版を入手

A1111のZLUDA Fork版のgithub
https://github.com/lshqqytiger/stable-diffusion-webui-amdgpu
なおForgeのZLUDA Fork版はこちら。
https://github.com/lshqqytiger/stable-diffusion-webui-amdgpu-forge

インストール方法が書いてあるのでそれに従うだけ。
軽く書いておくと、
まず、インストールしたいフォルダを新規に作る。たとえば C:\A1111
全角文字はやめとけ。
かならず新規にフォルダを作ること。既にDirectMLなど他の方法でインストールしている場合、
手を抜いて使いまわそうとすると失敗するのでかならず新規にフォルダを作ること。
次に、新規に作ったフォルダでコマンドプロンプトを開く。
そして下記gitコマンドでA1111のZLUDA Fork版をダウンロード(clone)する。

git clone https://github.com/lshqqytiger/stable-diffusion-webui-directml.git .

ForgeのZLUDA Fork版はこちらのgitコマンド。

git clone https://github.com/lshqqytiger/stable-diffusion-webui-amdgpu-forge.git .
 

3-2 SDXLモデルファイルの投入

git cloneするとフォルダ内にmodelsフォルダが出来、その中にStable-diffusionフォルダがあるので、

models\Stable-diffusion

このフォルダにあらかじめダウンロードしておいたSDXLモデルをコピーする。

 

3-3 起動用ファイル webui-user.bat の編集

ZLUDAを使うべく、起動オプションを設定する。
ファイルwebui-user.batの一部をメモ帳などで編集。
うっかりダブルクリックするとA1111が起動してしまうので、ダブルクリックはいまはしてはいけない。
メモ帳を開いてそこにドラッグアンドドロップ。
全部で数行しかなくて、そのなかで

set COMMANDLINE_ARGS=

とあるところを、

set COMMANDLINE_ARGS=--use-zluda

に書き換えてwebui-user.batを上書き保存。
これによりZLUDAを使うようになる。A1111の初回起動時に自動的にZLUDAのファイルが
ダウンロードされ、ZLUDAの設定も自動的に行われるようになる。
なお、ネット上の情報では、ZLUDAのインストールや設定を別途行うなどとあるが、
それはZLUDA登場当時の話。すぐに全自動化されたんだけども、古い話が拡散され続けて
しまっている。
いちおう既に別途ZLUDAをインストールしてある場合もちゃんと考慮されていて、
既にZLUDAがインストール済みの場合、それが最新版かチェックされ、
最新版ZLUDAの場合はそのままインストール済みのZLUDAを使うようにもなっている。

あと起動オプションだが、定番オプションのうち、実際に使うのは少VRAM機で--medvram程度。

set COMMANDLINE_ARGS=--use-zluda --medvram

と記述する。
他のオプションは、搭載VRAM量によって効果あったり無かったり、逆に悪化するものもある。
Nvidiaの際にみられる--xformersは動かないのと、
仮にxformersが動いたとしても昔はともかく今はxformersは不要。

 

3-4 A1111初回起動

*必ずSDXLモデルを投入してから起動すること*

webui-user.batをダブルクリックして起動。
するとコマンドプロンプトが開いて処理内容がずらずらと表示されていく。
このコマンドプロンプトだが、これはたんなるコンソール表示窓ではなくむしろこちらが
いわゆる本体といえば本体なので、このコマンドプロンプトは閉じないこと。
起動すると各種ファイルのダウンロードが始まり、ざっと3GBくらいダウンロードするので、時間がかかる。
しばらくすると自動的にWebブラウザにwebUIが開くが、この時点ではまだ初回起動処理中。
OSのタスクマネージャーで軽いCPU負荷(シングルタスクにつきCPU1コア相当)が見えているあいだは
初回起動処理中である。
この状態でもgenerateボタンは押せるんだけど、生成プログレスバーは初回起動処理が
終わるまでは出現しない。
この状態で10分くらい待たされる。
一見止まっているように見えるので不安になるかもしれないが、初回起動処理の進み具合が
気になるのなら、間接的に、zluda.dbのファイルサイズでわかる。

C:\Users\ユーザー名\AppData\Local\

ここに
ZLUDA\ComputeCacheフォルダが造られていて、その中に

zluda.db

があるので、そのファイルサイズを見る。
ゼロから徐々にサイズが大きくなっていって、45MBくらいになると、初回起動処理が終わる。
CPU負荷が無くなり、zluda.dbの肥大化もひとまず止まって、コマンドプロンプト

calculate empty prompt(...)

と表示が出る。
ここまでの待ち時間はPCスペック次第だが、ダウンロード時間に加え10分くらいといったところ。

 

3-5 初回生成

まずはgenerateボタンを押す。
特になにも設定せずにいきなりgenerateボタンを押す。512x512サイズの生成が開始される。
先の初回起動処理がおわっていれば、今度は初回起動とはまた別の、初回生成処理が始まる。
これまた一見止まっているように見えるが、zluda.dbが肥大化し始める。
しばらくするとコマンドプロンプト内に生成プログレスバーが出現するも、
プログレスバーは0のままで全く進まず、そのあいだzluda.dbが肥大化し続ける。
この初回生成処理もたいだい10分くらいかかり、おわるとプログレスバーが動き出す。
zluad.dbファイルサイズが45MBから徐々に大きくなっていって、たいだい90MBくらいになると
プログレスバーが動き出し生成が始まる。

このような時間がかかるのはA1111インストール後の最初の1回目の生成のときだけ。
次回以降はすんなり始まる。
ただし、なんらかのバージョンアップをすると、再度初回処理が始まることがあり、
そのときはまた待たされる。AI関連のバージョンはもちろん、GPUドライバのバージョン
なんかも変わればもう別物なのだからそういうものだ。

 

3-6 A1111終了方法

作法としてはコマンドプロンプト内でCtrl-Cののち n を入力して終了させるのだが、
いきなりコマンドプロンプトのwindowを閉じても強制終了はする。
強制終了しても特に不具合は起きないので、いきなりwindowを閉じて強制終了しても大丈夫。
ただし、強制終了だと生成時につくられた一時ファイルのゴミが大量に残る場合がある。
このゴミ、A1111のバージョンによって一時ファイルの削除の仕方が異なり、起動時に削除するのも
あれば、終了時に削除するのもある。
なので、終了時に削除するのだと、いきなりwindowを閉じて強制終了した場合はこの削除処理が
されないので、ゴミが残ったままとなる。
一方、起動時に削除されるのだと、次の起動時までゴミが残ったままになる。このゴミを見られて
困る場合は、削除のためだけに起動をしてなにも生成せずに終了させる。
この手のは一時ファイルやログを誰かに見られると大変なことになったりするので、一時ファイルや
ログのありかは確認しておいたほうがよい。一括削除用のbatファイルを作っておくと楽。
とりあえず、まず画像の生成をスタートし、生成途中でストップさせて、下記のフォルダを覗いて
みよう。

C:\Users\(ユーザー名)\AppData\Local\Temp\gradio

またSettingsでこのあたりを設定する手もある。

Settingsタブ - Saving images - Saving images/grids

ここのコレと、

Directory for temporary images; leave empty for default

続くコレ。

Cleanup non-default temporary directory when starting webui
 

4. APU機にGPUを挿して使っている場合限定の追加設定

APU機にGPUを挿しているPCでは、AI用途がAPU内蔵GPU側に固定されてしまう場合がある。
その場合の選択肢は2つ。

4-a APUの内蔵GPUを無効化

APU内蔵GPUは使えなくなる。
内蔵GPUを無効化するにはPCのBIOS設定でAPU内蔵GPUをdsableにする。
BIOSでdisableにせずにwindows OS上のデバイスマネージャーでAPU内蔵GPUを無効にする方法も
あるが、OSが勝手に復活させることがあるらしい?また無効ではなく削除だとOSは確実に勝手に
復活させるので削除は無意味。

4-b APU内蔵GPUを通常使用しながらもAI関連だけは挿したVGAのGPUを使うようにすべく、OSの環境変数を設定する

windows10の設定にて

設定 - システム- 詳細情報 から[システムの詳細設定]

を開く。
すると、システムのプロパティというwindowが開くので、そこにある[環境変数]を開く
環境変数というwindowが開くので、
上段と下段の2つの枠うち上段[ユーザー環境変数]のところの[新規]で新規設定窓を開き、

変数名 HIP_VISIBLE_DEVICES
変数値 1

としてOK。そしてここでかならずPCを再起動する。

上記を設定してもAI用途にAPU内蔵GPUが使われてしまっている場合は、変数値を1ではなく

変数値 0

にしてPCを再起動。
ネット上の情報では、変数値は1にするとあるが、実際は個々のPCで異なり、
変数値は0, 1, 2のどれかが当たりなので、ひととおり試す。
いちど当たりを見つけさえすれば、PCを再起動してもコロコロと変わることは無いが、
マザーボードのBIOSを更新したら変わることもある。
いちおう確認方法はあり、
コマンドプロンプトを開いて、

hipinfo

ここで表示されているデバイスが、AI用に認識されるデバイス。
デバイス名に

AMD Radeon RX なんとか

という具合にPCに挿したVGAが表示されてればOK。
ここが

AMD Radeon(TM) Graphics

などと表示されてたらそれはAPU内蔵GPU。

上級者であれば、コマンドプロンプトでsetコマンド使って

set HIP_VISIBLE_DEVICES=0

hipinfo

で当たりを探るのはもちろん、HIPが認識するVGAを切り替えてA1111を起動させたりもできるぞ。

 

5 トラブルシューティング

5-1 A1111Forgeのインストールがうまくいかないときは

A1111Forgeに限らず、この手のいろんな外部モジュールを使っているのは、
それら外部モジュール側で仕様変更があると動かなくなることが多々ある。
実際A1111でもForgeでもSD.Nextでもしょっちゅうある。
たいていは2,3日くらいで作者側で対応されるのだが、対応までに時間差があるので、
たまたまそういうときにあたると、当然うまく動かない。そういうものだ。
対応されるまで待つのもよいが、
旧バージョンを明示的に指定してやると動くようになるので、
配布元のgitのdiscussionsやfork元のおおもとのA1111のgit discussionsで話題に
なっていないか見てみよう。

5-2 生成は出来たがGPU負荷がゼロ

windowsのタスクマネージャーだとそうなる。
一昔前の、DirectMLの場合はGPU負荷が見えるのだが、ZLUDAはちょっと違う。
OSのタスクマネージャーは、GPUの負荷のうち3Dの処理負荷を表示していて、
ゲームなどでは3Dの処理に負荷がかかるからそれでよいんだけれども、
Stable Diffusionでの生成は、
Nvidia機や、RadeonでもDirectMLのときは3D処理なので負荷が見えるが、
ZLUDAの場合は3D処理ではないので、3D負荷はゼロだからGPU負荷がゼロに見えてしまう。
タスクマネージャーでZLUDAでの負荷を見るには、GPUの3DではなくCompute負荷を見る。
負荷表示グラフのうちどれかをプルダウンしてComputeに変更すると、生成時に負荷のグラフが現れる。
ComputeにはCompute 0 や Compute 1 など複数あって、どれか1つが当たりなので全部試す。
生成時にComputeの負荷がずっと99%前後になっていれば正常。もしグラフが大きく波打ってたら
たいていはVRAM不足でメモリスワップが発生している。

5-3 生成時間が長すぎるときは

それはGPU生成ではなくCPUで生成している。ネット上でもみかける。そこではRadeon遅いなどと
あるが、生成所要時間をみるにそれはCPUで生成している。
ネット上のあちこちの古い情報をごちゃまぜでやってるとそういう状況に陥りやすい。
githubにある一次情報を見ることを心掛けよう。

生成時間については、生成速度はあるていど推測が可能で、
GPUのTFLOPS値(単精度浮動小数点演算性能)に連動している。
https://ja.wikipedia.org/wiki/AMD_Radeon

RX 7900XTX: 61TFLOPS
RX 7900XT: 52TFLOPS
RX 7900GRE: 46TFLOPS
RX 7800XT: 37TFLOPS
RX 7600XT: 22.57TFLOPS
RX 6950XT: 23.65TFLOPS
RX 6900XT: 23.04TFLOPS
RX 6800XT: 20.74TFLOPS
RX 6800: 16.17TFLOPS
 (VRAM容量が8GBや12GBだとメモリスワップが発生するので除外)

VRAM容量が16GB以上であれば、TFLOPS値が倍なら生成速度はだいたい倍になると考えてよい。
よって自分のRadeonでの生成速度は他のRadeonの速度とTFLOPSの比から推測可能である。
Radeonの場合はZLUDA登場以前と以後では状況が大きく異なるので、速度を推測する際は、
ZLUDA使用の速度を元に計算すること。
そしてもしその推測値に比べ4倍くらい時間がかかっているのなら、それはZLUDAではなく
ひと昔前のやりかたのDirectMLにて生成している。
4倍どころか10倍などあまりにも長く時間がかかっている場合は、それはGPUではなく
CPUで生成している。タスクマネージャーでCPUとGPUの負荷をみればわかる。

5-4 拡張機能

Forgeで拡張機能が動かないのなら、それはForgeの問題。Radeonの問題ではない。
wikiのForgeのページ参照のこと。

あとありがちなのは、PonyやPony系モデルに非Pony系のを使ったり、その逆の
非Pony系モデルにPony用のを使ってると、それはうまく動かない。
またSD1.5専用の拡張機能をSDXLに使っていると、それもまともに動かない。
それはそういうものなので、Radeonの問題ではない。Pony系モデルにはPony用のをと、
それぞれのモデルに対応したのを使わなくてはならない。
特にPony系は、Pony公開当時はSDXLとして分類されていて、しばらくしてからPonyは
独自扱いになったので、その当時は混乱していたのと、いまだその名残が一部残って
いるので、良く調べる必要がある。
ネット上の情報にはSD1.5時代の古い情報がそのままになっているのが多いので、そういう
古い情報を参考にするとこういうことがおこりがち。

また古い情報ではRadeonでは動かないとあるのは、それはZLUDA登場以前の話。
たとえば学習は、DirectMLの頃は可能といってもとてもじゃないけど実用的ではなかったが、
ZLUDAで状況は変わった。
それでもZLUDAでもうごかないものはある。A1111ではあまりないのだが、ComfyUIだと
古い(2022年頃)のカスタムノードのなかには動かないのがある。ZLUDAではたとえば
Flash Attentionはサポートしていないので、Flash Attention必須のは動かない。
でも実際はそういう古いのはより高性能な新しいのに置き換わっているのがほとんど。
xformersもうごかないのだが、昔はともかく現在はxformersは必要としないし、xformersが
なくても問題なく動く。Nvidiaだってみんながみんなxformers有効にしているかというと
そんなことはないわけで、それでNvidiaで問題がおこっているかというとそんなことないし。
ただし、ComfyUIのカスタムノードでxformers必須のものは動かないので、それが絶対に
必要となればそれは大規模機械学習であろうからそれほどのヘビーユーザーならNvidiaの
最上位モデルへ。一方、ヘビーユーザーでなければ、
そこらへんはあきらめて大容量VRAMが手に入るRadeonか、
VRAM容量はがまんしてNvidiaか、
どちらにしても大規模機械学習だけクラウド使うのが非ヘビーユーザーには合理的。

そういうのとは別に、なにか微妙に違う、というのはありえる。推測だが、浮動小数点の
演算において速度のために演算精度を端折ってたりすると、その端折り方の違いで、
演算結果にわずかな違いが生じる。RadeonとNvidiaではその端折り方が違うし、
またどちらも世代が変わると端折り方を変えてくるので、その違いによって
結果にわずかな違いが生じても不思議ではない。たとえばNvidiaどうしでも
世代が違うと微妙に違うからね。

5-5 他の人の絵と同じ絵を出そうと同じ設定にしたのに同じ絵が生成されない

同じモデルを使っていてプロンプトも同じ、サンプラーもLoRAも拡張機能もなにもかも同じに
しているのにあまりにも違う絵が生成された場合は、設定で異なる部分がある。
たいていは、ENSDとかEta(2種類ある), Clip skipの値を合わせ忘れてる。これらは
設定する場所が違うので見落としやすい。txt2imgタブではなくSettingsタブの中にある。

もしモデル配布元のサンプルと同じ絵を生成しようとしているのなら、

あれは広告

広告なのだから、絵の加工やすり替えがされていると、同じ絵が生成されないのはそりゃそう。

自分がNvidiaで生成した絵との比較でRadeonで生成したら似たような絵が生成されたが
細部が少し違う、というのなら、それはそういうもの。
これはNvidiaのGPUどうしでもGPUのコアチップが異なるモデルで生成した絵どうしで比較すると
細部が変わってたりするので、細部が少し違くなるのは、そういうもの。
またA1111などのバージョンが違う場合も細部が変わることがあり、そういうもの。
先と同じ推測だが、浮動小数点の演算において速度のために演算精度を端折ってたりすると、
その端折り方の違いで、演算結果にわずかな違いが生じる。
乱数生成にもGPUで違いがあるのでこれが原因でも違いが生ずる。これは乱数生成方法を
試しに変更してみるとわかる。
A1111の設定の、

Settingsタブ - Stable Diffusion - Stable Diffusion

ココ。

Random number generator source.
GPU / CPU / NV

デフォルトはGPUになっているが、いちどはCPUに変えて絵の変化をみておくとよい。
というか、デフォルトを当初からCPUにしておけばよかったのになぁと思うのだが。

5-6 再インストール

なんだかよくわからないけど不具合があるっぽい、というときはA1111の再インストールでスッキリ。
でもたいていはvenvの再構築で治る場合が多いので、再インストールするまえに一度venvの再構築を
試すのがおススメ。
venvフォルダはgit clone時にはまだ無くて、A1111初回起動時に自動的に造られるフォルダ。
これvenvフォルダを中身ごとごっそり削除し、先の
3-4 A1111初回起動
をおこなうと、venvが再構築され、たいていの場合は直る。
それでも直らない場合はA1111の再インストールをするわけだけど、綺麗にインストール
しなおしたい場合は、python pip のキャッシュをクリアしてから再インストールを
おこなう。コマンドプロンプトで、

pip cache purge

これをやっておかないと、A1111インストール時のpythonがらみのファイルはこのキャッシュを
使ってしまうので、キャッシュファイルに不具合があった場合はキャッシュをクリアしない限り
不具合は解決しない。
同様に、zluda.dbも削除する。再構築にまた時間がかかってしまうけれども。

 

6 ComfyUI ZLUDA対応Fork版

github
https://github.com/patientx/ComfyUI-Zluda

ComfyUIとは。

The most powerful and modular stable diffusion GUI and backend.

最強、とのこと。
実例として、最新のSD3の公開の際は初日から対応していた。

インストールにあたり事前にやることはA1111とだいたい同じ。
ただし、Pythonのバージョンが少し違う。
READMEにPython (3.10.11 or 3.11 from the official website) と明記されている。
ここで困ったことに、先のA1111では

>旧バージョンの、Python 3.10.6の64bit版をインストールする。

とあるので、A1111ComfyUIの両方をインストールするにはどうしたものか。
いちおう、A1111のZLUDA Fork版も、おおもとのA1111も、どちらも公式で
Python 3.10.6をインストールしろ
と明記されているわけだが。

解決方法はいくつかあり、一番簡単な方法は、
A1111は3.10.11でも動くので、3.10.11をインストールしてしまう。
既にPython 3.10.6をインストール済みなら3.10.11でアップグレードインストール。

次にComfyUIのZLUDA Fork版インストール方法。
通常であれば、
git clone https://github.com/patientx/ComfyUI-Zluda
から始まって、となるわけだけど、
インストール方法が元のComfyUIとはちょっと違うのと、さらにどうやら変更がありそう。
手順は簡単なので、githubの
https://github.com/patientx/ComfyUI-Zluda
だけを見てインストールをすること。
他のサイトは見ないほうが良い。Frok元のComfyUIも見ないほうが良い。違うから。
インストール自体は簡単なのだが、他のサイトを見ると逆に間違えると思う。
インストールが終わったら、他のサイトを見る。

インストールにおいて、
モデルの自動タウンロードは、A1111とはちがって、ComfyUIではされない。(2024年6月現在)
モデルのフォルダ名もA1111とは違って、

models\checkpoints

ココ。
ZLUDA関連は、ZLUDAのインストールは全自動、
ZLUDA用の起動オプションは特にナシ。無しでちゃんとZLUDAで動くようになっている。(2024年6月現在)
また定番のComfyUI Managerや、ComfyUI-Impact-Pack、ComfyUI-deepcacheこれらも
全自動インストールされ、このZLUDA版はとても親切に出来ている。もし既にA1111導入済みなら
ComfyUIはこのZLUDA版のほうがNvidiaの時よりも楽。(2024年6月現在)

起動方法もbat化されている。親切だ。
事前にSDXLモデルをmodels\checkpointsにコピーしたのち、batファイルで起動。
起動したら最初からt2iが出来るようになっているので、悩むことはない。
プロンプトになにか書いて、Queue Promptを押すと生成開始。

初見でとまどうところは、生成開始ボタン。generateではなくQueue Prompt

インストール後の最初の生成時のみ、A1111と同様、数十分待つ。
ただしComfyUIの場合、待ちのタイミングがA1111とはちょっと違って、
最初のQueue Promptを押してからコマンドプロンプト内にプログレスバーが出るまで10分、
そしてプログレスバ-が0%から動き始めるまで10分。
zluda.dbのファイルサイズを見ながら待とう。

最後にComfyUI終了方法
ComfyUI Managerを開き、restartボタンを押すと終了する。

ComfyUIは、t2iの簡単な生成だけなら難しくない。
高度なことをやろうとするとハードルは高くなるが、
それでも高度なことをするのならComfyUIだそうだ。

 

7. SD.Next

github
https://github.com/vladmandic/automatic

SD.Nextとは。

Stable Diffusion implementation with advanced features

高機能、とのこと。
当初はA1111の多機能版Forkとして登場した。
機能が豊富ながらComfyUIとは違ったA1111系のわかりやすさがある。
開発は意欲的で、例えば最新のSD3への対応もSD3公開24時間以内に
まずdev版で対応され、翌日には正式版も対応していた。
ZLUDAの実装が一番早かったのもこのSD.Next。
SD.Next登場時はA1111のFork版であったが、2024年の5月28日に

SD.Next is no longer marked as a fork of A1111 and github project has been fully detached

というわけで、Fork版ではなく完全に別プロジェクトとなった。

SD.NextをZLUDAで動かす場合のインストール方法はココ
https://github.com/vladmandic/automatic/wiki/ZLUDA

インストールにあたり、事前にやることはA1111ComfyUIとだいたい同じ。
Pythonは、先のComfyUIと同様、Python 3.10.11 64bit。
どうやらPython3.12に対応するべくうごいている(2024年6月現在)ようなので、
近日中にPython3.12対応となるかもしれない。

SD.Nextのインストール方法もA1111とほぼ同じ。
まず、インストールしたいフォルダを作る。たとえば C:\automatic
全角文字はやめとけ。
次に、そのフォルダでコマンドプロンプトを開き、
下記gitコマンドでSD.Nextをダウンロード(clone)する。

git clone https://github.com/vladmandic/automatic .

clone直後だとmodelフォルダ内にはまだStable-diffusionフォルダが無い。(2024年6月現在)
続いて、SD.Nextの起動コマンドで初回インストールを実行させる。
SD.Nextの起動コマンドはA1111とは少し違って、下記のコマンドをコマンドプロンプト内で実行する。

webui.bat --use-zluda --debug --autolaunch
注: SD.Nextにはwebui-user.batは無いよ。(2024年6月現在)

初回インストール時のモデルの自動ダウンロードは無い。(2024年6月現在)
起動するとmodelsフォルダが出来、その内に各種フォルダも出来て、
それらフォルダのうちStable-diffusionフォルダの中に事前に用意して
おいたSDXLモデルをコピーする。

ここでちょっと先に書いておくと、SD.Nextには終了方法がある。

Systemタブの中の
Shutdown server

を押す。
それともう一点、SD.Next使うときはタスクマネージャーなどでGPUのVRAM使用量を監視すること。

無事に起動しwebブラウザにUIが現れたら、最初の生成をする前に、一番最初に
VAE tilingの設定をおこなう。

System - Settings - Diffusers Settings の中の VAE tiling をチェック

Apply settings を押したのち、一旦SD.NextをShutdown serverで終了させる。
なぜVAE tilingを有効にするのかというと、
SD.NextはVRAMが過剰に溢れるとVRAMの空きの回復がうまくいかなくなることが多々
あり、そのような状態になるとSD.NextをRestart serverボタンで再起動してもダメで、
一旦SD.NextでShutdown serverして終了しまた起動をしなければならない。
以前からずっとそうで、2024年6月現在のでも相変わらずであった。
VRAMが過剰に溢れるのは生成の一番最後のVAE処理時なので、そこでVAE tilingにより
この状態を回避する。他の方法でも回避は可能だが、とりあえずはこれで。

SD.Nextもインストール直後の最初の生成時のみ、A1111と同様、数十分待たされる。
ただしSD.Nextの場合、待ちのタイミングがA1111とはちょっと違って、
最初のGenerateを押してからコマンドプロンプト内にプログレスバーが出るまで10分、
そしてプログレスバ-が0%から動き始めるまで10分。
その間の進行状況はzluda.dbのファイルサイズを見ながら待とう。

生成が進行しはじめると、プレビューに生成途中の絵が映し出され、生成が完了する。
ここで、生成途中のプレビューではそれっぽい絵が出ているのにもかかわらず最終的に
生成された画が真っ黒だったり、はたまた生成の最後の最後にエラーになった場合は、
たいていはVAEがらみ。VAEや、またmodel内蔵のVAEにより演算がうまくいかなくておこる。
そこで、SD.Nextの設定でVAEの挙動を指定する。

Systemタブ - Compute Settings - Execution precision にある、
Full precision for VAE (--no-half-vae)

ここのチェックボックスをチェック後、Apply settingsを押し、SD.NextをShutdown serverで
終了させ、SD.Nextを再度起動する。

あとはこれはお好みだが、Dynamic Attention BMMの設定もしておく。

After the UI starts, head on over to System Tab > Compute Settings
Set "Attention optimization method" to "Dynamic Attention BMM", then click Apply settings.

一方、Experimental Settingsとして
deep-cacheを使った高速化があるが、ピーキーなのでこれはいまはやめとけ(2024年6月現在)

 

8. おススメは

ここまでで、A1111Forge, ComfyUI, SD.Next と、現在の定番4種類を網羅した。
どれにするかは、
とりあえずは A1111
他の3つは、それぞれ得意なのが異なるので、なにをしたいのかによる。
Forgeは低VRAMユーザー向けとみられてるけれども、Forgeでしか実装されていないものがある。
またA1111と同じ絵が簡単に出せるのも魅力だ。(細部が少しだけ違う)
ComfyUIは多機能で、動画生成するならComfyUI
SD.Nextも機能の追加には意欲的。

そこで、
まずはA1111で生成までおこない、
その勢いで残りの3つ全部、上から順番にインストールしてそれぞれいちど生成してみるのが良い。
こういうのは勢いでやってしまおう。
後回しにするのはおすすめしない。

 

9. ZLUDA

ZLUDAとは。

ZLUDA lets you run unmodified CUDA applications with near-native performance on Intel AMD GPUs.

Nvidia向けのCUDAアプリケーションをAMDのGPUで使えるようにするプログラム。
CUDAアプリケーションが、変更なしにそのままでAMD GPUで動く。
パフォーマンスもネイティブに迫るほど。

ZLUDAのプログラムはexeが1つのほかDLLが機能別に数種類あり、A1111などではDLLを1つから
4つくらい入れ替えることでZLUDAによるCUDA化されている。なのでZLUDA用Fork版を使わなくても
自身でZLUDA化することは行われている。

ZLUDAでは高速化にあたり、実際にアプリケーションをZLUDAで使うときは、そのアプリのための
GPUコードをコンパイルする必要があるため、最初の1回だけは時間がかかる。
コンパイルして出来上がったGPUコードはzluda.dbにキャッシュ格納されるので、2回目以降は
キャッシュされたGPUコードが使われる。
A1111で最初の1回目だけ生成に時間がかかるのは、このGPUコードのコンパイルをやっているから。

留意点はいくつかあるが、A1111などに関係ありそうな3点をあげておくと、

まず、完全にCUDAのサポートをしているわけではなく漏れがあるので、うまく動かないものもある。
たとえばFlash Attentionなんかがそう。
なのでFlash Attentionを使うComfyUIはFlash Attention非対応モードで動くわけだけど、
とくに不都合はないことがほとんど。

浮動小数点の演算において、NvidiaもAMDも、速度のために演算精度を端折ったり近似丸め込みを
しているのだが、そのやり方がそれぞれ異なっており、そしてZLUDAもまたそれらとは異なって
いるため、ZLUDAでの浮動小数点の演算結果は、NvidiaともAMDともわずかな違いが生じることがある。
この違いで、細部がわずかに違う画像が生成されることがある。ことがあるというか、される。
そもそもNvidiaのGPU同士の比較でも、GPUコアチップが異なれば生成画像がわずかに違くなるので、
そういうものだ。

CPU内蔵GPU(APU)のPCにVGAを挿した場合、内蔵GPUを使おうとする。
対策は先に書いた通りで、環境変数HIP_VISIBLE_DEVICESにてどのGPUを使うか指定する。
見方を変えるとこの値でGPUの切替が出来るのだから、これは利点でもある。