【実測】M4 MacBook Air 24GBで画像生成はどこまで動くか。落ち方は実装で2倍違う

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

Radeon・ローカルAI

前回、このM4 MacBook Air 24GBでローカルLLMを動かし、ファンレスは熱で3割落ちるという結果を出した。

では画像生成はどうか。落ちる。ただし落ち方が実装でまるで違った。

冷えた状態から30枚連続で生成すると、Draw Things は15%しか落ちないのに、ComfyUIは30%落ちる。 初速の差は18%だが、30枚目には28%まで広がる。同じ機械の、同じモデル、同じ設定である。

Draw Things を使うべきである。速いだけでなく、熱にも強い。

そして本題はもう一つある。この記事を書くまでに、冷却の扱いを3回間違えた。 Apple Siliconのベンチマークは、測る前に何分冷ましたかを記録しないと数字が意味を持たない。 その顛末も書く。

【結論】

すべて冷却20分・AC接続・低電力モードオフ・バッチ1で測った実測値。

エンジンモデル解像度/ステップ初速最終低下ラン
Draw ThingsSD1.5512 / 2015.1秒17.3秒+15%30
ComfyUISD1.5512 / 2018.4秒23.9秒+30%30
ComfyUI(fp16)SD1.5512 / 2018.4秒24.8秒+35%30
Draw ThingsSDXL1024 / 30158.8秒193.5秒+22%8
ComfyUISDXL1024 / 30233.1秒242.9秒+4%8
ComfyUIZ-Image Turbo1024 / 8211.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: mps

24,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.txt

MPS(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: Darwin

Tritonが無い。ROCmも当然無い。そして comfy-aimdo はDarwin非対応で、しかもNvidiaと誤認して警告を出してくる。Radeon記事で効いたMIOpen系の手は、ひとつも使えない。

計測条件

Radeon記事(RX 9070 XT)同一のプロトコルで測っている。ここが揃っていないと比較の意味がない。

項目
測定回数バッチカウントで8回、初回と最大・最小を除いた5回の平均
シード1234567890 からインクリメント
SD1.5v1-5-pruned-emaonly-fp16 / 512×512 / Euler / 20ステップ / バッチ8
SDXLjuggernautXL_ragnarokBy / 1024×1024 / Euler / 30ステップ / バッチ1

環境は以下の通り。

項目Mac側(本記事)Radeon側(比較対象)
GPUApple M4 10コア(枠16.0 GiB)RX 9070 XT 16GB
CPUApple M4 10コア(P4/E6)Ryzen 9 7900X
メモリユニファイド24GBDDR5 64GB
OSmacOS 15.6.1Windows 11 24H2
ComfyUI0.34.00.22.0
バックエンドMPS(PyTorch 2.13.0)ROCm

電源はAC接続、低電力モードはオフ、caffeinate -dimsu でスリープを抑止している。 熱の指標は powermetrics --samplers gpu_power,thermal による GPUクロックと Thermal pressuresmc サンプラはIntel専用で、 Apple Siliconではダイ温度が取れない)。

失速を見る計測はすべてバッチ1で行っている。バッチ8では1ランが約195秒あり、 1ラン目の途中で既に失速に入ってしまうため、曲線が見えない。 Radeon記事との比較用のバッチ8は、別に測っている。

【本命】冷えた状態から30枚、連続で生成する

Draw Things で、SD1.5の512×512を30回連続で生成した。 直前の負荷から20分アイドルさせ、Thermal pressure が Nominal に戻ったことを確認してから開始している。

ラン
215.05
515.30
715.42
1015.53
1215.64
1515.75
2016.01
2516.59
3017.27

23枚目まで15秒台を保つ。24枚目で16.3秒に上がり、30枚目でも17.27秒(+14.7%)にとどまる。

ComfyUIでも測る ── 落ち方が2倍違った

同じ条件でComfyUIを30回。

ラン
218.38
518.59
718.90
919.71
1220.88
1424.24
2022.86
2523.73
3023.94

2枚目18.38秒が30枚目で23.94秒(+30.3%)。Draw Things の倍落ちている。

項目Draw ThingsComfyUI
初速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 ThingsComfyUI
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-fp1618.55秒-1.9%21.71秒
既定(フラグ無し)18.90秒23.28秒
--use-quad-cross-attention19.22秒+1.7%23.86秒
--force-channels-last20.00秒+5.8%24.84秒
--use-split-cross-attention20.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電力
218.491,469 MHzNominal14.16 W
618.981,414Nominal13.66 W
719.341,373Moderate12.69 W
819.221,359Heavy12.15 W
1125.77945Heavy5.98 W

14.2 W から 6.0 W まで、電力が半分以下に絞られている。 ファンレスで捨てられる熱量が上限で、そこに合わせてクロックと電力が下げられている。

環境構築が面倒な方・スペックが足りない方へ

ここまで読んで分かる通り、M4 MacBook AirでのSDXLは1枚に2分半〜4分半かかる。枚数を出す用途には正直に言って向いていない。

「今すぐ画像生成を試したい」「枚数を回したい」という場合は、ブラウザ上で完結するクラウド環境『ConoHa AI Canvas』を使うほうが早い。

AI画像生成ならConoHa|ConoHa AI Canvas
ブラウザだけでできる本格的な AI 画像生成。ConoHa AI Canvasは、高価なPCがなくてもStable Diffusionを使った本格的な画像生成を始められます

複雑なインストール作業は一切不要で、非力なノートPCからでも高品質な画像を生成できる。エントリープランは月500円と経済的だ。本記事のように何十分もかけて数枚を出すより、目的次第では合理的である。

\CHECK NOW/

一方、「これを機にAI用のPCごと新調したい」という人は、BTOパソコンのサイコムで見積もりを取ってみるのが手っ取り早い。本記事のRX 9070 XTとの比較を見れば分かる通り、専用GPUとの差は桁で効いてくる。

BTOパソコンのサイコム【@Sycom】
BTOパソコン「Sycom(サイコム)」は、厳選した高性能なパーツを選んで用途や予算に合わせてカスタマイズできるBTOパソコンメーカーです。

【参考】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
2210.98
3215.94
4231.97
5〜7241.09〜250.31

初速211秒(1ステップ26.4秒)、落ちきって250秒。8ステップしかないのにこれである。 他者ベンチではRTX 4090で2〜3秒とされているモデルだ。

ただし19 GBを16 GiB枠で回して、破綻はしなかった。 前回のLLMのような「エラーを返さず待たせる」挙動は起きず、 ComfyUIがテキストエンコーダを退避しながら処理しきった。

面白いのは、処理量あたりの効率で見たときだ。すべて初速(冷却状態)で揃えている。

モデル総ピクセル×ステップスループット
SD1.5 512 / 20step5.24M18.4285k /秒
SDXL 1024 / 30step31.46M233.1135k /秒
Z-Image 1024 / 8step8.39M211.040k /秒

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秒であることは他者の公表値。

参考文献

GitHub – Comfy-Org/ComfyUI: The most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface.
The most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface. – Comfy-Org/ComfyUI
GitHub – drawthingsai/draw-things-community: The community repository for the Draw Things app.
The community repository for the Draw Things app. Contribute to drawthingsai/draw-things-community development by creati…
Z-Image-Turbo ComfyUI Workflow Example – ComfyUI
Z-Image-Turbo is a distilled 6B parameter efficient image generation model with sub-second inference latency.
Just a moment…
Draw Things on Mac 2026: Tutorial + 40% Faster than ComfyUI
Draw Things is a free Mac/iOS app for local AI image generation, 20-40% faster than ComfyUI on Apple Silicon. Setup, LoR…
Best Local AI Image Models 2026: FLUX vs SDXL vs Qwen
FLUX for prompt adherence, SDXL for LoRA/style breadth, Qwen-Image for text-in-image. Full comparison of local image mod…

コメント

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