Core ML Model Conversionとは、学習済み機械学習モデルを主要フレームワークからCore ML(.mlmodel)形式に変換するプロセスであり、Appleデバイス上での実行に最適化されています。PyTorch、TensorFlow、その他のフレームワークはCore ML Runtimeと互換性のない独自形式を使用するため、変換が必要です。coremltoolsのドキュメント(2025年)によると、このライブラリはPyTorch、TensorFlow 1.xおよび2.x、Keras、ONNX、scikit-learn、libsvmからの変換をサポートしています。coremltoolsはサポートされていない操作を自動的に同等の操作に置き換え、モデルの数値精度を保持します。
重要ポイント
Core ML Model Conversionとは、学習済み機械学習モデルをソースフレームワーク形式から、Appleデバイス上のCore ML Runtimeが理解する.mlmodel形式に変換するプロセスです。変換なしでは、PyTorchやTensorFlowで学習したモデルをiOSやmacOSに直接ロードして実行することはできません。
変換プロセスには計算グラフの変換が含まれます。ソースフレームワークの各演算子(Conv2D、BatchNorm、ReLU)は、対応するCore ML演算子にマッピングされます。直接の代替がない場合、coremltoolsは複合操作またはカスタムレイヤーを使用します。Apple ML Researchによると、このライブラリはさまざまなフレームワークの200以上の演算子をカバーしています。
変換後、モデルは.mlmodelバンドル形式で保存され、protobufグラフ記述、バイナリ形式の重み、メタデータが含まれます。このファイルはその後、ターゲットデバイスで実行するためにmlmodelcにコンパイルされます。
coremltoolsバージョン7.xは6つのソースからの変換をサポートしています。PyTorch — torch.jit.traceまたはtorch.export経由、TensorFlow 2.x — SavedModelおよびKeras H5経由、TensorFlow 1.x — frozen graph .pb経由。ONNXの場合は中間表現が使用され、その後Core MLに変換されます。
| フレームワーク | 入力形式 | coremltools API |
|---|---|---|
| PyTorch | TorchScript、torch.export | CTConverter / convert() |
| TensorFlow 2.x | SavedModel、Keras H5 | convert() |
| TensorFlow 1.x | Frozen .pb | convert() |
| ONNX | .onnx | onnx_to_coreml() |
| scikit-learn | .pkl / Pipeline | converters.sklearn.convert() |
| Keras | .h5 / .keras | convert() |
coremltoolsはAppleの公式オープンソースPythonライブラリで、pip install coremltoolsで利用可能です。このライブラリは、サポートされているすべてのフレームワークからの変換のための統一API、および後処理ツール(量子化、精度チェック、グラフ可視化)を提供します。
PyTorchからのインストールと基本的なモデル変換:
import coremltools as ct
import torch
import torchvision
model = torchvision.models.resnet18(pretrained=True)
model.eval()
example_input = torch.rand(1, 3, 224, 224)
traced_model = torch.jit.trace(model, example_input)
mlmodel = ct.convert(
traced_model,
source="pytorch",
inputs=[ct.ImageType(shape=example_input.shape)]
)
mlmodel.save("ResNet18.mlmodel")
TensorFlowからの変換には、ソースとしてSavedModelを使用します。coremltoolsはsignature_defに基づいて入力テンソルと出力テンソルを自動的に決定します:
import coremltools as ct
mlmodel = ct.convert(
"saved_model_dir",
source="tensorflow",
@minimum_deployment_target=ct.target.iOS16
)
mlmodel.save("MyTFModel.mlmodel")
変換プロセスは4つの段階で構成されます。最初の段階では、coremltoolsがソースモデルをロードし、トレースまたはグラフスキャンを実行します。PyTorchの場合はtorch.jit.traceが使用され、サンプル入力をモデルに通して操作の順序を記録します。
2番目の段階では、演算子マッピングが実行されます。ソースグラフの各演算子がCore ML演算子にマッピングされます。直接の代替がない場合、coremltoolsは演算子をサポートされている演算子のシーケンスに分割します。coremltoolsのドキュメントによると、典型的なアーキテクチャでのPyTorch演算子のカバレッジは95%を超えています。
3番目の段階はグラフ最適化です。coremltoolsは操作の融合(例:conv + batch norm)、不要な変換の削除、効率向上のための演算子の並べ替えを実行します。4番目の段階は、重みとメタデータを保持した.mlmodel形式へのシリアライズです。
最も一般的な変換の問題はサポートされていない操作です。モデルにCore MLにない演算子が含まれている場合、coremltoolsは操作名とともにエラーを報告します。解決策は、演算子をサポートされている演算子の同等の組み合わせに置き換えるか、カスタムレイヤーAPIを使用してカスタムレイヤーを実装することです。
2番目の問題は次元の不一致です。PyTorchはNCHW形式を使用しますが、Core MLはデフォルトでNHWCを使用します。coremltoolsは自動的に転置を挿入しますが、軸の順序が誤って判断されることがあります。変換ログで入力と出力の次元を確認し、必要に応じて正しい名前でinput_featuresを指定してください。
3番目の問題は量子化後の精度低下です。FP16またはINT8パレットで変換すると、モデルの精度が低下する可能性があります。coremltoolsは、同じ入力データで元のモデルと変換後のモデルの出力を比較するためのct.models.CompiledModelユーティリティを提供します。差異が1%を超える場合は、キャリブレーションなしのFP16パレットでの量子化を使用するか、量子化を完全にスキップしてください。
入力タイプの指定と最小iOSバージョンを使用した、PyTorchからのMobileNetV3モデル変換の例。自動画像正規化にはct.ImageTypeを使用します:
import coremltools as ct
import torchvision
model = torchvision.models.mobilenet_v3_small(
pretrained=True
)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced = torch.jit.trace(model, example)
mlmodel = ct.convert(
traced,
source="pytorch",
inputs=[ct.ImageType(
shape=example.shape,
scale=1.0/255.0,
bias=[0, 0, 0]
)],
@minimum_deployment_target=ct.target.iOS16
)
# 後でXcodeでコンパイルするために.mlmodelに保存
mlmodel.save("MobileNetV3.mlmodel")
FP16量子化を使用したTensorFlow Kerasからの変換例。Apple A13以降のデバイスでFP16サポートを有効にするにはminimum_deployment_targetを指定します:
import coremltools as ct
from tensorflow import keras
keras_model = keras.applications.EfficientNetB0(
weights="imagenet"
)
mlmodel = ct.convert(
keras_model,
source="tensorflow",
@minimum_deployment_target=ct.target.iOS17
)
# 2倍のサイズ削減のために重みをFP16に量子化
mlmodel_fp16 = ct.models.neural_network.quantization_utils.quantize_weights(
mlmodel, 16
)
mlmodel_fp16.save("EfficientNetB0_fp16.mlmodel")
よくある質問
はい、モデルがTorchScript、SavedModel、またはONNX形式で保存されている場合可能です。coremltoolsはこれらの形式をソースコードを必要とせずにロードし、計算グラフに基づいて変換を実行します。
coremltoolsは変換中にログにサポートされていない操作のリストを出力します。利用可能なCore ML演算子の完全なリストを取得するには、ct.utils.get_coreml_operations()を使用してください。
量子化パレットとは、モデルの重みを圧縮するためのパラメータセットです:fp16、int8、またはパレット化。coremltoolsは8ビット、16ビットのパレット、および異なるビット深度でのLUT量子化をサポートしています。
はい、デバイス上で実行する前に.mlmodelをmlmodelcにコンパイルする必要があります。コンパイルはビルド時にXcodeで、またはMLModel.compile(at:)を使用してデバイス上で自動的に実行されます。
ct.models.CompiledModelを使用して、元のモデルと変換後のモデルの出力を比較します。同じ入力データを提供し、MSEまたはコサイン類似度メトリクスを使用して結果を比較します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。