نماینده LiteRT Core ML

نماینده LiteRT Core ML اجرای مدل‌های LiteRT را در چارچوب Core ML فعال می‌کند، که منجر به استنتاج سریع‌تر مدل در دستگاه‌های iOS می‌شود.

نسخه ها و دستگاه های iOS پشتیبانی شده:

  • iOS 12 به بعد. در نسخه‌های قدیمی‌تر iOS، Core ML به طور خودکار به CPU بازگشته است.
  • به‌طور پیش‌فرض، Core ML delegate فقط در دستگاه‌های دارای SoC A12 و جدیدتر (iPhone Xs و جدیدتر) فعال می‌شود تا از موتور عصبی برای استنتاج سریع‌تر استفاده کند. اگر می‌خواهید از نماینده Core ML در دستگاه‌های قدیمی‌تر نیز استفاده کنید، لطفاً بهترین شیوه‌ها را ببینید

مدل های پشتیبانی شده

نماینده Core ML در حال حاضر از مدل های شناور (FP32 و FP16) پشتیبانی می کند.

نماینده Core ML را در مدل خود امتحان کنید

نماینده Core ML در حال حاضر در نسخه شبانه LiteRT CocoaPods گنجانده شده است. برای استفاده از نمایندگی Core ML، غلاف 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']

سویفت

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

هدف-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 delegate را در محیط‌های دیگر اجرا کنید (مثلاً شبیه‌ساز)، هنگام ایجاد delegate در سوئیفت، .all به عنوان یک گزینه ارسال کنید. در C++ (و Objective-C)، می توانید TfLiteCoreMlDelegateAllDevices پاس کنید. مثال زیر نحوه انجام این کار را نشان می دهد:

سویفت

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

هدف-C

    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
      

استفاده از متال (GPU) نماینده به عنوان جایگزین.

هنگامی که نماینده Core ML ایجاد نمی شود، می توانید همچنان از Metal delegate برای دریافت مزایای عملکرد استفاده کنید. مثال زیر نحوه انجام این کار را نشان می دهد:

سویفت

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

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

هدف-C

    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) را می خواند تا در دسترس بودن موتور عصبی آن را تعیین کند. برای جزئیات بیشتر کد را ببینید. از طرف دیگر، می‌توانید مجموعه دستگاه‌های انکار خود را با استفاده از کتابخانه‌های دیگر مانند DeviceKit پیاده‌سازی کنید.

استفاده از نسخه قدیمی Core ML

اگرچه iOS 13 از Core ML 3 پشتیبانی می کند، اما زمانی که با مشخصات مدل Core ML 2 تبدیل شود، ممکن است این مدل بهتر کار کند. نسخه تبدیل هدف به طور پیش‌فرض روی آخرین نسخه تنظیم شده است، اما می‌توانید با تنظیم coreMLVersion (در Swift، coreml_version در C API) در گزینه delegate به نسخه قدیمی‌تر، آن را تغییر دهید.

عملیات پشتیبانی شده

عملیات زیر توسط نماینده Core ML پشتیبانی می شود.

  • اضافه کنید
    • فقط اشکال خاصی قابل پخش هستند. در طرح تانسور Core ML، اشکال تانسور زیر قابل پخش هستند. [B, C, H, W] ، [B, C, 1, 1] ، [B, 1, H, W] ، [B, 1, 1, 1] .
  • میانگین پول 2D
  • Concat
    • الحاق باید در امتداد محور کانال انجام شود.
  • Conv2D
    • وزن و تعصب باید ثابت باشد.
  • DepthwiseConv2D
    • وزن و تعصب باید ثابت باشد.
  • کاملاً متصل (معروف به Dense یا InnerProduct)
    • وزن و سوگیری (در صورت وجود) باید ثابت باشد.
    • فقط از کیس تک دسته ای پشتیبانی می کند. ابعاد ورودی باید 1 باشد، به جز بعد آخر.
  • Hardswish
  • لجستیک (با نام مستعار Sigmoid)
  • MaxPool2D
  • آینه پد
    • فقط ورودی 4 بعدی با حالت REFLECT پشتیبانی می شود. بالشتک باید ثابت باشد و فقط برای ابعاد H و W مجاز است.
  • مول
    • فقط اشکال خاصی قابل پخش هستند. در طرح تانسور Core ML، اشکال تانسور زیر قابل پخش هستند. [B, C, H, W] ، [B, C, 1, 1] ، [B, 1, H, W] ، [B, 1, 1, 1] .
  • Pad و PadV2
    • فقط ورودی 4 بعدی پشتیبانی می شود. بالشتک باید ثابت باشد و فقط برای ابعاد H و W مجاز است.
  • Relu
  • ReluN1To1
  • Relu6
  • تغییر شکل دهید
    • فقط زمانی پشتیبانی می شود که نسخه Core ML هدف 2 باشد، در هنگام هدف قرار دادن Core ML 3 پشتیبانی نمی شود.
  • ResizeBilinear
  • سافت مکس
  • تنها
  • TransposeConv
    • وزن ها باید ثابت باشند.

بازخورد

برای مشکلات، لطفاً یک مشکل GitHub با تمام جزئیات لازم برای بازتولید ایجاد کنید.

سوالات متداول

  • اگر یک گراف حاوی عملیات پشتیبانی نشده باشد، آیا CoreML از بازگشت مجدد به CPU پشتیبانی می کند؟
    • بله
  • آیا نمایندگی CoreML در شبیه ساز iOS کار می کند؟
    • بله. این کتابخانه شامل اهداف x86 و x86_64 است، بنابراین می‌تواند بر روی یک شبیه‌ساز اجرا شود، اما شما شاهد افزایش عملکرد در CPU نخواهید بود.
  • آیا نمایندگی LiteRT و CoreML از MacOS پشتیبانی می کند؟
    • LiteRT فقط روی iOS تست شده است اما MacOS تست نشده است.
  • آیا عملیات سفارشی LiteRT پشتیبانی می شود؟
    • خیر، نماینده CoreML از عملیات سفارشی پشتیبانی نمی کند و به CPU بازگشته است.

API ها