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، این کتابخانه بیش از ۲۰۰ عملگر از فریمورکهای مختلف را پوشش میدهد.
پس از تبدیل، مدل در قالب بسته .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 یکپارچه برای تبدیل از تمام فریمورکهای پشتیبانیشده و همچنین ابزارهای پسپردازش ارائه میدهد: quantize، بررسی دقت و可视化 گراف.
نصب و تبدیل پایه مدل از 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 برای معماریهای معمول بیش از ۹۵٪ است.
مرحله سوم — بهینهسازی گراف. coremltools ادغام عملیاتها (مثلاً conv + batch norm)، حذف تبدیلهای غیرضروری و مرتبسازی مجدد عملگرها را برای افزایش کارایی انجام میدهد. مرحله چهارم — سریالسازی به فرمت .mlmodel با ذخیره وزنها و فراداده.
رایجترین مشکل هنگام تبدیل، عملیاتهای پشتیبانینشده است. اگر مدل شامل عملگری باشد که در Core ML وجود ندارد، coremltools خطایی با نام عملگر گزارش میکند. راهحل — عملگر را با ترکیب معادلی از عملگرهای پشتیبانیشده جایگزین کنید یا یک لایه سفارشی از طریق custom layer API پیادهسازی کنید.
مشکل دوم — عدم تطابق ابعاد. PyTorch از فرمت NCHW استفاده میکند در حالی که Core ML به طور پیشفرض از NHWC استفاده میکند. coremltools به طور خودکار ترانهاده را درج میکند، اما گاهی ترتیب محورها به درستی تعیین نمیشود. ابعاد ورودی و خروجی را در لاگهای تبدیل بررسی کنید و در صورت لزوم input_features را با نامهای صحیح مشخص کنید.
مشکل سوم — کاهش دقت پس از quantize. هنگام تبدیل با پالت FP16 یا INT8، دقت مدل ممکن است کاهش یابد. coremltools ابزار ct.models.CompiledModel را برای مقایسه خروجیهای مدل اصلی و تبدیلشده بر روی دادههای ورودی یکسان فراهم میکند. اگر اختلاف بیش از ۱٪ باشد، از quantize با پالت FP16 بدون کالیبراسیون استفاده کنید یا از quantize صرفنظر کنید.
نمونه تبدیل مدل 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 با quantize FP16. برای فعالسازی پشتیبانی FP16 در دستگاههای Apple A13 و جدیدتر، 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
)
# quantize کردن وزنها به 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() استفاده کنید.
پالت quantize — این مجموعهای از پارامترها برای فشردهسازی وزنهای مدل است: fp16، int8 یا palettization. coremltools از پالت ۸ بیتی، ۱۶ بیتی و LUT-quantize با بیتهای مختلف پشتیبانی میکند.
بله، .mlmodel باید قبل از اجرا بر روی دستگاه به mlmodelc کامپایل شود. کامپایل به طور خودکار در Xcode هنگام ساخت یا بر روی دستگاه از طریق MLModel.compile(at:) انجام میشود.
از ct.models.CompiledModel برای مقایسه خروجیهای مدل اصلی و تبدیلشده استفاده کنید. دادههای ورودی یکسان را ارائه دهید و نتایج را با معیار MSE یا cosine similarity مقایسه کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید