Core ML Model Conversion este procesul de transformare a modelelor antrenate de învățare automată din framework-uri populare în formatul Core ML (.mlmodel), optimizat pentru execuția pe dispozitive Apple. Conversia este necesară deoarece PyTorch, TensorFlow și alte framework-uri folosesc formate proprii, incompatibile cu Core ML Runtime. Conform coremltools documentation, 2025, biblioteca suportă conversia din PyTorch, TensorFlow 1.x și 2.x, Keras, ONNX, scikit-learn și libsvm. coremltools înlocuiește automat operațiile nesuportate cu echivalente, păstrând acuratețea numerică a modelului.
Principalele puncte
Core ML Model Conversion este procesul de transformare a unui model antrenat de învățare automată din formatul framework-ului original în formatul .mlmodel, inteligibil pentru Core ML Runtime pe dispozitive Apple. Fără conversie, un model antrenat în PyTorch sau TensorFlow nu poate fi încărcat și executat direct pe iOS sau macOS.
Procesul de conversie include traducerea grafului de calcul: fiecare operator al framework-ului original (Conv2D, BatchNorm, ReLU) este mapat la operatorul corespunzător Core ML. Dacă nu există un înlocuitor direct, coremltools folosește operații compuse sau straturi personalizate. Conform Apple ML Research, biblioteca acoperă peste 200 de operatori din diferite framework-uri.
După conversie, modelul este salvat în formatul pachet .mlmodel, care include descrierea protobuf a grafului, greutățile în formă binară și metadatele. Acest fișier este apoi compilat în mlmodelc pentru execuția pe dispozitivul țintă.
coremltools versiunea 7.x suportă conversia din șase surse. PyTorch — prin torch.jit.trace sau torch.export, TensorFlow 2.x — prin SavedModel și Keras H5, TensorFlow 1.x — prin frozen graph .pb. Pentru ONNX se folosește o reprezentare intermediară, care apoi este translatată în Core ML.
| Framework | Format de intrare | API coremltools |
|---|---|---|
| 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 — este biblioteca Python oficială de la Apple cu cod sursă deschis, disponibilă prin pip install coremltools. Biblioteca oferă o API unificată pentru conversia din toate framework-urile suportate, precum și instrumente de post-procesare: cuantizare, verificare a acurateții și vizualizare a grafului.
Instalarea și conversia de bază a modelului din 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")
Pentru conversia din TensorFlow, utilizați SavedModel ca sursă. coremltools determină automat tensorii de intrare și ieșire pe baza signature_def:
import coremltools as ct
mlmodel = ct.convert(
"saved_model_dir",
source="tensorflow",
@minimum_deployment_target=ct.target.iOS16
)
mlmodel.save("MyTFModel.mlmodel")
Procesul de conversie constă în patru etape. În prima etapă, coremltools încarcă modelul original și efectuează trasarea (tracing) sau scanarea grafului. Pentru PyTorc, se folosește torch.jit.trace, care rulează date de intrare eșantion prin model și înregistrează secvența operațiilor.
În a doua etapă se efectuează maparea operatorilor (operator mapping). Fiecare operator din graful original este asociat cu un operator Core ML. Dacă nu există un înlocuitor direct, coremltools împarte operatorul într-o secvență de operatori suportați. Conform documentației coremltools, acoperirea operatorilor PyTorch depășește 95% pentru arhitecturile tipice.
A treia etapă — optimizarea grafului. coremltools efectuează fuzionarea operațiilor (de exemplu, conv + batch norm), eliminarea transformărilor inutile și reordonarea operatorilor pentru creșterea eficienței. A patra etapă — serializarea în formatul .mlmodel cu păstrarea greutăților și metadatelor.
Cea mai frecventă problemă la conversie sunt operațiile nesuportate. Dacă modelul conține un operator care lipsește din Core ML, coremltools raportează o eroare cu numele operației. Soluția — înlocuiți operatorul cu o combinație echivalentă de operatori suportați sau implementați un strat personalizat prin custom layer API.
A doua problemă — nepotrivirea dimensiunilor. PyTorch folosește formatul NCHW, iar Core ML implicit NHWC. coremltools inserează automat transpunerea, dar uneori ordinea axelor este determinată incorect. Verificați dimensiunile de intrare și ieșire în jurnalele de conversie și, dacă este necesar, specificați input_features cu nume corecte.
A treia problemă — pierderea preciziei după cuantizare. La conversia cu paleta FP16 sau INT8, precizia modelului poate scădea. coremltools oferă utilitarul ct.models.CompiledModel pentru compararea ieșirilor modelului original și convertit pe aceleași date de intrare. Dacă diferența depășește 1%, utilizați cuantizarea cu paletă FP16 fără calibrare sau renunțați la cuantizare.
Exemplu de conversie a modelului MobileNetV3 din PyTorch cu specificarea tipului datelor de intrare și a versiunii minime iOS. Utilizați ct.ImageType pentru normalizarea automată a imaginilor:
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
)
# Salvați în .mlmodel pentru compilare ulterioară în Xcode
mlmodel.save("MobileNetV3.mlmodel")
Exemplu de conversie din TensorFlow Keras cu cuantizare FP16. Specificați minimum_deployment_target pentru a activa suportul FP16 pe dispozitivele cu Apple A13 și mai noi:
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
)
# Cuantizați greutățile la FP16 pentru reducerea dimensiunii de 2 ori
mlmodel_fp16 = ct.models.neural_network.quantization_utils.quantize_weights(
mlmodel, 16
)
mlmodel_fp16.save("EfficientNetB0_fp16.mlmodel")
Întrebări frecvente
Da, dacă modelul este salvat în format TorchScript, SavedModel sau ONNX. coremltools încarcă aceste formate fără a necesita codul sursă și efectuează conversia pe baza grafului de calcul.
coremltools afișează lista operațiilor nesuportate în jurnal în timpul conversiei. Utilizați ct.utils.get_coreml_operations() pentru a obține lista completă a operatorilor Core ML disponibili.
Paleta de cuantizare este un set de parametri pentru compresia greutăților modelului: fp16, int8 sau palettization. coremltools suportă paleta pe 8 biți, 16 biți și cuantizarea LUT cu diferite bitări.
Da, .mlmodel trebuie compilat în mlmodelc înainte de execuția pe dispozitiv. Compilarea se efectuează automat în Xcode la construire sau pe dispozitiv prin MLModel.compile(at:).
Utilizați ct.models.CompiledModel pentru a compara ieșirile modelului original și convertit. Furnizați aceleași date de intrare și comparați rezultatele prin metrica MSE sau cosine similarity.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și