مندوب Tensorflow Lite Core ML

يتيح مندوب TensorFlow Lite Core ML تشغيل نماذج TensorFlow Lite على إطار عمل Core ML ، مما يؤدي إلى استنتاج أسرع للنماذج على أجهزة iOS.

إصدارات وأجهزة iOS المدعومة:

  • iOS 12 والإصدارات الأحدث. في إصدارات iOS الأقدم ، سيعود مندوب Core ML تلقائيًا إلى وحدة المعالجة المركزية.
  • افتراضيًا ، لن يتم تمكين مندوب Core ML إلا على الأجهزة المزودة بـ A12 SoC والإصدارات الأحدث (iPhone Xs والإصدارات الأحدث) لاستخدام المحرك العصبي Neural Engine للاستدلال بشكل أسرع. إذا كنت تريد استخدام مندوب Core ML أيضًا على الأجهزة القديمة ، فيرجى الاطلاع على أفضل الممارسات

الموديلات المدعومة

يدعم مندوب Core ML حاليًا نماذج الطفو (FP32 و FP16).

تجربة مندوب Core ML على نموذجك الخاص

تم تضمين مندوب Core ML بالفعل في الإصدار الليلي من TensorFlow lite CocoaPods. لاستخدام مندوب Core ML ، قم بتغيير حجرة TensorFlow lite لتضمين نوع فرعي 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']

سويفت

    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)
    }
  

ج موضوعية


    // 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:&error];
    if (error != nil) { /* Error handling... */ }

    if (![interpreter allocateTensorsWithError:&error]) { /* 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);
      

أفضل الممارسات

استخدام مندوب Core ML على الأجهزة بدون المحرك العصبي

بشكل افتراضي ، سيتم إنشاء مفوض Core ML فقط إذا كان الجهاز يحتوي على محرك عصبي ، وسيعود null إذا لم يتم إنشاء المفوض. إذا كنت تريد تشغيل مندوب Core ML في بيئات أخرى (على سبيل المثال ، جهاز محاكاة) ، فقم بتمرير .all كخيار أثناء إنشاء مندوب في Swift. في C ++ (و Objective-C) ، يمكنك تمرير TfLiteCoreMlDelegateAllDevices . يوضح المثال التالي كيفية القيام بذلك:

سويفت

    var options = CoreMLDelegate.Options()
    options.enabledDevices = .all
    let coreMLDelegate = CoreMLDelegate(options: options)!
    let interpreter = try Interpreter(modelPath: modelPath,
                                      delegates: [coreMLDelegate])
      

ج موضوعية

    TFLCoreMLDelegateOptions* coreMLOptions = [[TFLCoreMLDelegateOptions alloc] init];
    coreMLOptions.enabledDevices = TFLCoreMLDelegateEnabledDevicesAll;
    TFLCoreMLDelegate* coreMLDelegate = [[TFLCoreMLDelegate alloc]
                                          initWithOptions:coreMLOptions];

    // Initialize interpreter with delegate
  

ج

    TfLiteCoreMlDelegateOptions options;
    options.enabled_devices = TfLiteCoreMlDelegateAllDevices;
    TfLiteDelegate* delegate = TfLiteCoreMlDelegateCreate(&options);
    // Initialize interpreter with delegate
      

استخدام مفوض Metal (GPU) كإجراء احتياطي.

عندما لا يتم إنشاء مندوب Core ML ، يمكنك بدلاً من ذلك استخدام مندوب Metal للحصول على مزايا الأداء. يوضح المثال التالي كيفية القيام بذلك:

سويفت

    var delegate = CoreMLDelegate()
    if delegate == nil {
      delegate = MetalDelegate()  // Add Metal delegate options if necessary.
    }

    let interpreter = try Interpreter(modelPath: modelPath,
                                      delegates: [delegate!])
  

ج موضوعية

    TFLDelegate* delegate = [[TFLCoreMLDelegate alloc] init];
    if (!delegate) {
      // Add Metal delegate options if necessary
      delegate = [[TFLMetalDelegate alloc] init];
    }
    // Initialize interpreter with delegate
      

ج

    TfLiteCoreMlDelegateOptions options = {};
    delegate = TfLiteCoreMlDelegateCreate(&options);
    if (delegate == NULL) {
      // Add Metal delegate options if necessary
      delegate = TFLGpuDelegateCreate(NULL);
    }
    // Initialize interpreter with delegate
      

يقرأ منطق إنشاء المفوض معرّف الجهاز (مثل iPhone11،1) لتحديد مدى توفر المحرك العصبي الخاص به. انظر الرمز لمزيد من التفاصيل. بدلاً من ذلك ، يمكنك تنفيذ مجموعتك الخاصة من أجهزة denylist باستخدام مكتبات أخرى مثل DeviceKit .

استخدام إصدار Core ML الأقدم

على الرغم من أن iOS 13 يدعم Core ML 3 ، إلا أن النموذج قد يعمل بشكل أفضل عند تحويله بمواصفات طراز Core ML 2. يتم تعيين إصدار التحويل الهدف على أحدث إصدار افتراضيًا ، ولكن يمكنك تغيير ذلك عن طريق تعيين coreMLVersion (في Swift ، coreml_version في C API) في خيار المفوض إلى الإصدار الأقدم.

العمليات المدعومة

يتم دعم العمليات التالية من قبل مندوب Core ML.

  • يضيف
    • يمكن بث أشكال معينة فقط. في تخطيط موتر Core ML ، تكون أشكال الموتر التالية قابلة للبث. [B, C, H, W] ، [B, C, 1, 1] ، [B, 1, H, W] ، [B, 1, 1, 1] .
  • متوسط ​​Pool2D
  • كونكات
    • يجب أن يتم إجراء التسلسل على طول محور القناة.
  • Conv2D
    • يجب أن تكون الأوزان والتحيز ثابتًا.
  • DepthwiseConv2D
    • يجب أن تكون الأوزان والتحيز ثابتًا.
  • متصل بالكامل (ويعرف أيضًا باسم المنتج الكثيف أو المنتج الداخلي)
    • يجب أن تكون الأوزان والتحيز (إن وجد) ثابتًا.
    • يدعم فقط حالة دفعة واحدة. يجب أن تكون أبعاد الإدخال 1 ، باستثناء البعد الأخير.
  • صعب
  • لوجستي (ويعرف أيضا باسم Sigmoid)
  • MaxPool2D
  • ميرور باد
    • يتم دعم الإدخال 4D فقط مع وضع REFLECT . يجب أن تكون الحشوة ثابتة ، ولا يُسمح بها إلا للأبعاد H و W.
  • مول
    • يمكن بث أشكال معينة فقط. في تخطيط موتر Core ML ، تكون أشكال الموتر التالية قابلة للبث. [B, C, H, W] ، [B, C, 1, 1] ، [B, 1, H, W] ، [B, 1, 1, 1] .
  • الوسادة و PadV2
    • يتم دعم الإدخال 4D فقط. يجب أن تكون الحشوة ثابتة ، ولا يُسمح بها إلا للأبعاد H و W.
  • ريلو
  • ReluN1To1
  • Relu6
  • إعادة تشكيل
    • يتم دعمه فقط عندما يكون إصدار Core ML المستهدف 2 ، غير مدعوم عند استهداف Core ML 3.
  • تغيير الحجم
  • سوفت ماكس
  • تانه
  • تبديل
    • يجب أن تكون الأوزان ثابتة.

استجابة

بالنسبة للمشكلات ، يرجى إنشاء مشكلة GitHub بجميع التفاصيل اللازمة لإعادة إنتاجها.

التعليمات

  • هل يدعم تفويض CoreML الرجوع إلى وحدة المعالجة المركزية إذا احتوى الرسم البياني على عمليات غير مدعومة؟
    • نعم
  • هل يعمل تفويض CoreML على iOS Simulator؟
    • نعم. تشتمل المكتبة على أهداف x86 و x86_64 بحيث يمكن تشغيلها على جهاز محاكاة ، لكنك لن ترى زيادة في الأداء على وحدة المعالجة المركزية.
  • هل يدعم مفوض TensorFlow Lite و CoreML نظام MacOS؟
    • تم اختبار TensorFlow Lite على نظام iOS فقط وليس على نظام MacOS.
  • هل يتم دعم عمليات TF Lite المخصصة؟
    • لا ، لا يدعم مفوض CoreML العمليات المخصصة وسيعودون إلى وحدة المعالجة المركزية.

واجهات برمجة التطبيقات