mlmodelc هو إصدار مُجمّع من نموذج Core ML، محسّن للتنفيذ على أجهزة Apple التي تعمل بنظام iOS و macOS و iPadOS. على عكس التنسيق الأصلي .mlmodel، يمر ملف mlmodelc بمرحلة تجميع يتم خلالها تحويل النموذج إلى تمثيل داخلي يفهمه Core ML Runtime. وفقًا لـ وثائق مطوري Apple، 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 ← convolution مدمجة)، وإزالة العقد الميتة، وكمية الأوزان من FP32 إلى FP16 أو INT8. وفقًا لتقرير هندسة Apple «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 ميجابايت ولا يتطلب وصولاً إلى الشبكة للتشغيل الأول.
الطريقة الثانية هي التنزيل من الشبكة مع التجميع على الجهاز عبر MLModel.compile(at:). يقوم المطور بتنزيل .mlmodel، ويضعه في دليل مؤقت، ويستدعي مترجم Core ML. النتيجة هي mlmodelc يمكن تخزينه مؤقتًا للتشغيلات اللاحقة. وفقًا لـ إرشادات Apple HIG لـ Core ML، يُوصى بهذا النهج للنماذج التي يزيد حجمها عن 100 ميجابايت وللتحديثات الديناميكية دون نشر إصدار جديد من التطبيق.
الطريقة الثالثة هي الموارد عند الطلب (On-Demand Resources) للنماذج التي يتم تنزيلها حسب الحاجة. يتيح ODR من Apple تخزين mlmodelc في السحابة وتنزيله فقط عند الحاجة. هذا سيناريو شائع للتطبيقات التي تحتوي على عشرات النماذج حيث يستخدم المستخدم عددًا قليلاً منها فقط.
عند تنزيل نموذج من الشبكة، من المهم مراعاة وقت التجميع. يتم تنفيذ MLModel.compile(at:) بشكل متزامن وقد يحظر واجهة المستخدم على الأجهزة المزودة بـ A12 والإصدارات الأقدم لمدة تصل إلى 5–10 ثوانٍ للنماذج متوسطة الحجم. يُوصى بإجراء التجميع في خلفية الخيط وإخطار المستخدم بالتقدم عبر مؤشر التحميل.
الفائدة الرئيسية لـ mlmodelc هي سرعة تحميل النموذج. وفقًا لمعايير أداء Apple (2024)، يتم تحميل نموذج ResNet-50 بحجم 100 ميجابايت أسرع بنسبة 58% بتنسيق mlmodelc مقارنة بـ .mlmodel. هذا مهم بشكل خاص للتطبيقات التي تعمل مع نماذج متعددة بشكل تسلسلي.
الميزة الثانية هي تقليل استهلاك الذروة للذاكرة. عند تحميل .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. يتم الاستدلال على CPU عبر إطار Accelerate.
mlmodelc هو تنسيق مُجمّع للتنفيذ. .mlpackage هو حاوية لـ Xcode 15+ تجمع النموذج الأصلي وتكوينات متعددة. يتم تجميع .mlpackage إلى mlmodelc عند بناء التطبيق.
تحقق من امتداد الملف: .mlmodelc. إذا كان امتداد النموذج .mlmodel، فهو غير مُجمّع. بعد البناء في Xcode، يوجد mlmodelc الجاهز في مجلد DerivedData للتطبيق.
لا، لا توجد عملية فك تجميع عكسية. mlmodelc هو تنسيق ثنائي خاص بـ Apple. يتم حفظ .mlmodel الأصلي بشكل منفصل في نظام التحكم في الإصدارات.
نعم، يدعم mlmodelc تكميم INT8 عبر Core ML Tools. أثناء التجميع، يتم تحويل الأوزان من FP32 إلى INT8، مما يقلل الحجم أربع مرات ويسرع حتى 2x على ANE.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا