مفوَّض تعلُّم الآلة من Tensorflow Lite Core

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

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

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

الطُرز المتوافقة

يتيح مفوَّض تعلُّم الآلة الأساسي حاليًا استخدام النماذج العائمة (FP32 وFP16).

تجربة تفويض تعلُّم الآلة الأساسي على نموذجك الخاص

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

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:&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. يوضح المثال التالي كيفية القيام بذلك:

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
      

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

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

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.

استخدام إصدار قديم من تعلُّم الآلة

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

العمليات المتاحة

تتوفّر العمليات التالية من قِبل المفوَّض الأساسي لتعلُّم الآلة.

  • إضافة
    • يمكن بث أشكال معيّنة فقط. في تخطيط موتر ML الأساسي، يمكن بث أشكال المتوتر التالية. [B, C, H, W]، [B, C, 1, 1]، [B, 1, H, W]، [B, 1, 1, 1].
  • متوسطحمام سباحة 2D
  • دالة Concat
    • يجب أن يتم التسلسل على طول محور القنوات.
  • الإحالات الناجحة بعد يوم
    • يجب أن تكون الترجيح والتحيز ثابتتين.
  • Depthwise conversion2D
    • يجب أن تكون الترجيح والتحيز ثابتتين.
  • متّصل بالكامل (المعروف أيضًا باسم Dense أو InnerProduct)
    • يجب أن تكون الترجيح والتحيز (إن وجدت) ثابتة.
    • تتوافق مع حافظة أحادية الدفعة فقط. يجب أن تكون أبعاد الإدخال 1، باستثناء البُعد الأخير.
  • هاردسويش
  • الخدمات اللوجستية (المعروفة أيضًا باسم Sigmoid)
  • Maxبول2D
  • MirrorPad
    • لا يتوفّر سوى الإدخال رباعي الأبعاد مع الوضع REFLECT. يجب أن تكون المساحة المتروكة ثابتة ويُسمح بها فقط للأبعاد H وW.
  • مول
    • يمكن بث أشكال معيّنة فقط. في تخطيط موتر ML الأساسي، يمكن بث أشكال المتوتر التالية. [B, C, H, W]، [B, C, 1, 1]، [B, 1, H, W]، [B, 1, 1, 1].
  • Pad وPadV2
    • لا يتوفّر سوى الإدخال رباعي الأبعاد. يجب أن تكون المساحة المتروكة ثابتة، ولا يُسمح إلا بأبعاد H وW.
  • ريلو
  • ReluN1To1
  • Relu6
  • إعادة تشكيل
    • لا يتوفّر هذا الخيار إلا عندما يكون إصدار تعلُّم الآلة المستهدف 2، ولا يتوفّر عند استهداف الإصدار Core ML 3.
  • ResizeBilinear
  • SoftMax
  • تانه
  • TransposeConv
    • يجب أن تكون الأوزان ثابتة.

إضافة ملاحظات

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

الأسئلة الشائعة

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

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