Το Core ML Model Conversion είναι η διαδικασία μετασχηματισμού εκπαιδευμένων μοντέλων μηχανικής μάθησης από δημοφιλή πλαίσια στη μορφή Core ML (.mlmodel), βελτιστοποιημένη για εκτέλεση σε συσκευές Apple. Η μετατροπή είναι απαραίτητη καθώς τα PyTorch, TensorFlow και άλλα πλαίσια χρησιμοποιούν δικές τους μορφές που δεν είναι συμβατές με το Core ML Runtime. Σύμφωνα με το coremltools documentation, 2025, η βιβλιοθήκη υποστηρίζει μετατροπή από PyTorch, TensorFlow 1.x και 2.x, Keras, ONNX, scikit-learn και libsvm. Το coremltools αντικαθιστά αυτόματα τις μη υποστηριζόμενες λειτουργίες με ισοδύναμες, διατηρώντας την αριθμητική ακρίβεια του μοντέλου.
Κύρια σημεία
Core ML Model Conversion είναι η διαδικασία μετατροπής ενός εκπαιδευμένου μοντέλου μηχανικής μάθησης από τη μορφή του αρχικού πλαισίου στη μορφή .mlmodel που είναι κατανοητή από το Core ML Runtime σε συσκευές Apple. Χωρίς μετατροπή, ένα μοντέλο εκπαιδευμένο σε PyTorch ή TensorFlow δεν μπορεί να φορτωθεί και να εκτελεστεί απευθείας σε iOS ή macOS.
Η διαδικασία μετατροπής περιλαμβάνει μετάφραση του γράφου υπολογισμών: κάθε τελεστής του αρχικού πλαισίου (Conv2D, BatchNorm, ReLU) αντιστοιχίζεται στον αντίστοιχο τελεστή Core ML. Εάν δεν υπάρχει άμεση αντικατάσταση, το coremltools χρησιμοποιεί σύνθετες λειτουργίες ή προσαρμοσμένα επίπεδα. Σύμφωνα με το Apple ML Research, η βιβλιοθήκη καλύπτει περισσότερους από 200 τελεστές από διάφορα πλαίσια.
Μετά τη μετατροπή, το μοντέλο αποθηκεύεται σε μορφή πακέτου .mlmodel, το οποίο περιλαμβάνει περιγραφή protobuf του γράφου, βάρη σε δυαδική μορφή και μεταδεδομένα. Αυτό το αρχείο στη συνέχεια μεταγλωττίζεται σε mlmodelc για εκτέλεση στη συσκευή-στόχο.
Το coremltools έκδοση 7.x υποστηρίζει μετατροπή από έξι πηγές. PyTorch — μέσω torch.jit.trace ή torch.export, TensorFlow 2.x — μέσω SavedModel και Keras H5, TensorFlow 1.x — μέσω frozen graph .pb. Για ONNX χρησιμοποιείται μια ενδιάμεση αναπαράσταση που στη συνέχεια μεταφράζεται σε Core ML.
| Πλαίσιο | Μορφή εισόδου | 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 — είναι η επίσημη βιβλιοθήκη Python ανοικτού κώδικα από την Apple, διαθέσιμη μέσω 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")
Η διαδικασία μετατροπής αποτελείται από τέσσερα στάδια. Στο πρώτο στάδιο, το coremltools φορτώνει το αρχικό μοντέλο και εκτελεί ανίχνευση (tracing) ή σάρωση γράφου. Για PyTorch χρησιμοποιείται το torch.jit.trace, το οποίο περνά δείγμα δεδομένων εισόδου μέσω του μοντέλου και καταγράφει την ακολουθία λειτουργιών.
Στο δεύτερο στάδιο, πραγματοποιείται αντιστοίχιση τελεστών (operator mapping). Κάθε τελεστής από τον αρχικό γράφο αντιστοιχίζεται σε έναν τελεστή Core ML. Εάν δεν υπάρχει άμεση αντικατάσταση, το coremltools χωρίζει τον τελεστή σε μια ακολουθία υποστηριζόμενων. Σύμφωνα με την τεκμηρίωση του coremltools, η κάλυψη τελεστών PyTorch υπερβαίνει το 95% για τυπικές αρχιτεκτονικές.
Τρίτο στάδιο — βελτιστοποίηση γράφου. Το coremltools εκτελεί συγχώνευση λειτουργιών (π.χ. conv + batch norm), αφαίρεση περιττών μετασχηματισμών και αναδιάταξη τελεστών για αύξηση της αποδοτικότητας. Τέταρτο στάδιο — σειριοποίηση σε μορφή .mlmodel με διατήρηση βαρών και μεταδεδομένων.
Το πιο συνηθισμένο πρόβλημα κατά τη μετατροπή είναι οι μη υποστηριζόμενες λειτουργίες. Εάν το μοντέλο περιέχει έναν τελεστή που λείπει από το Core ML, το coremltools αναφέρει σφάλμα με το όνομα της λειτουργίας. Λύση — αντικαταστήστε τον τελεστή με έναν ισοδύναμο συνδυασμό υποστηριζόμενων ή υλοποιήστε ένα προσαρμοσμένο επίπεδο μέσω custom layer API.
Δεύτερο πρόβλημα — αναντιστοιχία διαστάσεων. Το PyTorch χρησιμοποιεί τη μορφή NCHW, ενώ το Core ML χρησιμοποιεί προεπιλεγμένα NHWC. Το coremltools εισάγει αυτόματα μεταφορά, αλλά μερικές φορές η σειρά των αξόνων καθορίζεται λανθασμένα. Ελέγξτε τις διαστάσεις εισόδου και εξόδου στα αρχεία καταγραφής μετατροπής και εάν χρειάζεται, καθορίστε το input_features με σωστά ονόματα.
Τρίτο πρόβλημα — απώλεια ακρίβειας μετά από κβάντιση. Κατά τη μετατροπή με παλέτα FP16 ή INT8, η ακρίβεια του μοντέλου μπορεί να μειωθεί. Το coremltools παρέχει το βοηθητικό πρόγραμμα ct.models.CompiledModel για σύγκριση εξόδων του αρχικού και του μετατραπέντος μοντέλου στα ίδια δεδομένα εισόδου. Εάν η διαφορά υπερβαίνει το 1%, χρησιμοποιήστε κβάντιση με παλέτα FP16 χωρίς βαθμονόμηση ή εγκαταλείψτε την κβάντιση.
Παράδειγμα μετατροπής του μοντέλου MobileNetV3 από PyTorch με καθορισμό του τύπου δεδομένων εισόδου και της ελάχιστης έκδοσης iOS. Χρησιμοποιήστε το 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
)
# Αποθήκευση σε .mlmodel για μεταγενέστερη μεταγλώττιση στο Xcode
mlmodel.save("MobileNetV3.mlmodel")
Παράδειγμα μετατροπής από TensorFlow Keras με κβάντιση FP16. Καθορίστε το minimum_deployment_target για ενεργοποίηση υποστήριξης FP16 σε συσκευές με Apple A13 και νεότερες:
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
)
# Κβάντισε τα βάρη σε FP16 για 2x μείωση μεγέθους
mlmodel_fp16 = ct.models.neural_network.quantization_utils.quantize_weights(
mlmodel, 16
)
mlmodel_fp16.save("EfficientNetB0_fp16.mlmodel")
Συχνές ερωτήσεις
Ναι, εάν το μοντέλο είναι αποθηκευμένο σε μορφή TorchScript, SavedModel ή ONNX. Το coremltools φορτώνει αυτές τις μορφές χωρίς να απαιτείται πηγαίος κώδικας και εκτελεί τη μετατροπή βάσει του γράφου υπολογισμών.
Το coremltools εμφανίζει λίστα των μη υποστηριζόμενων λειτουργιών στο αρχείο καταγραφής κατά τη μετατροπή. Χρησιμοποιήστε το ct.utils.get_coreml_operations() για να λάβετε την πλήρη λίστα των διαθέσιμων τελεστών Core ML.
Η παλέτα κβάντισης είναι ένα σύνολο παραμέτρων για συμπίεση βαρών μοντέλου: fp16, int8 ή palettization. Το coremltools υποστηρίζει παλέτα 8-bit, 16-bit και κβάντιση LUT με διαφορετικά βάθη bit.
Ναι, το .mlmodel πρέπει να μεταγλωττιστεί σε mlmodelc πριν από την εκτέλεση στη συσκευή. Η μεταγλώττιση πραγματοποιείται αυτόματα στο Xcode κατά την κατασκευή ή στη συσκευή μέσω MLModel.compile(at:).
Χρησιμοποιήστε το ct.models.CompiledModel για σύγκριση των εξόδων του αρχικού και του μετατραπέντος μοντέλου. Δώστε τα ίδια δεδομένα εισόδου και συγκρίνετε τα αποτελέσματα με τη μετρική MSE ή cosine similarity.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης