Appleの新フレームワークでオンデバイスLLMをMLXと比較した
実際に比較してみるのって大切ですね。
どうせ遅いと思ってた。
使いやすいようにぬるい感じになってるんでしょって。
ゴリゴリ最適化されてるMLXとかの方が速いんでしょって。
結果で度肝を抜かれた。
クソ速えやん!!
🐥
WWDC 2026 で発表された Core AI(Core ML の後継)で LLM を iPhone 17 Pro 実機で動かし、MLX・CoreML と同一モデル・同一ハーネスで比較しました。
iPhone 17 Pro・Qwen3-0.6B・short-chat・warm デコード tok/s(中央値):
リポジトリ(再現可能・生データ・Swift アダプタ全部公開): https://github.com/john-rocky/apple-silicon-llm-bench
Core AI とは
iOS / macOS 27 から入る Core ML の後継。パイプラインは
PyTorch → coreai-torch → .aimodel(MLIR IR)
→ coreai-models の Swift ランタイム(CoreAILM)で実行
LLM は coreai.llm.export <model> で .aimodel にエクスポートできる。今回は Apple 公式の例にもなっている Qwen3-0.6B を、公式の export → 公式の Swift ランタイムで動かした("Apple が想定する使い方"に忠実に)。
uv run coreai.llm.export qwen3-0.6b --platform iOS
結果の読み方: cold / warm(初回コスト)
Core AI GPU の 181 tok/s は warm(定常)。
pipelined エンジンは最初の1回だけカーネルコンパイル+3段パイプライン充填のコストがあり、初回 71 tok/s。
ただしこれは一度きりで、アプリを再起動しても 2回目以降は ~181(コンパイル済みカーネルが効く)。
MLX は最初から ~112 で安定。
要するに、
「初回だけ Core AI が遅く、2回目以降はずっと速い(≈1.6× MLX)」。
再現方法(実機ドライブの注意点)
scripts/bench_coreai_iphone.sh が export → AOT compile → バンドル組立 → サイドロード → 実行 → 集計までやる。1つだけ罠:
devicectl process launchを--console付きで非対話シェル(バックグラウンド)から叩くとCoreDeviceError 10002で失敗する。**--consoleなし(デタッチ)**で起動し、--runs N(1回 cold + 残り warm を1セッションで)にして、終わってからDocuments/resultsを pull するのが安定。
ビルド面では、coreai-models の CXGrammar.xcframework と executorch.xcframework が両方 include/module.modulemap を出して衝突するため、iOS アプリからは ExecuTorch を外した。
ハマりどころ①: iOS は IR を JIT できない → AOT コンパイル必須
エクスポートした .aimodel は MLIR IR(main.mlirb、compilation.targets: [])。macOS は読み込み時に JIT するが、iOS は JIT 不可。生 IR をそのままロードすると、こうなる:
Model load failed: NSPOSIXErrorDomain Code=2 "No such file or directory"
デバイス向けに事前(AOT)コンパイルが必要:
xcrun coreai-build compile qwen3_0_6b_ios.aimodel \
--platform iOS --preferred-compute neural-engine --output out/
# → out/qwen3_0_6b_ios.h18p.aimodelc (GPUファミリ別。h18p = iPhone 17 Pro)
そして metadata.json の assets.main をコンパイル済みファイル名(qwen3_0_6b_ios.h18p.aimodelc)に差し替えてバンドルを組み直す。
ハマりどころ②: 演算ユニット(ANE/GPU)はエクスポート形状で決まる
実行時フラグでは切り替わらない。 EngineFactory がモデル構造から自動判定する:
-
--platform iOS(静的形状)→ チャンク静的と判定 → ANE(static-shapeエンジン) - 動的エクスポート → GPU(
coreai-pipelinedエンジン)
なので GPU と ANE を比べたいなら 2つの別バンドル(静的=ANE用 / 動的=GPU用)を AOT コンパイルして用意する。coreai-pipelined を静的モデルに強制すると unsupportedEngineVariant で弾かれる。
メモリ: CoreML-LLM が省メモリ王者
自作の CoreML-LLM 変換(Qwen3-0.6B のステートフル INT4 ANE チャンク、ANE 100%)はデコード最遅(39)だが 184 MB と圧倒的に省メモリ(Core AI ANE の約 1/6)。デコード速度(39.8)は Mac でのパリティ実測と完全一致した。用途で最適なランタイムは変わる——速度なら Core AI GPU、メモリなら CoreML。
詳細・methodology・生 JSONL・Swift の CoreAIRuntime アダプタは全公開:
https://github.com/john-rocky/apple-silicon-llm-bench
🐣
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。
もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…
いずれも中間コストを省いたリーズナブルな価格でお請けできます。
お仕事のご相談はこちらまで
rockyshikoku@gmail.com
機械学習やAR技術を使ったアプリケーションを作っています。
機械学習/AR関連の情報を発信しています。