【実測】ComfyUI高速化設定、ROCm 10で測り直したら半分が逆効果だった|効くのはMIOpenだけ

※当サイトはアフィリエイト広告(Amazonアソシエイト含む)を利用しています。

Radeon・ローカルAI

以前、RadeonでComfyUIを速くする4つの設定という記事を書いた。環境変数が2つ、起動オプションが1つ、そしてComfyUI本体のソースを書き換えるものが2つ。書き換えについては「ComfyUIをアップデートすると消える」と注意も書いた。

その後、ROCm 10 を入れて、同じ設定をまとめて有効にしたところ、3モデルとも速くなった。ここまでは前回の記事のとおりである。

問題は「4つのうち、どれが効いているのか」を分けていなかったことだ。

今回、条件ごとにComfyUIを起動し直して、1つずつ入れて測った。11条件、3モデル、各8ラン。結果を先に言うと、効いていたのは1つだけで、ソースの書き換え2つは逆に遅くしていた。

「更新で消える」と書いた改変は、消えたほうがよかった。

【結論】MIOpenを有効にする。それ以外は要らない

ROCm 10.0.0 / ComfyUI 0.35.0 / RX 9070 XT。数字は秒で、小さいほど速い。ベースは「何も指定しない」。11条件のうち主要な9つを載せる。

条件SD1.5(8枚)SDXL(1枚)FLUX.1(1枚)
何も指定しない7.628.2034.8
COMFYUI_ENABLE_MIOPEN=14.72(−38%)5.67(−31%)35.8(誤差)
+ MIOPEN_FIND_MODE=FAST4.725.6636.1
--use-pytorch-cross-attention だけ7.577.9036.8
VAE_KL_MEM_RATIO=2.0 だけ(ソース未改変)7.587.8937.0
MIOpen + ソース改変①(VAE_KL)4.815.6138.6(+7%)
MIOpen + ソース改変②(VAEのpytorch attention)4.716.61(+17%)46.2(+28%)
MIOpen + 改変①②4.816.6549.2
MIOpen + --preview-method auto4.735.6738.7(+7%)
  • 効いているのは COMFYUI_ENABLE_MIOPEN=1 の1つだけ。これ1つで、全部入りと同じ数字になる
  • MIOPEN_FIND_MODE=FAST は速度に寄与しない。初回の1枚が速くなるだけ(後述)
  • --use-pytorch-cross-attention は、ROCm 10 では書いても書かなくても同じ。既定で有効になっている
  • ソースの書き換え2つは、ROCm 10 では遅くなる。SDXL で +17%、FLUX.1 で +28%
  • FLUX.1 には、速くする設定が1つも無い。改変なしの条件は 34.8〜37秒の中で、改変を当てると遅くなるだけ

そして、前回の記事で「MIOpenだけで15〜20%」と書いたが、ROCm 10 では31〜38%。効きは増えている。

【計測条件】条件ごとにComfyUIを起動し直した

前回の記事とROCm 10導入記事で使ったものと同じプロトコルである。

GPU / CPU / メモリRX 9070 XT 16GB / Ryzen 9 7900X / DDR5 64GB
ComfyUI / PyTorch0.35.0 / 2.13.0+rocm10.0.0
計測8ラン、初回と最大・最小を除いた5回平均。シード 1234567890 からインクリメント
SD1.5v1-5-pruned-emaonly-fp16 / 512×512 / Euler / 20step / バッチ8
SDXLjuggernautXL_ragnarokBy / 1024×1024 / Euler / 30step / バッチ1
FLUX.1FLUX.1 [dev](T5はfp8) / 1024×1024 / Euler / 20step / バッチ1

今回はGUIを使っていない。条件ごとにComfyUIを起動し直し、APIにワークフローを投げ、ログの Prompt executed in の値を拾うスクリプトで回した。理由は3つある。

  1. 起動オプションや環境変数は起動時にしか効かないので、条件ごとに再起動するしかない。手でやると11回起動することになる
  2. GUIはプレビューの送信と描画が乗る。その分が「設定の効果」に混ざる
  3. 無人で回せる。今回は夜中に1回、昼に2回回した(2回目は筆者がYouTubeを見ていたので捨てた。後述)

ソースの書き換えは、条件に入るときだけ当てて、終わったら git checkout で戻している。当たっていることは、起動ログで確認した。ここは大事なので後で書く。

【本題1】MIOpenだけで全部だった

COMFYUI_ENABLE_MIOPEN=1 を入れると、起動ログから1行消える。

Set: torch.backends.cudnn.enabled = False for better AMD performance.

何も指定しないと、ComfyUIはAMDでcuDNN(ROCmではMIOpen)を無効にする。畳み込みの最適化ライブラリを使わない状態がデフォルトである。環境変数はそれを戻すスイッチで、効果はこうだった。

項目指定なしMIOpen影響
SD1.57.624.72−38%
SDXL8.205.67−31%
FLUX.134.835.8誤差

畳み込み主体のSD1.5で最大、Transformer主体のFLUX.1で無効。MIOpenは畳み込みを速くするものなので、これは筋が通っている。

FIND_MODE=FAST は「初回」だけの話

MIOPEN_FIND_MODE=FAST を足しても、5回平均は 4.718 → 4.716 で変わらない。変わるのは初回の1枚である。

項目初回(除外分)
MIOpen のみ42.2秒
MIOpen + FIND_MODE=FAST21.4秒

MIOpenは初回に最適なカーネルを探索する。FASTはその探索を短くする設定で、探索が終わった2回目以降には関係ない。前回の記事に「体感の差は測っていない」と書いたが、測ると「初回が半分になる」だった。入れておいて損は無いが、速くなる設定ではない。

【本題2】--use-pytorch-cross-attention は、もう既定になっていた

前回「まずこれ」と書いた起動オプションは、ROCm 10 では何もしていなかった。指定しても 7.57 / 7.90 で、指定なしの 7.62 / 8.20 と誤差の範囲である。

理由は ComfyUI のソースにある。comfy/model_management.py に、AMDのGPUに対してこういう分岐が入っている。

if rocm_version >= (7, 0):    if any((a in arch) for a in ["gfx1200", "gfx1201"]):        ENABLE_PYTORCH_ATTENTION = True

ROCm 7 以降で gfx1200 / gfx1201(RX 9060 / 9070 系)なら、pytorch attention は自動で有効になる。実際、11条件すべての起動ログに Using pytorch attention が出ていた。フラグは要らない。

前回の記事はROCm 7.1で書いたので、当時は意味があった可能性がある。今は書いても害は無いが、効果も無い。

【本題3】ソースの書き換え2つは、逆効果だった

ここが今回いちばん書きたかったところである。

前回の記事で、ComfyUI本体の2ファイルを書き換える手順を載せた。

  • 改変① comfy/sd.py の VAE_KL_MEM_RATIO を環境変数で調整できるようにし、AMD既定の 2.73 を 2.0 に下げる
  • 改変② comfy/model_management.py で、AMDでは無効化されているVAEのpytorch attentionを有効にする

ROCm 10 の環境で、MIOpen有効を土台に、この2つを1つずつ当てた。

モデルMIOpenのみ+改変①+改変②+①②
SD1.54.724.81(+2%)4.71(±0)4.81
SDXL5.665.61(−1%)6.61(+17%)6.65
FLUX.136.138.6(+7%)46.2(+28%)49.2

改変②:有効になっている。有効になった結果が遅い

まず、改変が当たっていることを確認した。改変②を当てた条件だけ、起動ログのVAEの行が変わる。

改変なし: Using split attention in VAE
改変あり: Using pytorch attention in VAE

確かに切り替わっている。切り替わった結果、SDXLが17%、FLUX.1が28%遅くなった。

もう1つ気になるのが、FLUX.1の8ランのばらつきである。

MIOpenのみ:  35.3  36.3  36.0  36.6  36.4  36.4  35.5
改変②あり:   37.3  49.5  44.8  43.2  50.9  44.7  48.8

MIOpenのみは36秒前後で揃うのに、改変②を当てると37〜51秒で揃わない。同じシード、同じ条件で、1枚ごとに10秒以上違う。VRAMに入りきらない分の退避が、毎回違う挙動をしているように見える。

ComfyUIがAMDでこれを無効化しているコメントは「高解像度でクラッシュする」である。クラッシュの手前の症状が、この遅さとばらつきなのだと思う。無効化には理由があった。

改変①:SD1.5とSDXLには無意味、FLUX.1では遅い

VAE_KL_MEM_RATIO は、VAEが使うVRAMの見積もりを決める係数である。AMDでは既定 2.73 と大きめに見積もられていて、前回の記事では「過剰なので 2.0 に下げると無駄な退避が減る」と書いた。

結果は SD1.5 +2%、SDXL −1%、FLUX.1 +7%。見積もりを下げると、VAEのために空けておくVRAMが減り、代わりにモデル本体の退避が増えたのだろう。FLUX.1の8ランは 38.2〜39.0 で揃って遅いので、こちらは「毎回同じだけ余計に退避している」形である。

当てる理由が無い。

1回目は「当たっていなかった」

実は、この2つは1回目の計測でも条件に入れていた。ところが結果は「効果ゼロ」で、そこで気づいた。ROCm 10 用に新しく作ったComfyUIには、ソースの改変を当てていなかった。VAE_KL_MEM_RATIO=2.0 を環境変数に書いても、sd.py が読みに行かなければ何も起きない。

つまり前回のROCm 10導入記事で「全部入り」として測った起動スクリプトも、VAE_KL_MEM_RATIO=2.0 の行は何もしていなかったことになる。あの記事の「オプションで14〜23%」は、実質「MIOpenで」だった。これは別途訂正する。

「更新で消える」と自分で書いた改変が、新しい環境に持ち込まれていなくて、持ち込まなかったほうが速かった。

【本題4】FLUX.1には、何をしても効かない

11条件のFLUX.1の数字を並べると、遅くする設定はあっても、速くする設定は1つも無い。

項目FLUX.1
指定なし〜MIOpen〜全部入り(改変なし)34.8〜37.0
改変①あり38.6
preview auto38.7
改変②あり46.2〜49.2

MIOpenは畳み込み向けで、FLUX.1はTransformerなので効かない。VAE周りの改変は退避を増やすだけ。FLUX.1を速くしたければ、設定ではなくROCmのバージョンを上げるしかなく、それは前回の記事で3.23倍という形で出ている。

【計測衛生】プレビューとYouTube

設定の話ではないが、測っていて分かったことを2つ書く。

--preview-method auto はFLUX.1で7%

ステップごとにプレビューを描く設定である。SD1.5とSDXLでは +0.3% で無視できるが、FLUX.1では +7%(36.1 → 38.7秒)。TAESDを入れていないので Latent2RGB の軽い方式のはずだが、1024pxの20stepでこれだけ乗る。

普段使いで外す必要は無い。ベンチマークを取るときだけ外す。

YouTubeを見ていると、FLUX.1が5〜10%遅い

2回目の計測中、筆者はブラウザでYouTubeを見ていた。3回目をGPUを空けて取り直したところ、FLUX.1が条件によって2〜4秒縮んだ。動画のデコードは同じGPUで走る。

結論は変わらなかった(順序も差の向きも同じ)が、数字は3回目に置き換えた。ベンチ中はブラウザの動画も止める。

GUIはAPIより遅い

前回のROCm 10導入記事は、GUIで同じプロトコルを回した。あのときの「全部入り」は SD1.5 5.95秒 / SDXL 6.84秒。今回のAPI計測で相当する条件(MIOpen+FAST+preview)は 4.73 / 5.67 で、GUIのほうが1秒以上遅い。WebSocketでのプレビュー送信とブラウザ描画のぶんと思われるが、分離はしていない。GUIの数字とAPIの数字は混ぜないほうがいい。

【結局どうするか】.batはこれだけでいい

ROCm 10 の環境で、筆者がいま使っている起動バッチはこれである。

@echo off
set PYTHON="%~dp0/.venv/Scripts/python.exe"
set COMFYUI_ENABLE_MIOPEN=1
set MIOPEN_FIND_MODE=FAST
%PYTHON% main.py --cuda-device 1 --auto-launch --preview-method auto
pause
  • COMFYUI_ENABLE_MIOPEN=1 ── これが本体。SD1.5/SDXLで3割速くなる
  • MIOPEN_FIND_MODE=FAST ── 初回の探索が半分になる。あってもなくても速度は同じ
  • --cuda-device 1 ── Ryzenの内蔵GPUを掴まないため(導入記事参照)。内蔵GPUの無い環境では不要
  • --use-pytorch-cross-attention ── 書かない。既定で有効
  • VAE_KL_MEM_RATIO ── 書かない。ソースも書き換えない
  • ソースの書き換え ── しない

前回の記事の「4つの設定」のうち、生きているのはMIOpenの環境変数だけになった。

VRAMからの退避が話の中心になったので、この構成ならメインメモリには余裕を持たせたい。

【限界】この記事で測れていないこと

  • ROCm 7.1 では測り直していない。前回の記事の改変2つは、当時の環境では正しかった可能性がある。「ROCm 10 では逆効果」までしか言えない
  • 条件の順序効果。各条件は1セッション8ランで、「指定なし」は毎回最初に回っている。コールドキャッシュの分が乗っている可能性はあるが、同じ数字が3回の計測で再現した
  • FLUX.1の改変②の条件はばらつきが大きい(37〜51秒)。平均より「揃わない」こと自体を結果として読んでいる
  • 高解像度は測っていない。改変②は「大きい画像でのVRAM溢れを防ぐ」目的で入れたもので、1024pxまでの今回の条件ではその場面が来ていない
  • --highvram --fp16-vae は今回の条件に入れていない。前回の記事にある残りの起動オプションは未検証

まとめ

  • ROCm 10 で効くのは COMFYUI_ENABLE_MIOPEN=1 だけ。SD1.5 −38%、SDXL −31%。前回の「15〜20%」より効きが増えた
  • MIOPEN_FIND_MODE=FAST は初回の探索を半分にするだけ。速度は変わらない
  • --use-pytorch-cross-attention は ROCm 7 以降の RX 9060/9070 では既定で有効。書かなくていい
  • ソースの書き換え2つは逆効果。VAEのpytorch attention有効化で SDXL +17%・FLUX.1 +28%、VAE_KL=2.0 で FLUX.1 +7%
  • FLUX.1 には設定で速くする手が無い。上げるならROCmのバージョン
  • プレビューは FLUX.1 で +7%、YouTube視聴で +5〜10%。ベンチのときは両方止める
  • ROCmのバージョンが上がったら、前の版の最適化は測り直す。7.1の最適化が10では足を引っ張った

「アップデートで消える」と書いた改変は、消えたほうがよかった。設定は、環境が変わったら一度全部外して、1つずつ戻して測る。それを面倒にしないために、今回の計測はスクリプトにしてある。次のROCmが出たら、また同じものを回す。

参考文献

コメント

タイトルとURLをコピーしました