Core MLモデル変換:概要、手順、変換方法

著者: IT Sectr 公開日: 2026-07-17 読了時間: 6 分

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デバイス上で実行するためのMLモデルの.mlmodel形式への変換。
  • 主要ツールはAppleのオープンソースPythonライブラリcoremltoolsです。
  • PyTorch、TensorFlow、Keras、ONNX、scikit-learnをサポート。
  • プロセスにはグラフトレース、操作の置き換え、精度検証が含まれます。
  • 変換後、モデルを高速化のためにFP16またはINT8に量子化できます。

Core ML Model Conversionとは

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
PyTorchTorchScript、torch.exportCTConverter / convert()
TensorFlow 2.xSavedModel、Keras H5convert()
TensorFlow 1.xFrozen .pbconvert()
ONNX.onnxonnx_to_coreml()
scikit-learn.pkl / Pipelineconverters.sklearn.convert()
Keras.h5 / .kerasconvert()

変換ツール:coremltools

coremltoolsはAppleの公式オープンソースPythonライブラリで、pip install coremltoolsで利用可能です。このライブラリは、サポートされているすべてのフレームワークからの変換のための統一API、および後処理ツール(量子化、精度チェック、グラフ可視化)を提供します。

PyTorchからのインストールと基本的なモデル変換:

python
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に基づいて入力テンソルと出力テンソルを自動的に決定します:

python
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パレットでの量子化を使用するか、量子化を完全にスキップしてください。

PyTorchとTensorFlowからの変換例

入力タイプの指定と最小iOSバージョンを使用した、PyTorchからのMobileNetV3モデル変換の例。自動画像正規化にはct.ImageTypeを使用します:

python
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を指定します:

python
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はこれらの形式をソースコードを必要とせずにロードし、計算グラフに基づいて変換を実行します。

Core MLでサポートされていない操作はどうやって確認できますか?

coremltoolsは変換中にログにサポートされていない操作のリストを出力します。利用可能なCore ML演算子の完全なリストを取得するには、ct.utils.get_coreml_operations()を使用してください。

coremltoolsにおける量子化パレットとは?

量子化パレットとは、モデルの重みを圧縮するためのパラメータセットです:fp16、int8、またはパレット化。coremltoolsは8ビット、16ビットのパレット、および異なるビット深度でのLUT量子化をサポートしています。

変換後にコンパイルは必要ですか?

はい、デバイス上で実行する前に.mlmodelをmlmodelcにコンパイルする必要があります。コンパイルはビルド時にXcodeで、またはMLModel.compile(at:)を使用してデバイス上で自動的に実行されます。

変換後のモデルの精度を確認するには?

ct.models.CompiledModelを使用して、元のモデルと変換後のモデルの出力を比較します。同じ入力データを提供し、MSEまたはコサイン類似度メトリクスを使用して結果を比較します。

まとめ

  • Core ML Model Conversionは、Appleデバイス上で実行するためにMLモデルを.mlmodel形式に変換するプロセスです。
  • 主要ツールはcoremltoolsで、PyTorch、TensorFlow、Keras、ONNX、scikit-learnをサポートしています。
  • 変換にはグラフトレース、演算子マッピング、最適化、シリアライズが含まれます。
  • サポートされていない操作は同等の組み合わせに置き換えられるか、カスタムレイヤーAPIを介して実装されます。
  • 変換後、サイズ削減と推論高速化のためにFP16およびINT8量子化が利用可能です。
  • デプロイ前に、ct.models.CompiledModelを使用してモデルの精度を確認してください。
  • アプリケーションでの自動モデル更新のために、CI/CDの一部として変換パイプラインを計画してください。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください