mlmodelc — نسخه کامپایلشده مدل Core ML است که برای اجرا در دستگاههای Apple با سیستمهای iOS، macOS و iPadOS بهینهسازی شده است. بر خلاف فرمت اصلی .mlmodel، فایل mlmodelc مرحله کامپایل را طی میکند که در آن مدل به نمایش داخلی قابل فهم برای Core ML Runtime تبدیل میشود. به استناد به Apple Developer Documentation, 2025، کامپایل به صورت خودکار هنگام ساخت برنامه در Xcode و نیز در دستگاه پس از دانلود مدل از شبکه انجام میشود. mlmodelc در مقایسه با فرمت تفسیری راهاندازی سریعتر و مصرف حافظه کمتری را فراهم میکند.
نکات کلیدی
mlmodelc — یک فرمت دودویی کامپایلشده از مدل Core ML است که برای اجرای مستقیم در دستگاههای Apple طراحی شده است. فرمت اصلی .mlmodel یک بسته است که شامل توصیف مدل در protobuf، وزنها در قالب آرایهها و فرادادهها در JSON است. در طول کامپایل، این ساختار به یک نمایش دودویی فنجردار تبدیل میشود که برای سطح سختافزار مشخصی بهینهسازی شده است.
تفاوت کلیدی mlmodelc — نبود مرحله تفسیر در طول استنتاج. Core ML Runtime شماتوان protobuf را تجزیه و تحلیل نمیکند و گراف محاسباتی را به صورت دینامیک نمیسازد — همه این مراحل در مرحله کامپایل انجام شدهاند. این باعث صرفهجویی زمان اولین راهاندازی مدل از 30% تا 60% بسته به پیچیدگی معماری میشود.
به استناد به جلسه WWDC 2023 «Core ML Tools و بهینهسازی مدلها»، کامپایل شامل بهینهسازی عملیات عدد شناور، ادغام لایههای پیاپی و تبدیل به فرماتی قابل فهم برای Apple Neural Engine است. توسعهدهنده نیازی به مدیریت دستی این فرآیند ندارد — Xcode کامپایل را به صورت خودکار در مرحله ساخت انجام میدهد.
| ویژگی | .mlmodel | mlmodelc |
|---|---|---|
| فرمت ذخیره | بسته (protobuf + وزنها) | دودوی، مخصوص سطح سختافزار |
| آمادگی برای اجرا | نیازمند کامپایل | آماده برای استنتاج |
| اندازه روی دیسک | اندازه اصلی | 10–20% کوچکتر |
| سرعت اولین راهاندازی | کندتر (تجزیه و تحلیل + کامپایل) | راهاندازی فوری |
| پشتیبانی ANE | نیازمند بهینهسازی اضافی | خودکار |
کامپایل مدل به mlmodelc از سه مرحله عبور میکند. در مرحله اول، Core ML Tools مشخصات protobuf .mlmodel را میخواند و یک گراف محاسباتی داخلی در فرمت MIL (Model Intermediate Language) میسازد. ابزار سازگاری هر عملیات را با دستگاه مقصد بررسی میکند و لایههای پشتیبانی نشده را برای اجرا در CPU علامتگذاری میکند.
در مرحله دوم، بهینهسازی گراف انجام میشود: ادغام لایههای پیاپی (convolution + batch norm → fused convolution)، حذف گرههای مرده، کوانتیزاسیون وزنها از FP32 به FP16 یا INT8. به استناد به Apple Engineering Report «Core ML Optimization Pipeline» (2024)، ادغام لایهها تعداد عملیات استنتاج را تا 40% کاهش میدهد.
مرحله سوم — تولید نمایش دودویی. گراف بهینهسازی شده به فرمت انحصاری Core ML Runtime تبدیل به سری میشود. وزنها با همترازی با خطوط کیش پروازنده ذخیره میشوند و فرادادهها در یک اندکس جداگانه برای دسترسی سریع قرار میگیرند. نتیجه — پوشهای با پسوند .mlmodelc، آماده برای درج در بندل برنامه.
ساختار mlmodelc شامل سه مولفه کلیدی است. Model Description — فرادادههای مدل: نوعهای ورودی و خروجی، ابعاد آنها، نامهای تنسورها، پارامترهای پیشپردازش. این بخش به صورتی مشابه JSON برای سازگاری با API Core ML ذخیره میشود.
Program — نمایش دودویی گراف محاسباتی به زبان داخلی MIL. Apple از MIL به عنوان یک نمایش واسطهای مانند MLIR در TensorFlow یا ONNX استفاده میکند. برنامه MIL از عملیاتهایی تشکیل شده است که هر کدام نوع، تنسورهای ورودی و خروجی و ویژگیهایی دارد. فرمت MIL برای اجرای کارآمد در Apple Neural Engine بهینهسازی شده است.
مولفه سوم — weights.bin — فایلی حاوی تمام وزنهای آموزش دیده شده مدل. وزنها با همترازی 64 بایتی برای بارگیری بهینه در کیش ذخیره میشوند. اگر در طول کامپایل کوانتیزاسیون مشخص شده باشد، وزنها در FP16 یا INT8 ذخیره میشوند که این اندازه فایل را کاهش میدهد و استنتاج را در تراشهای Apple A17 و M4 با پشتیبانی سختافزاری این فرمتها سرعت میبخشد.
Apple سه روش برای گنجاندن mlmodelc در برنامه پشتیبانی میکند. روش اول — گنجاندن استاتیک در بندل: فایل mlmodelc به پروژه Xcode اضافه شده و در طول ساخت وارد .app میشود. این روش برای مدلهای کوچک تا 100 MB بهینه است و برای اولین راهاندازی نیازی به دسترسی شبکه ندارد.
روش دوم — دانلود از شبکه با کامپایل روی دستگاه از طریق MLModel.compile(at:). توسعهدهنده .mlmodel را دانلود میکند، آن را در یک دیرکتوری موقت قرار میدهد و کامپایلر Core ML را فراخوان میکند. نتیجه — mlmodelcی است که میتوان آن را برای اجراهای بعدی ذخیره کرد. به استناد به Apple HIG برای Core ML، این رویکرد برای مدلهای بالای 100 MB و بروزرسانی پویا بدون منتشر کردن نسخه جدید برنامه توصیه میشود.
روش سوم — On-Demand Resources برای مدلهایی که بر اساس درخواست بارگیری میشوند. Apple ODR امکان ذخیره mlmodelc در ابر و بارگیری تنها در صورت نیاز را فراهم میکند. این یک سناریو محبوب برای برنامههایی با دهها مدل است که کاربر تنها از چند تایی استفاده میکند.
هنگام دانلود مدل از شبکه، در نظر گرفتن زمان کامپایل مهم است. MLModel.compile(at:) به صورت همزمان اجرا میشود و میتواند رابط کاربر را در دستگاههای A12 و بالاتر تا 5–10 ثانیه برای مدلهای اندازه متوسط مسدود کند. توصیه میشود کامپایل را در پشزمینه انجام دهید و از طریق نماینده بارگیری کاربر را در جریان قرار دهید.
مزیت اصلی mlmodelc سرعت بارگیری مدل است. به استناد به Apple Performance Benchmarks (2024)، مدل ResNet-50 با اندازه 100 MB در فرمات mlmodelc در مقایسه با .mlmodel 58% سریعتر بارگیری میشود. این به ویژه برای برنامههایی که با چندین مدل به صورت پیاپی کار میکنند مهم است.
مزیت دوم — کاهش مصرف حافظه اوج. هنگام بارگیری .mlmodel، Core ML Runtime یک بافر برای تجزیه و تحلیل protobuf و یک بافر دیگر برای کامپایل گراف تخصیص میدهد. mlmodelc مستقیماً راهاندازی میشود و این مراحل را نادیده میگیرد. مصرف حافظه اوج برای مدلهای بینایی کامپیوتری 30–45% کاهش مییابد.
سومی — بهینهسازی سختافزاری. کامپایلر coremlc دستگاه مقصد را در مرحله ساخت تحلیل میکند و تقسیم بهینه عملیات را بین ANE، GPU و CPU انتخاب میکند. اگر ساخت همگانی باشد، کامپایل به دستگاه در اولین راهاندازی منتقل میشود و نتیجه برای جلسههای بعدی ذخیره میشود.
نمونه بارگیری مدل کامپایلشده از بندل برنامه. کافی است URL مدل را مشخص کرده و MLModel.load(contentsOf:) را فراخوان کنید. Core ML Runtime به طور خودکار فرمات mlmodelc را از روی پسوند تشخیص میدهد و مقداردهی را انجام میدهد.
import CoreML
guard let modelURL = Bundle.main.url(
forResource: "MyModel",
withExtension: "mlmodelc"
) else { return }
let model = try await MLModel.load(contentsOf: modelURL)
let prediction = try await model.prediction(from: input)
نمونه کامپایل .mlmodel روی دستگاه با ذخیرهسازی بعدی. از MLModel.compile(at:) برای دریافت مسیر موقت mlmodelc استفاده کنید، سپس آن را به دیرکتوری کیش کپی کنید.
let sourceURL = FileManager.default.temporaryDirectory
.appendingPathComponent("MyModel.mlmodel")
let compiledURL = try await MLModel.compile(at: sourceURL)
let cacheURL = FileManager.default.urls(
for: .cachesDirectory, in: .userDomainMask
)[0].appendingPathComponent("MyModel.mlmodelc")
try FileManager.default.copyItem(at: compiledURL, to: cacheURL)
سوالات متداول
بله، mlmodelc در شبیهساز iOS کار میکند، اما بدون تسریع ANE، زیرا Neural Engine یک مولفه سختافزاری است که در Mac وجود ندارد. استنتاج از طریق Accelerate framework در CPU انجام میشود.
mlmodelc — فرمات کامپایلشده برای اجراست. .mlpackage — کانتینری برای Xcode 15+ است که مدل اصلی و چند تنظیمات را ترکیب میکند. .mlpackage در طول ساخت برنامه به mlmodelc کامپایل میشود.
پسوند فایل را بررسی کنید: .mlmodelc. اگر مدل پسوند .mlmodel داشته باشد، کامپایل نشده است. پس از ساخت در Xcode، mlmodelc حاضر در پوشه DerivedData برنامه قرار میگیرد.
خیر، بازگردانی به عکس وجود ندارد. mlmodelc یک فرمت دودویی انحصاری Apple است. .mlmodel اصلی به طور جداگانه در سیستم کنترل نسخه ذخیره میشود.
بله، mlmodelc از طریق Core ML Tools از کوانتیزاسیون INT8 پشتیبانی میکند. در طول کامپایل، وزنها از FP32 به INT8 تبدیل میشوند که منجر به کاهش چهاربرابری اندازه و تا 2x تسریع در ANE میشود.
نتیجهگیری
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید