Помогают защитить Большой Барьерный Риф с TensorFlow на Kaggle Присоединяйтесь вызов

Делегат Tensorflow Lite Core ML

Делегат TensorFlow Lite Core ML позволяет запускать модели TensorFlow Lite на платформе Core ML , что приводит к более быстрому выводу модели на устройствах iOS.

Поддерживаемые версии и устройства iOS:

  • iOS 12 и новее. В более старых версиях iOS делегат Core ML автоматически переключается на CPU.
  • По умолчанию делегат 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)
    }
      

Цель-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 на устройствах без Neural Engine

По умолчанию делегат Core ML будет создан только в том случае, если на устройстве есть Neural Engine, и вернет 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])
      

Цель-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 для повышения производительности. В следующем примере показано, как это сделать:

Быстрый

    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
      

C

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

Логика создания делегата считывает идентификатор машины устройства (например, iPhone11,1), чтобы определить доступность Neural Engine. Смотрите код для более подробной информации. В качестве альтернативы вы можете реализовать свой собственный набор устройств 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] .
  • AveragePool2D
  • Concat
    • Конкатенацию следует производить по оси канала.
  • Conv2D
    • Веса и смещения должны быть постоянными.
  • DepthwiseConv2D
    • Веса и смещения должны быть постоянными.
  • Полностью подключенный (также известный как Dense или InnerProduct)
    • Веса и смещение (если есть) должны быть постоянными.
    • Поддерживает только единичные партии. Входные размеры должны быть равны 1, кроме последнего измерения.
  • Hardswish
  • Логистический (он же сигмоид)
  • MaxPool2D
  • MirrorPad
    • Поддерживается только ввод 4D с режимом REFLECT . Заполнение должно быть постоянным и допускается только для размеров H и W.
  • Mul
    • Только определенные формы могут транслироваться. В макете тензора Core ML можно транслировать следующие фигуры тензора. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • Pad и PadV2
    • Поддерживается только ввод 4D. Заполнение должно быть постоянным и допускается только для размеров H и W.
  • Relu
  • ReluN1To1
  • Relu6
  • Изменить форму
    • Поддерживается, только если целевая версия Core ML равна 2, не поддерживается при ориентации на Core ML 3.
  • Изменить размер: Билинейный
  • SoftMax
  • Тань
  • TransposeConv
    • Вес должен быть постоянным.

Обратная связь

При возникновении проблем создайте проблему на GitHub со всеми необходимыми деталями для воспроизведения.

Часто задаваемые вопросы

  • Поддерживает ли делегат CoreML возврат к ЦП, если график содержит неподдерживаемые операции?
    • да
  • Работает ли делегат CoreML в iOS Simulator?
    • Да. Библиотека включает в себя цели x86 и x86_64, поэтому ее можно запускать на симуляторе, но вы не увидите повышения производительности по сравнению с процессором.
  • Поддерживает ли TensorFlow Lite и CoreML делегат MacOS?
    • TensorFlow Lite тестируется только на iOS, но не на MacOS.
  • Поддерживаются ли пользовательские операции TF Lite?
    • Нет, делегат CoreML не поддерживает настраиваемые операции, и они вернутся к ЦП.

API