mlmodelcは、iOS、macOS、iPadOSを搭載したAppleデバイスでの実行に最適化されたCore MLモデルのコンパイル済みバージョンです。元の.mlmodel形式とは異なり、mlmodelcファイルはコンパイル段階を経て、モデルがCore ML Runtimeが理解できる内部表現に変換されます。Apple Developer Documentation、2025によると、コンパイルはXcodeでのアプリケーションビルド時、およびネットワークからモデルをダウンロードした後のデバイス上で自動的に実行されます。mlmodelcは、解釈可能な形式と比較して、より高速な起動とメモリ消費の削減を実現します。
重要なポイント
mlmodelcは、Appleデバイス上で直接実行するために設計されたコンパイル済みバイナリCore MLモデル形式です。元の.mlmodel形式は、protobufモデル記述、配列としての重み、JSONのメタデータを含むパッケージです。コンパイル中に、この構造は特定のハードウェアプラットフォームに最適化されたコンパクトなバイナリ表現に変換されます。
mlmodelcの主な違いは、推論中の解釈段階がないことです。Core ML Runtimeはprotobufスキーマを解析したり、動的に計算グラフを構築したりしません。これらすべてのステップはコンパイル時に実行されます。これにより、アーキテクチャの複雑さに応じて、モデルの最初の読み込み時間が30%から60%向上します。
WWDC 2023のセッション「Core ML Toolsとモデル最適化」によると、コンパイルには浮動小数点演算の最適化、連続するレイヤーの融合、Apple Neural Engineが理解できる形式への変換が含まれます。開発者はこのプロセスを手動で管理する必要はありません。Xcodeがビルド時に自動的にコンパイルを実行します。
| 特性 | .mlmodel | mlmodelc |
|---|---|---|
| ストレージ形式 | パッケージ(protobuf + 重み) | バイナリ、プラットフォーム固有 |
| 実行準備 | コンパイルが必要 | 推論準備完了 |
| ディスクサイズ | 元のサイズ | 10~20%小さい |
| 初回起動速度 | 遅い(解析 + コンパイル) | 即時起動 |
| ANEサポート | 追加の最適化が必要 | 自動 |
モデルのmlmodelcへのコンパイルは3段階で行われます。第1段階では、Core ML Toolsが.mlmodelのprotobuf仕様を読み取り、MIL(Model Intermediate Language)形式で内部計算グラフを構築します。ツールは各操作のターゲットデバイスとの互換性をチェックし、サポートされていないレイヤーをCPU実行用にマークします。
第2段階では、グラフの最適化が実行されます。連続するレイヤーの融合(畳み込み + バッチノルム → 融合畳み込み)、デッドノードの削除、FP32からFP16またはINT8への重みの量子化などです。Apple Engineering Report「Core ML Optimization Pipeline」(2024)によると、レイヤーの融合により推論操作の数が最大40%削減されます。
第3段階はバイナリ表現の生成です。最適化されたグラフは、独自のCore ML Runtime形式にシリアル化されます。重みはCPUキャッシュラインに合わせて保存され、メタデータは高速アクセスのために別のインデックスに保存されます。結果は.mlmodelc拡張子のフォルダで、アプリケーションバンドルに含める準備ができています。
mlmodelcの構造には3つの主要なコンポーネントが含まれています。Model Descriptionには、入力と出力のタイプ、その次元、テンソル名、前処理パラメータなどのモデルメタデータが含まれています。このセクションは、Core ML APIとの互換性のためにJSONのような形式で保存されます。
Programは、内部MIL言語での計算グラフのバイナリ表現です。AppleはMILを、TensorFlowのMLIRやONNXと同様の中間表現として使用しています。MILプログラムは操作で構成され、各操作にはタイプ、入力テンソルと出力テンソル、属性があります。MIL形式はApple Neural Engineでの効率的な実行に最適化されています。
3番目のコンポーネントはweights.binです。これは、モデルのすべての学習済み重みを含むファイルです。重みは、最適なキャッシュロードのために64バイトにアラインされて保存されます。コンパイル時に量子化が指定された場合、重みはFP16またはINT8で保存され、ファイルサイズが削減され、これらの形式をハードウェアサポートするApple A17およびM4チップでの推論が高速化されます。
Appleはアプリケーションにmlmodelcを含める3つの方法をサポートしています。1つ目はバンドルへの静的組み込みです。mlmodelcファイルをXcodeプロジェクトに追加すると、ビルド時に.appに含まれます。この方法は100 MBまでの小規模モデルに最適で、初回起動時にネットワークアクセスを必要としません。
2つ目の方法は、MLModel.compile(at:)を使用したネットワークからのダウンロードとデバイス上でのコンパイルです。開発者は.mlmodelをダウンロードし、一時ディレクトリに配置してCore MLコンパイラを呼び出します。結果はmlmodelcで、後続の起動のためにキャッシュできます。Core MLのApple HIGによると、この方法は100 MBを超えるモデルや、新しいアプリケーションバージョンを公開せずに動的に更新する場合に推奨されます。
3つ目の方法は、必要に応じてダウンロードされるモデルのためのオンデマンドリソース(On-Demand Resources)です。Apple ODRを使用すると、mlmodelcをクラウドに保存し、必要なときだけダウンロードできます。これは、ユーザーが一部のモデルしか使用しない、数十のモデルを持つアプリケーションで一般的なシナリオです。
ネットワークからモデルをダウンロードする場合、コンパイル時間を考慮することが重要です。MLModel.compile(at:)は同期的に実行され、A12以前のデバイスでは中規模モデルの場合、最大5~10秒間UIをブロックする可能性があります。バックグラウンドスレッドでコンパイルを実行し、ローディングインジケーターでユーザーに進捗を通知することをお勧めします。
mlmodelcの主な利点はモデルの読み込み速度です。Apple Performance Benchmarks(2024)によると、100 MBのResNet-50モデルは、.mlmodelと比較してmlmodelc形式で58%高速に読み込まれます。これは、複数のモデルを順次処理するアプリケーションにとって特に重要です。
2つ目の利点はピークメモリ消費の削減です。.mlmodelを読み込む際、Core ML Runtimeはprotobuf解析用のバッファとグラフコンパイル用の第2バッファを割り当てます。mlmodelcはこれらの段階をスキップして直接起動します。コンピュータビジョンモデルの場合、ピークメモリ消費は30~45%削減されます。
3つ目はハードウェアの最適化です。coremlcコンパイラはビルド時にターゲットデバイスを分析し、ANE、GPU、CPU間の最適な操作分割を選択します。ビルドがユニバーサルな場合、コンパイルは初回起動時にデバイスに延期され、結果は後続のセッションのためにキャッシュされます。
アプリケーションバンドルからコンパイル済みモデルを読み込む例。モデルのURLを指定してMLModel.load(contentsOf:)を呼び出すだけです。Core ML Runtimeは拡張子によって自動的にmlmodelc形式を検出し、初期化を実行します。
import CoreML
guard let modelURL = Bundle.main.url(
forResource: "MyModel",
withExtension: "mlmodelc"
) else { return }
let model = try await MLModel.load(contentsOf: modelURL)
let prediction = try await model.prediction(from: input)
デバイス上で.mlmodelをコンパイルし、後でキャッシュする例。MLModel.compile(at:)を使用してmlmodelcへの一時パスを取得し、キャッシュディレクトリにコピーします。
let sourceURL = FileManager.default.temporaryDirectory
.appendingPathComponent("MyModel.mlmodel")
let compiledURL = try await MLModel.compile(at: sourceURL)
let cacheURL = FileManager.default.urls(
for: .cachesDirectory, in: .userDomainMask
)[0].appendingPathComponent("MyModel.mlmodelc")
try FileManager.default.copyItem(at: compiledURL, to: cacheURL)
よくある質問
はい、mlmodelcはiOSシミュレーターで動作しますが、ANEアクセラレーションなしです。Neural EngineはMacに存在しないハードウェアコンポーネントであるためです。推論はAccelerateフレームワークを介してCPUで実行されます。
mlmodelcは実行用のコンパイル済み形式です。.mlpackageはXcode 15+用のコンテナで、元のモデルと複数の構成を組み合わせたものです。.mlpackageはアプリのビルド時にmlmodelcにコンパイルされます。
ファイルの拡張子を確認してください。.mlmodelc。モデルの拡張子が.mlmodelの場合、コンパイルされていません。Xcodeでビルドした後、準備済みのmlmodelcはアプリケーションのDerivedDataフォルダにあります。
いいえ、逆コンパイルは存在しません。mlmodelcはAppleのバイナリ独自形式です。元の.mlmodelはバージョン管理システムに別途保存されます。
はい、mlmodelcはCore ML Toolsを介してINT8量子化をサポートしています。コンパイル中に重みがFP32からINT8に変換され、サイズが4分の1に削減され、ANEで最大2倍の高速化が実現されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。