ComfyUIの生成時間が変? ComfyUIのサボり癖と複数GPU時の注意点
ComfyUIで速度を測定しようとしたところ、どうも不思議な数字が出てきます。
生成された絵は一応出ていますが、速度の出力は5秒とか極端に小さな数字が出てきます。
本記事では、ComfyUIで速度を測ったときに嘘の数字が出た2つの原因と、それぞれの見分け方を記録します。手元の環境で計測して確かめたものです。同じ測り方をされる方が自分でも確認できるよう、使ったコマンドもそのまま載せました。
生成が5秒で終わったとき、ComfyUIの中では何が起きているのでしょうか?
測定に使った環境
計測に使ったのは次の2台です。
| 機材 | グラフィックボード | VRAM |
|---|---|---|
| Ubuntu機 | RTX 3090 | 24GB |
| ミニPC | RTX 5060 Ti / RTX 3060 | 16GB / 12GB |
VRAM(ブイラム)は、グラフィックボードが持っている専用のメモリです。パソコン本体のメモリとは別物で、画像や動画を作るAIは、このVRAMの中にモデルを置いて計算します。
測定は、同じ条件を最低3回ずつ繰り返しました。1回だけでは、たまたま遅かったのか本当に遅いのかを区別できません。
原因1:生成が5秒で終わる?~サボるComfyUI
同じ絵を同じ設定で5回作らせて、時間を測りました。
| 回 | 所要時間 |
|---|---|
| 1回目 | 245.3秒 |
| 2回目 | 5.0秒 |
| 3回目 | 0.0秒 |
| 4回目 | 5.1秒 |
| 5回目 | 5.0秒 |
245秒が5秒になっています。速くなったわけではなく、2回目以降は前の結果をそのまま返していました。
ComfyUIには、同じ入力なら前の結果をそのまま返す仕組みがあります。ノードごとに入力の内容を覚えておき、変わっていなければ計算を飛ばす作りです。作業中に何度も試すときはこれが助かるのですが、速度を測る場面では邪魔になりました。
入力が同じかどうかの判定には、シード値(seed)も含まれます。シード値は乱数の出発点を決める数字で、ここが同じなら出来上がる絵も同じです。裏を返すと、シード値を変えないまま繰り返すと、2回目以降は計算されません。
対策は単純で、測るたびにシード値を変えます。
# 測定のたびにシード値を変える
for i in 1 2 3 4 5; do
SEED=$((9100 + i)) ./bench.py
done
見分け方
手がかりは所要時間です。245秒だったものが5秒になったら、計算していないと考えたほうが確実です。3回目の0.0秒は、さすがに何もしていません。
どうしても同じシード値で繰り返す必要がある場合は、間にComfyUIの再起動を挟みます。再起動すると、この記憶は消えます。
原因2:隣と間違うComfyUI
ミニPCに2枚のグラフィックボードを挿して、RTX 3060の速度を測ったところ、36.2秒という値が出ました。RTX 5060 Tiとほぼ同じです。
同時に記録していた別の数字を見て、おかしいと気づきました。
| 記録した項目 | 値 |
|---|---|
| 所要時間 | 36.2秒 |
| VRAM使用量 | 12MiB |
| 消費電力 | 20W |
VRAMが12MiB、消費電力が20W。このグラフィックボードは、何もしていません。計算していたのは隣のRTX 5060 Tiで、36.2秒はそちらの数字でした。
原因はComfyUIの起動オプションです。--cuda-device という指定で、どのグラフィックボードを使うかが決まります。指定を省くと1枚目が選ばれます。
この選び方に、挿してある枚数は関係ありません。2枚でも3枚でも、指定を省けば1枚目が動きます。複数のグラフィックボードを積むほど、測りたい1枚が黙ったままになる確率は上がります。
# 1枚目(この環境ではRTX 5060 Ti)
python main.py --port 8188 --cuda-device 0
# 2枚目(RTX 3060)を使う。ポートも分ける
python main.py --port 8189 --cuda-device 1
どちらが何番かは、次のコマンドで確認できます。
nvidia-smi --query-gpu=index,name,memory.total --format=csv,noheader
正しく2枚目を指定して測り直したところ、RTX 3060は63.0秒でした。RTX 5060 Tiの36.2秒に対して1.74倍かかっています。最初の数字とはまったく違う結果でした。
見分け方
生成された絵だけを見ていると、この取り違えには気づけません。作業中にVRAMと消費電力が動いているかを見ると、そのカードが本当に働いているかが分かります。
測定と同時に記録しておくと確実です。
# 1秒ごとに、指定した番号のカードの状態を出す
nvidia-smi --query-gpu=memory.used,power.draw,utilization.gpu
--format=csv,noheader -i 1 -l 1
動いていないカードは、VRAMも消費電力も止まったままです。
2つに共通していること
どちらもエラーが出ません。画面上は正常に終わり、絵もきちんと生成されます。数字だけが違います。
数字だけを見ていると、どちらも見逃します。
今回 確かめていないこと
シード値の件は、ComfyUIの結果の使い回しについてのものです。他の画像生成ソフトに同じ仕組みがあるかは調べていません。
グラフィックボードの番号は、変換アダプタで2枚接続した環境で確認したものです。マザーボードに直接2枚挿した場合に同じ順番で並ぶかは、この環境では確かめていません。
試したのは2枚までです。指定を省くと1枚目が選ばれる動きは起動オプションの仕様なので枚数によりませんが、3枚以上を挿したときに番号がどう並ぶかは測っていません。
まとめ
ComfyUIで速度を測ったとき、嘘の数字が出た原因は2つでした。
1つ目は、シード値を変えずに繰り返したため、2回目以降が計算されていなかったことです。245秒が5秒に変わったら疑います。
2つ目は、起動オプションを指定していなかったため、測りたいカードとは別のカードで計算されていたことです。VRAMと消費電力が動いていなければ、そのカードは働いていません。
どちらもエラーが出ないため、所要時間だけを見ていると気づけません。測定のときは、VRAMと消費電力も一緒に記録しておくと確実です。
ComfyUI をこれから入れる方はこちらです。