Core ML Model Conversion là quá trình chuyển đổi các mô hình học máy đã huấn luyện từ các framework phổ biến sang định dạng Core ML (.mlmodel), được tối ưu hóa để chạy trên các thiết bị Apple. Việc chuyển đổi là cần thiết vì PyTorch, TensorFlow và các framework khác sử dụng định dạng riêng không tương thích với Core ML Runtime. Theo tài liệu coremltools, 2025, thư viện hỗ trợ chuyển đổi từ PyTorch, TensorFlow 1.x và 2.x, Keras, ONNX, scikit-learn và libsvm. coremltools tự động thay thế các thao tác không được hỗ trợ bằng các thao tác tương đương, giữ nguyên độ chính xác số của mô hình.
Những điểm chính
Core ML Model Conversion là quá trình chuyển đổi một mô hình học máy đã huấn luyện từ định dạng framework nguồn sang định dạng .mlmodel mà Core ML Runtime trên các thiết bị Apple có thể hiểu được. Nếu không chuyển đổi, một mô hình được huấn luyện trong PyTorch hoặc TensorFlow không thể được tải và chạy trực tiếp trên iOS hoặc macOS.
Quá trình chuyển đổi bao gồm dịch đồ thị tính toán: mỗi toán tử từ framework nguồn (Conv2D, BatchNorm, ReLU) được ánh xạ tới toán tử Core ML tương ứng. Nếu không có sự thay thế trực tiếp, coremltools sử dụng các thao tác tổng hợp hoặc các lớp tùy chỉnh. Theo Apple ML Research, thư viện bao phủ hơn 200 toán tử từ nhiều framework khác nhau.
Sau khi chuyển đổi, mô hình được lưu ở định dạng gói .mlmodel, bao gồm mô tả đồ thị protobuf, trọng số ở dạng nhị phân và siêu dữ liệu. Tập tin này sau đó được biên dịch thành mlmodelc để chạy trên thiết bị đích.
coremltools phiên bản 7.x hỗ trợ chuyển đổi từ sáu nguồn. PyTorch — qua torch.jit.trace hoặc torch.export, TensorFlow 2.x — qua SavedModel và Keras H5, TensorFlow 1.x — qua đồ thị đóng băng .pb. Đối với ONNX, một biểu diễn trung gian được sử dụng, sau đó được dịch sang Core ML.
| Framework | Định dạng đầu vào | 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 là thư viện Python mã nguồn mở chính thức của Apple, có sẵn qua pip install coremltools. Thư viện cung cấp một API thống nhất để chuyển đổi từ tất cả các framework được hỗ trợ, cũng như các công cụ xử lý hậu kỳ: lượng tử hóa, kiểm tra độ chính xác và trực quan hóa đồ thị.
Cài đặt và chuyển đổi mô hình cơ bản từ 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")
Để chuyển đổi từ TensorFlow, hãy sử dụng SavedModel làm nguồn. coremltools tự động xác định các tensor đầu vào và đầu ra dựa trên signature_def:
import coremltools as ct
mlmodel = ct.convert(
"saved_model_dir",
source="tensorflow",
@minimum_deployment_target=ct.target.iOS16
)
mlmodel.save("MyTFModel.mlmodel")
Quy trình chuyển đổi bao gồm bốn bước. Ở bước đầu tiên, coremltools tải mô hình nguồn và thực hiện theo dõi (tracing) hoặc quét đồ thị. Đối với PyTorch, torch.jit.trace được sử dụng, nó chạy một đầu vào mẫu qua mô hình và ghi lại trình tự các thao tác.
Ở bước thứ hai, ánh xạ toán tử được thực hiện. Mỗi toán tử từ đồ thị nguồn được ánh xạ tới một toán tử Core ML. Nếu không có sự thay thế trực tiếp, coremltools chia toán tử thành một chuỗi các toán tử được hỗ trợ. Theo tài liệu coremltools, độ bao phủ toán tử PyTorch vượt quá 95% đối với các kiến trúc điển hình.
Bước thứ ba là tối ưu hóa đồ thị. coremltools thực hiện hợp nhất các thao tác (ví dụ, conv + batch norm), loại bỏ các chuyển đổi không cần thiết và sắp xếp lại các toán tử để cải thiện hiệu quả. Bước thứ tư là tuần tự hóa sang định dạng .mlmodel với việc bảo toàn trọng số và siêu dữ liệu.
Vấn đề phổ biến nhất khi chuyển đổi là các thao tác không được hỗ trợ. Nếu mô hình chứa một toán tử không có trong Core ML, coremltools báo lỗi kèm tên thao tác. Giải pháp là thay thế toán tử bằng một tổ hợp tương đương của các toán tử được hỗ trợ hoặc triển khai một lớp tùy chỉnh thông qua API lớp tùy chỉnh.
Vấn đề thứ hai là sự không khớp về kích thước. PyTorch sử dụng định dạng NCHW, trong khi Core ML sử dụng NHWC theo mặc định. coremltools tự động chèn phép chuyển vị, nhưng đôi khi thứ tự trục được xác định không chính xác. Hãy kiểm tra kích thước đầu vào và đầu ra trong nhật ký chuyển đổi và nếu cần, hãy chỉ định input_features với tên chính xác.
Vấn đề thứ ba là mất độ chính xác sau khi lượng tử hóa. Khi chuyển đổi với bảng màu FP16 hoặc INT8, độ chính xác của mô hình có thể giảm. coremltools cung cấp tiện ích ct.models.CompiledModel để so sánh đầu ra của mô hình nguồn và mô hình đã chuyển đổi trên cùng dữ liệu đầu vào. Nếu độ chênh lệch vượt quá 1%, hãy sử dụng lượng tử hóa với bảng màu FP16 mà không cần hiệu chuẩn hoặc bỏ qua hoàn toàn việc lượng tử hóa.
Ví dụ về chuyển đổi mô hình MobileNetV3 từ PyTorch với chỉ định loại đầu vào và phiên bản iOS tối thiểu. Sử dụng ct.ImageType để tự động chuẩn hóa hình ảnh:
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
)
# Lưu vào .mlmodel để biên dịch sau trong Xcode
mlmodel.save("MobileNetV3.mlmodel")
Ví dụ về chuyển đổi từ TensorFlow Keras với lượng tử hóa FP16. Chỉ định minimum_deployment_target để bật hỗ trợ FP16 trên các thiết bị có Apple A13 trở lên:
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
)
# Lượng tử hóa trọng số thành FP16 để giảm kích thước 2 lần
mlmodel_fp16 = ct.models.neural_network.quantization_utils.quantize_weights(
mlmodel, 16
)
mlmodel_fp16.save("EfficientNetB0_fp16.mlmodel")
Câu hỏi thường gặp
Có, nếu mô hình được lưu ở định dạng TorchScript, SavedModel hoặc ONNX. coremltools tải các định dạng này mà không cần mã nguồn và thực hiện chuyển đổi dựa trên đồ thị tính toán.
coremltools xuất danh sách các thao tác không được hỗ trợ trong nhật ký khi chuyển đổi. Sử dụng ct.utils.get_coreml_operations() để lấy danh sách đầy đủ các toán tử Core ML khả dụng.
Bảng màu lượng tử hóa là một tập hợp các tham số để nén trọng số của mô hình: fp16, int8 hoặc palettization. coremltools hỗ trợ bảng màu 8-bit, 16-bit và lượng tử hóa LUT với các độ sâu bit khác nhau.
Có, tập tin .mlmodel phải được biên dịch thành mlmodelc trước khi chạy trên thiết bị. Việc biên dịch được thực hiện tự động trong Xcode khi xây dựng hoặc trên thiết bị thông qua MLModel.compile(at:).
Sử dụng ct.models.CompiledModel để so sánh đầu ra của mô hình nguồn và mô hình đã chuyển đổi. Cung cấp cùng dữ liệu đầu vào và so sánh kết quả bằng các chỉ số MSE hoặc cosine similarity.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm