يتيح تفويض LiteRT Core ML تشغيل نماذج LiteRT على إطار العمل الأساسي لتعلُّم الآلة إلى استنتاج النموذج بشكل أسرع على أجهزة iOS.
إصدارات وأجهزة iOS المتوافقة:
- الإصدار 12 من نظام التشغيل iOS والإصدارات الأحدث. في إصدارات iOS الأقدم، سيتولى تفويض Core ML إلى وحدة المعالجة المركزية تلقائيًا.
- سيتم تلقائيًا تفعيل التفويض الأساسي لتعلُّم الآلة على الأجهزة المزوّدة بالمنظومة على الرقاقة (A12 SoC) والإصدارات الأحدث (هاتف iPhone X والإصدارات الأحدث) لاستخدام المحرّك العصبي للاستنتاج بشكل أسرع. إذا كنت تريد استخدام التفويض الأساسي لتعلُّم الآلة أيضًا على الأجهزة الأقدم، يُرجى مراجعة أفضل الممارسات
الطُرز المتوافقة
يتيح تفويض Core ML حاليًا النماذج العائمة (FP32 وFP16).
تجربة المفوَّض الأساسي لتعلُّم الآلة وفقًا لنموذجك الخاص
سبق أن تم إدراج تفويض Core ML في الإصدار الليلي من LiteRT
CocoaPods لاستخدام التفويض الأساسي لتعلُّم الآلة، عليك تغيير مجموعة LiteRT لتضمينها.
المواصفات الفرعية CoreML
في Podfile
.
target 'YourProjectName'
pod 'TensorFlowLiteSwift/CoreML', '~> 2.4.0' # Or TensorFlowLiteObjC/CoreML
أو
# Particularily useful when you also want to include 'Metal' subspec.
target 'YourProjectName'
pod 'TensorFlowLiteSwift', '~> 2.4.0', :subspecs => ['CoreML']
Swift
let coreMLDelegate = CoreMLDelegate() var interpreter: Interpreter // Core ML delegate will only be created for devices with Neural Engine if coreMLDelegate != nil { interpreter = try Interpreter(modelPath: modelPath, delegates: [coreMLDelegate!]) } else { interpreter = try Interpreter(modelPath: modelPath) }
Objective-C
// Import module when using CocoaPods with module support @import TFLTensorFlowLite; // Or import following headers manually # import "tensorflow/lite/objc/apis/TFLCoreMLDelegate.h" # import "tensorflow/lite/objc/apis/TFLTensorFlowLite.h" // Initialize Core ML delegate TFLCoreMLDelegate* coreMLDelegate = [[TFLCoreMLDelegate alloc] init]; // Initialize interpreter with model path and Core ML delegate TFLInterpreterOptions* options = [[TFLInterpreterOptions alloc] init]; NSError* error = nil; TFLInterpreter* interpreter = [[TFLInterpreter alloc] initWithModelPath:modelPath options:options delegates:@[ coreMLDelegate ] error:e&rror]; if (error != nil) { /* Error handling... */ } if (![interpreter allocateTensorsWithError:e&rror]) { /* Error handling... */ } if (error != nil) { /* Error handling... */ } // Run inference ...
C (حتى 2.3.0)
#include "tensorflow/lite/delegates/coreml/coreml_delegate.h" // Initialize interpreter with model TfLiteModel* model = TfLiteModelCreateFromFile(model_path); // Initialize interpreter with Core ML delegate TfLiteInterpreterOptions* options = TfLiteInterpreterOptionsCreate(); TfLiteDelegate* delegate = TfLiteCoreMlDelegateCreate(NULL); // default config TfLiteInterpreterOptionsAddDelegate(options, delegate); TfLiteInterpreterOptionsDelete(options); TfLiteInterpreter* interpreter = TfLiteInterpreterCreate(model, options); TfLiteInterpreterAllocateTensors(interpreter); // Run inference ... /* ... */ // Dispose resources when it is no longer used. // Add following code to the section where you dispose of the delegate // (e.g. `dealloc` of class). TfLiteInterpreterDelete(interpreter); TfLiteCoreMlDelegateDelete(delegate); TfLiteModelDelete(model);
أفضل الممارسات
استخدام المفوَّض الأساسي لتعلُّم الآلة على الأجهزة التي لا تتضمّن "المحرّك العصبي"
تلقائيًا، لن يتم إنشاء تفويض تعلُّم الآلة الأساسي إلا إذا كان الجهاز يتضمّن تقنية Neual
محرّك البحث، وسيعرض null
إذا لم يتم إنشاء التفويض. إذا كنت ترغب في
تشغيل تفويض Core ML على البيئات الأخرى (على سبيل المثال، المحاكي)، اجتياز .all
كخيار أثناء إنشاء التفويض في Swift. في لغة C++ (والهدف-C)، يمكنك
الاجتياز TfLiteCoreMlDelegateAllDevices
يوضّح المثال التالي كيفية إجراء ذلك:
Swift
var options = CoreMLDelegate.Options() options.enabledDevices = .all let coreMLDelegate = CoreMLDelegate(options: options)! let interpreter = try Interpreter(modelPath: modelPath, delegates: [coreMLDelegate])
Objective-C
TFLCoreMLDelegateOptions* coreMLOptions = [[TFLCoreMLDelegateOptions alloc] init]; coreMLOptions.enabledDevices = TFLCoreMLDelegateEnabledDevicesAll; TFLCoreMLDelegate* coreMLDelegate = [[TFLCoreMLDelegate alloc] initWithOptions:coreMLOptions]; // Initialize interpreter with delegate
C
TfLiteCoreMlDelegateOptions options; options.enabled_devices = TfLiteCoreMlDelegateAllDevices; TfLiteDelegate* delegate = TfLiteCoreMlDelegateCreate(&options); // Initialize interpreter with delegate
استخدام تفويض المعدن(GPU) كعنصر احتياطي.
عندما لا يتم إنشاء تفويض Core ML، يمكنك بدلاً من ذلك استخدام مفوَّض في فريق موسيقى "الميتال" للحصول على ومزايا الأداء. يوضّح المثال التالي كيفية إجراء ذلك:
Swift
var delegate = CoreMLDelegate() if delegate == nil { delegate = MetalDelegate() // Add Metal delegate options if necessary. } let interpreter = try Interpreter(modelPath: modelPath, delegates: [delegate!])
Objective-C
TFLDelegate* delegate = [[TFLCoreMLDelegate alloc] init]; if (!delegate) { // Add Metal delegate options if necessary delegate = [[TFLMetalDelegate alloc] init]; } // Initialize interpreter with delegate
C
TfLiteCoreMlDelegateOptions options = {}; delegate = TfLiteCoreMlDelegateCreate(&options); if (delegate == NULL) { // Add Metal delegate options if necessary delegate = TFLGpuDelegateCreate(NULL); } // Initialize interpreter with delegate
يقرأ منطق الإنشاء المفوَّض رقم تعريف الجهاز للجهاز (مثل iPhone11,1) بهدف تحديد مدى توفر المحرك العصبوني. يمكنك الاطّلاع على الرموز البرمجية لمزيد من التفاصيل. يمكنك بدلاً من ذلك تنفيذ مجموعتك الخاصة من قائمة الحظر. الأجهزة التي تستخدم مكتبات أخرى مثل DeviceKit.
استخدام إصدار أقدم من Core ML
على الرغم من أنّ iOS 13 يتوافق مع Core ML 3، قد يعمل النموذج بشكل أفضل
ويتم تحويلها باستخدام مواصفات نموذج Core ML 2. إصدار الإحالة الناجحة المستهدَف هو
على أحدث إصدار افتراضيًا، ولكن يمكنك تغيير ذلك من خلال
coreMLVersion
(في Swift، coreml_version
في C API) في خيار التفويض
الإصدار الأقدم.
العمليات المتاحة
يوفِّر المفوَّض الأساسي لتعلُّم الآلة العمليات التالية.
- إضافة
- هناك أشكال معينة فقط قابلة للبث. في تخطيط Core ML tensor،
يمكن بث أشكال متوترة التالية.
[B, C, H, W]
،[B, C, 1, 1]
،[B, 1, H, W]
،[B, 1, 1, 1]
.
- هناك أشكال معينة فقط قابلة للبث. في تخطيط Core ML tensor،
يمكن بث أشكال متوترة التالية.
- متوسط مستوى المسبح 2D
- كونكات
- يجب أن تتم عملية الدمج على طول محور القناة.
- الإحالة الناجحة 2D
- يجب أن تكون الترجيحات والتحيز ثابتين.
- DepthwiseConvert2D
- يجب أن تكون الترجيحات والتحيز ثابتين.
- متّصل بالكامل (المعروف أيضًا باسم Dense أو InnerProduct)
- يجب أن تكون الترجيحات والانحياز (إن وُجد) ثابتين.
- تتوافق فقط مع حافظة "دفعة واحدة". يجب أن تكون أبعاد الإدخال 1، باستثناء البعد الأخير.
- غموض
- الخدمات اللوجستية (المعروفة أيضًا باسم Sigmoid)
- الحد الأقصى لـ "حمام السباحة 2D"
- MirrorPad
- لا يتوفّر إلا الإدخال رباعي الأبعاد مع وضع
REFLECT
. يجب أن تكون المساحة المتروكة ثابت، ولا يُسمح به إلا لأبعاد H وW.
- لا يتوفّر إلا الإدخال رباعي الأبعاد مع وضع
- مول
- هناك أشكال معينة فقط قابلة للبث. في تخطيط Core ML tensor،
يمكن بث أشكال متوترة التالية.
[B, C, H, W]
،[B, C, 1, 1]
،[B, 1, H, W]
،[B, 1, 1, 1]
.
- هناك أشكال معينة فقط قابلة للبث. في تخطيط Core ML tensor،
يمكن بث أشكال متوترة التالية.
- PadV2
- ولا يتوفّر سوى الإدخال رباعي الأبعاد. ينبغي أن تكون المساحة المتروكة ثابتة، مسموح به لأبعاد H وW.
- Relu
- سلسلة ReluN1To1
- Relu6
- إعادة تشكيل
- لا تتوفّر هذه الميزة إلا عندما يكون الإصدار 2 المستهدف لتعلُّم الآلة هو، ولا تتوفّر في الحالات التالية: التي تستهدف Core ML 3
- ResizeBilinear
- SoftMax
- تانه
- TransposeConv
- يجب أن تكون الأوزان ثابتة.
ملاحظات
بالنسبة إلى المشاكل، يُرجى إنشاء GitHub المشكلة في جميع التفاصيل اللازمة لإعادة إنتاج الخطأ.
الأسئلة الشائعة
- هل يتيح التفويض في CoreML إمكانية الرجوع إلى وحدة المعالجة المركزية (CPU) إذا كان الرسم البياني يحتوي على ملفات غير متوافقة؟
العمليات؟
- نعم
- هل يعمل تفويض CoreML على iOS Simulator؟
- نعم. تتضمن المكتبة أهداف x86 وx86_64 بحيث يمكن تشغيلها على محاكي، لكنك لن تتحسن الأداء عبر وحدة المعالجة المركزية.
- هل يدعم تفويض LiteRT وCoreML نظام التشغيل MacOS؟
- يتم اختبار LiteRT على نظام iOS فقط، وليس على نظام التشغيل MacOS.
- هل عمليات LiteRT المخصّصة متوافقة؟
- لا، لا يدعم تفويض CoreML العمليات المخصصة وسينتقل إلى وحدة المعالجة المركزية (CPU).