前回の続き:初速だけ見ても半分しか分からない
前回、iPhoneで各ランタイム(MLX / llama.cpp / LiteRT-LM / CoreML)の 初速(バースト tok/s) を比較しました(前回記事はこちら)。
ただ、実際にアプリで使っていると「最初は速いのに、生成し続けると失速する」感覚がずっとありました。そこで今回は デコード速度の時間推移 を、コールドスタートから 10分間の連続生成 で測りました。条件は全ランタイムで揃えています:同じモデル(Gemma 4 E2B, 4-bit)/同じ iPhone 17 Pro(A19 Pro)/コールドスタート。
結論から言うと、バーストで圧勝していたGPU系(MLX, LiteRT-LM)が約60秒で50%以上失速し、一番遅かったApple Neural Engine(CoreML)がほとんど落ちずに逆転 しました。
デコード速度:バースト vs 持続(Gemma 4 E2B 4-bit)
| ランタイム(演算ユニット) | バースト tok/s | 持続 tok/s(10分) | 維持率 |
|---|---|---|---|
| CoreML / ANE | 33 | 22 | 67% |
| MLX / GPU | 48 | 18 | 38% |
| LiteRT-LM / GPU | 56 | 27 | 48% |
GPU系は初速こそ速いが、10分後にはバーストの 38%/48% まで落ちる。ANEは初速こそ最下位だが 67% を維持 し、結果として MLXを完全に追い越し、LiteRTとの差も +70% → +23% まで縮みます。
どれだけ速く失速するか(各自のピーク比)
-10% -25% 床
MLX / GPU 5秒 35秒 ~18 tok/s
LiteRT / GPU 13秒 40秒 ~27 tok/s
CoreML / ANE 93秒 390秒 ~22 tok/s
GPU系は 十数秒で-25%。ANEは -10%に達するまで90秒以上。
なぜか —— これは「電力」の話
iOSは部位別の消費電力(ANE / GPU / CPU)を出すAPIがありません。しかも長時間回すと、端末は温度の上限を守るために 全バックエンドを同じ放熱予算まで絞る ので、iPhoneのバッテリー計測では差を分離できません。
そこで 同じモデルをMac(M4 Max)で powermetrics を使って測ると、原因がはっきり出ます:
- CoreML / ANE:12.7 W
- MLX / GPU:24.7 W
- llama.cpp / GPU:24.5 W
ANE経路はGPU経路の約半分の電力。電力が低い → 発熱が遅い → 熱制約のあるiPhoneではスロットリングがかからない、という流れです。AppleのMLXとGoogleのLiteRT-LMという 独立した2つのGPUランタイムが同じ崩れ方 をしている時点で、これは1ランタイムのバグではなく 端末のGPU熱特性 だと言えます。
まとめ:短距離はGPU、長距離はANE
- 短いチャット返信 → GPUの圧勝。初速がそのまま体験になる。
- 持続負荷(長文生成・エージェントのループ・バッチ/バックグラウンド処理)→ GPUのバースト優位はほぼ蒸発する。MLXはANEより遅くなり、LiteRTも半分失速した後はわずかなリードしか残らない。
- しかもANEは 約半分の電力 で動き、GPUをアプリの他の処理(描画・カメラ・他のML)のために空けておける。
ピーク速度が低くても、LLMをANE(CoreML)で動かす本当の理由はここにあります。
注意点(突っ込み歓迎)
- バースト = コールドからの約128トークン生成1回。持続 = 600秒の再プロンプトループのローリングウィンドウ速度。ループ内の再プロンプト負荷で絶対速度は少し下がる(CoreMLはprefillが相対的に重いので影響大)ため、バーストは単発のクリーンな計測値を採用。
- iOSのバッテリーは 1%刻み でしか取れず、持続下では全バックエンドが同じ放熱予算電力に張り付く。電力チャートはMac計測(M4 Max,
powermetrics, 同モデル)= iPhoneのスロットリングの メカニズム を、部位別Wが見えるデバイスで示したもの。スロットリング曲線自体はiPhone実測でクリーン。 -
LiteRT-LM は出力トークン上限がないため1回の生成がCoreML/MLXの128より長め。かつその1本だけ開始時の熱状態が
nominalではなくfairだった(バーストには影響なし)。 - CoreML-LLM はスライディングウィンドウ注意 を使っており、これがデコードコストを平坦に保つ理由の一つ(長距離の文脈をある程度犠牲にしてバウンドしたコンテキストにしている)。
リポジトリ(生データ+スクリプト)
3本すべての生JSONLと、この曲線を描くスクリプトはここにあります:
https://github.com/john-rocky/apple-silicon-llm-bench
みなさんに聞きたい
これは Android(Snapdragon Hexagon / Tensor NPU vs GPU) でも同じ傾向ですか? あなたのワークロードでは、GPUのバースト優位とNPUの持久力、どちらが効きますか?

