前回、このM4 MacBook Air 24GBでローカルLLMを動かし、ファンレスは熱で3割落ちるという結果を出した。
では画像生成はどうか。落ちる。ただし落ち方が実装でまるで違った。
冷えた状態から30枚連続で生成すると、Draw Things は15%しか落ちないのに、ComfyUIは30%落ちる。 初速の差は18%だが、30枚目には28%まで広がる。同じ機械の、同じモデル、同じ設定である。
Draw Things を使うべきである。速いだけでなく、熱にも強い。
そして本題はもう一つある。この記事を書くまでに、冷却の扱いを3回間違えた。 Apple Siliconのベンチマークは、測る前に何分冷ましたかを記録しないと数字が意味を持たない。 その顛末も書く。
【結論】
すべて冷却20分・AC接続・低電力モードオフ・バッチ1で測った実測値。
| エンジン | モデル | 解像度/ステップ | 初速 | 最終 | 低下 | ラン |
|---|---|---|---|---|---|---|
| Draw Things | SD1.5 | 512 / 20 | 15.1秒 | 17.3秒 | +15% | 30 |
| ComfyUI | SD1.5 | 512 / 20 | 18.4秒 | 23.9秒 | +30% | 30 |
| ComfyUI(fp16) | SD1.5 | 512 / 20 | 18.4秒 | 24.8秒 | +35% | 30 |
| Draw Things | SDXL | 1024 / 30 | 158.8秒 | 193.5秒 | +22% | 8 |
| ComfyUI | SDXL | 1024 / 30 | 233.1秒 | 242.9秒 | +4% | 8 |
| ComfyUI | Z-Image Turbo | 1024 / 8 | 211.0秒 | 250.3秒 | +19% | 7 |
初速は2枚目の値(ComfyUIは1枚目だけモデルロードを含むため)。 低下は2枚目→最終枚。SDXLとZ-Imageは8ラン以下なのでブレの影響が残る。
- Draw Things一択。同じ絵を出すのに、初速で18%・30枚目で28%短い時間で済む
- 失速の量が実装で2倍違う。Draw Things +15% に対し ComfyUI +30%
- 冷えていればSD1.5は23枚まで15秒台を保つ。温まっていると7枚目から落ちる
--force-fp16は効かない。attention系も含め、Macで効く起動オプションは1つも無かった- SDXLは1枚3〜4分。1ランが長いので、ComfyUIは2枚目には既に落ちきっている
- 24GB積んでいてもGPUに回るのは16.0 GiB。ComfyUIは24,576 MBと表示するが、それは嘘である
【前提】24GB積んでも、GPUに回るのは16 GiB
前回の記事で実測したことだが、この記事だけ読む人のために要点を書いておく。
Apple Siliconのユニファイドメモリは、全部がGPUに回るわけではない。24GBのMacでも、既定でGPUが使えるのは 16.0 GiB である。Appleはこの配分を公式に文書化していない。
そして厄介なことに、ComfyUIはこの上限を知らない。起動ログにはこう出る。
Total VRAM 24576 MB, total RAM 24576 MB
Set vram state to: SHARED
Device: mps24,576 MB ── つまり24GB全部が使えるように見える。この表示を信じてモデルを選ぶと落ちる。
前回のLLMでは、これが原因で26Bのモデルが68 MiB足りずに失敗した。しかもエラーを返さず、HTTP 200を返して0トークン、4分待たされるという最悪の落ち方をした。
なお sudo sysctl iogpu.wired_limit_mb=20480 で枠を広げられる。前回の記事でこれを実行した人は、再起動していなければまだ有効なままである。素の状態に戻すには次を実行する。
sudo sysctl iogpu.wired_limit_mb=0本記事の計測は、すべてこの既定状態で行っている。
【意外】ComfyUIのインストールに、もう特別なことは要らない
Radeonで環境を作ったときは、HIP SDKを入れ、ROCm版のPyTorchを探し、起動用バッチファイルを書く必要があった。
Macは4行で終わる。
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI && python3 -m venv venv
./venv/bin/pip install torch torchvision torchaudio
./venv/bin/pip install -r requirements.txtMPS(Metal Performance Shaders)はPyTorchの標準ビルドに入っているので、追加の指定は要らない。起動すれば勝手に Device: mps になる。
ただしMacでは使えない高速化が3つある。起動ログがそれを教えてくれる。
Found comfy_kitchen backend triton: available False(No module named 'triton')
Found comfy_kitchen backend hip: available False(ROCm/HIP なし)
Found comfy_kitchen backend cuda: available False
comfy-aimdo unsupported operating system: DarwinTritonが無い。ROCmも当然無い。そして comfy-aimdo はDarwin非対応で、しかもNvidiaと誤認して警告を出してくる。Radeon記事で効いたMIOpen系の手は、ひとつも使えない。
計測条件
Radeon記事(RX 9070 XT)と同一のプロトコルで測っている。ここが揃っていないと比較の意味がない。
| 項目 | 値 |
|---|---|
| 測定回数 | バッチカウントで8回、初回と最大・最小を除いた5回の平均 |
| シード | 1234567890 からインクリメント |
| SD1.5 | v1-5-pruned-emaonly-fp16 / 512×512 / Euler / 20ステップ / バッチ8 |
| SDXL | juggernautXL_ragnarokBy / 1024×1024 / Euler / 30ステップ / バッチ1 |
環境は以下の通り。
| 項目 | Mac側(本記事) | Radeon側(比較対象) |
|---|---|---|
| GPU | Apple M4 10コア(枠16.0 GiB) | RX 9070 XT 16GB |
| CPU | Apple M4 10コア(P4/E6) | Ryzen 9 7900X |
| メモリ | ユニファイド24GB | DDR5 64GB |
| OS | macOS 15.6.1 | Windows 11 24H2 |
| ComfyUI | 0.34.0 | 0.22.0 |
| バックエンド | MPS(PyTorch 2.13.0) | ROCm |
電源はAC接続、低電力モードはオフ、caffeinate -dimsu でスリープを抑止している。 熱の指標は powermetrics --samplers gpu_power,thermal による GPUクロックと Thermal pressure(smc サンプラはIntel専用で、 Apple Siliconではダイ温度が取れない)。
失速を見る計測はすべてバッチ1で行っている。バッチ8では1ランが約195秒あり、 1ラン目の途中で既に失速に入ってしまうため、曲線が見えない。 Radeon記事との比較用のバッチ8は、別に測っている。
【本命】冷えた状態から30枚、連続で生成する
Draw Things で、SD1.5の512×512を30回連続で生成した。 直前の負荷から20分アイドルさせ、Thermal pressure が Nominal に戻ったことを確認してから開始している。
| ラン | 秒 |
|---|---|
| 2 | 15.05 |
| 5 | 15.30 |
| 7 | 15.42 |
| 10 | 15.53 |
| 12 | 15.64 |
| 15 | 15.75 |
| 20 | 16.01 |
| 25 | 16.59 |
| 30 | 17.27 |
23枚目まで15秒台を保つ。24枚目で16.3秒に上がり、30枚目でも17.27秒(+14.7%)にとどまる。
ComfyUIでも測る ── 落ち方が2倍違った
同じ条件でComfyUIを30回。
| ラン | 秒 |
|---|---|
| 2 | 18.38 |
| 5 | 18.59 |
| 7 | 18.90 |
| 9 | 19.71 |
| 12 | 20.88 |
| 14 | 24.24 |
| 20 | 22.86 |
| 25 | 23.73 |
| 30 | 23.94 |
2枚目18.38秒が30枚目で23.94秒(+30.3%)。Draw Things の倍落ちている。
| 項目 | Draw Things | ComfyUI | 差 |
|---|---|---|---|
| 初速 | 15.05秒 | 18.38秒 | 18%短い |
| 30枚目 | 17.27秒 | 23.94秒 | 28%短い |
| 低下 | +14.7% | +30.3% | — |
初速の差は18%だが、30枚目には28%まで広がる。 Draw Things は速いだけでなく、熱に強い。
エンジンが違う。Draw Things は PyTorch ではなく、作者のLiu Liu氏がPhilip Turner氏と 共同開発した Metal FlashAttention で動いている。Metalのカーネルを自分で書いている実装だ。 同じ絵を出すのに使う電力が少なければ、熱くなるのも遅い。
SDXLでも同じ、ただしComfyUI側は落ちる余地が無い
1024×1024・30ステップ、8ラン。
| 枚数 | Draw Things | ComfyUI |
|---|---|---|
| 1枚目 | 144.8秒 | 204.8秒 |
| 2枚目 | 158.8秒 | 233.1秒 |
| 8枚目 | 193.5秒 | 242.9秒 |
| 2→8枚目の低下 | +21.8% | +4.2% |
1枚目と2枚目で意味が違う点に注意してほしい。 ComfyUIはモデルを常駐させるので1枚目だけロード(約30秒)を含む。 Draw Thingsは毎回プロセスが起動して読み直すので、1枚目も2枚目も構造は同じである。 どちらで比べてもDraw Thingsが30%前後短い。
ComfyUIの+4.2%は「熱に強い」という意味ではない。1ランが4分近くあるので、 2ラン目の時点で既に落ちきっている。落ちきった状態から測り始めているから、それ以上落ちない。
なお ComfyUI 側は単調に増えているわけではなく、3枚目だけ278.6秒と突出している (233.1 / 278.6 / 243.9 / 238.9 / 239.4 / 249.6 / 242.9)。 8ランではブレの影響が残る。SD1.5の30ランほどの確度はない。
Draw Things は初速が速いぶん、落ちる余地が残っている。それでも最終値で20%速い。
重いモデルほど、初速を体感できるのは1枚目だけということになる。
【教訓】冷却を3回間違えた
この結論に辿り着くまでに、同じ種類の誤りを3回犯した。全部書く。
1回目 ── バッチ8で測って「ComfyUIは失速しない」と誤認した
最初はSD1.5をバッチ8で測っていて、1ランが約195秒あった。 つまり1ラン目の途中で既に落ち始めていて、2ラン目以降は全部が失速後の定常状態だった。 だから横ばいに見えた。落ちないのではなく、測り始めた時点で落ちきっていた。
「GPUクロックは890 MHz止まり」という数字も同じ理由で間違っていた。 あれを測ったのは1時間半ぶっ続けで回した後である。
失速を見るならバッチ1で測ること。
2回目 ── 温まった機械で測って、再現しなかった
Draw Things を10ラン回して 16.1 → 25.1秒(-56%) という結果が出た。 ところが同じ計測をやり直したら 15.7 → 16.1秒(+2.8%) しか落ちない。再現しない。
違いは測る前の状態だった。1回目はその1分前まで別のベンチを4分回していた。
3回目 ── 片側だけ冷やして「実装を変えても壁は同じ」と誤認した
30ラン回して「Draw Things も ComfyUI も同じように落ちる」という結論を出した。 だが後から全計測の直前アイドル時間を洗い直したら、Draw Things 側は冷却4分、 ComfyUI 側は871分だった。比較の片側だけが温まっていた。
冷却20分で揃え直したのが、この記事に載せている数字である。
厄介なのは Thermal pressure が当てにならないこと
負荷を止めると1分足らずで Nominal に戻る。 実測では、SDXLを40分回した直後でも20秒で Moderate、40秒で Nominal になった。
だがそれは熱が抜けた意味ではない。この表示を信じて1分後に測り直すと、また違う数字が出る。 初速のクロックにもそれが出る。
| 状態 | 初速のクロック |
|---|---|
| 冷えている | 1,458〜1,469 MHz(最上位ビン1,470にほぼ到達) |
| 温まっている | 1,268〜1,348 MHz |
Apple Siliconのベンチマークを取るなら、測る前に何分アイドルさせたかを必ず記録すること。 本記事はすべて20分で統一している。
【実用】枚数を見積もるなら、冷えているかどうかで変わる
冷えた状態からなら、Draw Things でSD1.5を10枚出して約2分半。30枚でも約8分。 ComfyUIだと10枚で3分、30枚で11分になる。
だが直前に何か回していたなら、7枚目から落ちる。 「試したら速かったのに、まとめて作ったら遅い」という体感の正体はこれである。
SDXLは話が別で、1枚3〜4分。10枚で30分(Draw Things)から40分(ComfyUI)かかる。 しかも2枚目には既に落ちているので、初速で見積もると足りなくなる。
【設定】ComfyUIで効く起動オプションは、1つも無かった
ComfyUIは起動時にこう言ってくる。
Using sub quadratic optimization for attention, if you have memory or speed
issues try using: --use-split-cross-attention素直に試した。ついでに他のバックエンドも測った。 各構成の前に20分アイドルさせ、12ランずつ。2〜8ラン目は Thermal pressure が Nominal の区間なので、そこの平均で比べている。
| 構成 | 2〜8ラン平均 | 既定比 | 12ラン目 |
|---|---|---|---|
--force-fp16 | 18.55秒 | -1.9% | 21.71秒 |
| 既定(フラグ無し) | 18.90秒 | — | 23.28秒 |
--use-quad-cross-attention | 19.22秒 | +1.7% | 23.86秒 |
--force-channels-last | 20.00秒 | +5.8% | 24.84秒 |
--use-split-cross-attention | 20.18秒 | +6.8% | 22.86秒 |
attentionの変更は全部遅くなった。 ComfyUI自身が勧めてくる --use-split-cross-attention が、+6.8%でいちばん遅い。 既定のsub-quadratic attentionが、MPSでは最良だった。
--force-fp16 は「効くとも効かないとも言えない」
唯一わずかに速く見えるのがfp16だが、3回測って3回とも違う結果が出た。
| 計測 | 条件 | 結果 |
|---|---|---|
| 1回目 | 冷却0.5分・6ラン | -2.1% |
| 2回目 | 冷却20分・30ラン | 効果なし・失速は悪化 |
| 3回目 | 冷却20分・12ラン | -1.9%・失速は改善 |
差が1〜2%しかなく、ラン間のブレに埋もれている。 既定の生の推移は18.5〜25.8秒と揺れていて、fp16の18.3〜21.7秒との差は 「効いている」と言い切れる幅ではない。付けても害はないが、期待もできない。
Macには詰め代が無い。Radeon記事ではMIOpenや起動オプションで大きく詰められたが、 こちらはエンジンを変える以外に手が無い。
熱で絞られているのは、クロックだけではない
既定構成でのGPUの状態がこれである。
| ラン | 秒 | クロック | Thermal pressure | 電力 |
|---|---|---|---|---|
| 2 | 18.49 | 1,469 MHz | Nominal | 14.16 W |
| 6 | 18.98 | 1,414 | Nominal | 13.66 W |
| 7 | 19.34 | 1,373 | Moderate | 12.69 W |
| 8 | 19.22 | 1,359 | Heavy | 12.15 W |
| 11 | 25.77 | 945 | Heavy | 5.98 W |
14.2 W から 6.0 W まで、電力が半分以下に絞られている。 ファンレスで捨てられる熱量が上限で、そこに合わせてクロックと電力が下げられている。
環境構築が面倒な方・スペックが足りない方へ
ここまで読んで分かる通り、M4 MacBook AirでのSDXLは1枚に2分半〜4分半かかる。枚数を出す用途には正直に言って向いていない。
「今すぐ画像生成を試したい」「枚数を回したい」という場合は、ブラウザ上で完結するクラウド環境『ConoHa AI Canvas』を使うほうが早い。

複雑なインストール作業は一切不要で、非力なノートPCからでも高品質な画像を生成できる。エントリープランは月500円と経済的だ。本記事のように何十分もかけて数枚を出すより、目的次第では合理的である。
一方、「これを機にAI用のPCごと新調したい」という人は、BTOパソコンのサイコムで見積もりを取ってみるのが手っ取り早い。本記事のRX 9070 XTとの比較を見れば分かる通り、専用GPUとの差は桁で効いてくる。

【参考】Z-Image Turboは期待外れだった
Z-Image Turbo(Alibaba・6B・Apache 2.0)は、他者情報で「FP8なら約8GB・8ステップ」とされており、 16 GiB枠に収まる唯一の実用候補として期待していたモデルである。
今回測ったのは ComfyUI 公式テンプレートと同じ bf16 の構成 (UNet 11.46GB / テキストエンコーダ qwen_3_4b 7.49GB / VAE 0.31GB)で、FP8版ではない。
| ラン | 秒 |
|---|---|
| 1(19GBのロード込み) | 253.83 |
| 2 | 210.98 |
| 3 | 215.94 |
| 4 | 231.97 |
| 5〜7 | 241.09〜250.31 |
初速211秒(1ステップ26.4秒)、落ちきって250秒。8ステップしかないのにこれである。 他者ベンチではRTX 4090で2〜3秒とされているモデルだ。
ただし19 GBを16 GiB枠で回して、破綻はしなかった。 前回のLLMのような「エラーを返さず待たせる」挙動は起きず、 ComfyUIがテキストエンコーダを退避しながら処理しきった。
面白いのは、処理量あたりの効率で見たときだ。すべて初速(冷却状態)で揃えている。
| モデル | 総ピクセル×ステップ | 秒 | スループット |
|---|---|---|---|
| SD1.5 512 / 20step | 5.24M | 18.4 | 285k /秒 |
| SDXL 1024 / 30step | 31.46M | 233.1 | 135k /秒 |
| Z-Image 1024 / 8step | 8.39M | 211.0 | 40k /秒 |
Z-ImageはSD1.5の7分の1の効率である。 「8ステップで速い」はずのターボ系モデルが、6Bという図体でその利点を完全に食い潰している。 ステップ数を減らしても、モデルが大きければMacでは速くならない。
計測でハマった点(同じことをする人向け)
ComfyUIは同じプロンプトを再実行しない
同じシード・同じ設定で投げると、実行せずにキャッシュを返す。実際に、同じシードのランが 0.13秒で「完了」した。
計測するなら、セッションごとにComfyUIを再起動するのが確実である。
pkill -f "ComfyUI/main.py" は効かない
プロセスの実際のコマンドラインは ./venv/bin/python main.py --listen ... で、ComfyUI/main.py という文字列を含まない。pkillが1件もマッチせず、古いインスタンスが生き残る。
新しいインスタンスは Port 8188 is already in use で即死するので、フラグを付けたつもりで既定設定を測り続けることになる。実際に一度これをやって、--force-fp16 の結果を測り直した。
正しくはこうする。
kill $(lsof -tnP -iTCP:8188 -sTCP:LISTEN)そして起動後は必ず引数を確認すること。
ps -p $(lsof -tnP -iTCP:8188 -sTCP:LISTEN) -o args=Draw Thingsのバッチは4が上限
--config-json '{"batchSize":8}' を指定しても、4枚しか生成されない。指定が通ったかではなく、実際に何枚出たかをログの Wrote: 行で数えること。8で割って「秒/枚が半分になった」と喜びかけた。
なおバッチを増やしても速くならない。失速のほうが支配的だった。
バッテリー温度は指標として鈍い
ioreg のバッテリー温度は、35分回しても +0.01〜+0.43℃ しか動かない。しかも30.92℃で頭打ちになり、以降1ランも変化しなかった。
速度低下そのもの、またはGPUクロックを指標にすべきである。
この計測の限界
- Radeon(RX 9070 XT)との比較表が無い。当時のベンチ元データがグラフ画像にしか残っておらず、条件(ComfyUIのバージョン・CFG・重み・サンプラー)も揃っていない
- ダイ温度は測れていない。
powermetricsのsmcサンプラはIntel専用。Thermal pressureとGPU周波数で代用した - ANEを使う経路(Core ML・MLX)は未検証。ComfyUIもDraw ThingsもGPUしか使っていない
- 絶対値は日とマシンの状態で1〜2割変動する。
--use-pytorch-cross-attentionだけ冷却時の再現が取れていない
まとめ
- Draw Things一択。所要時間が初速で18%・30枚目で28%短い
- 失速の量が実装で2倍違う。Draw Things +14.7% に対し ComfyUI +30.3%
- 冷えていればSD1.5は23枚まで15秒台。温まっていると7枚目から落ちる
- 24GB積んでもGPUに回るのは16.0 GiB。ComfyUIの「Total VRAM 24576 MB」は信用してはいけない
- 測る前に何分冷ましたかを記録すること。
Thermal pressureは1分でNominalに戻るが、熱は抜けていない
お断り
本記事の数値はすべて筆者環境での実測値であり、Apple・Comfy Org・Draw Thingsの公式値ではない。24GB機のGPU枠が16.0 GiBであること、熱履歴で初速が変わること、Thermal pressure が1分で Nominal に戻ることは、いずれも一次情報が無く筆者の観測による。Draw ThingsがCore ML GPU比で20〜40%速いこと、RTX 4090でZ-Image Turboが2〜3秒であることは他者の公表値。
参考文献







コメント