Делегат Tensorflow Lite Core ML

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

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

  • iOS 12 и выше. В более старых версиях iOS делегат Core ML автоматически переключается на ЦП.
  • По умолчанию делегат Core ML будет включен только на устройствах с SoC A12 и более поздних версий (iPhone Xs и более поздние версии), чтобы использовать Neural Engine для более быстрого логического вывода. Если вы хотите использовать делегата Core ML также на старых устройствах, ознакомьтесь с рекомендациями .

Поддерживаемые модели

Делегат Core ML в настоящее время поддерживает модели с плавающей запятой (FP32 и FP16).

Пробуем делегата Core ML на собственной модели

Делегат Core ML уже включен в ночной выпуск TensorFlow lite CocoaPods. Чтобы использовать делегата Core ML, измените свой модуль CoreML lite, включив в свой 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 ...
  

С (до 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
  

С

    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
      

С

    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. См. код для более подробной информации. Кроме того, вы можете реализовать свой собственный набор устройств из черного списка, используя другие библиотеки, такие как 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] .
  • Средний пул2D
  • Конкат
    • Конкатенация должна выполняться вдоль оси канала.
  • Conv2D
    • Веса и смещения должны быть постоянными.
  • ГлубинаConv2D
    • Веса и смещения должны быть постоянными.
  • FullyConnected (он же Dense или InnerProduct)
    • Веса и смещения (если они есть) должны быть постоянными.
    • Поддерживает только однопартийный случай. Входные размеры должны быть равны 1, кроме последнего измерения.
  • Хардсвиш
  • Логистика (он же Sigmoid)
  • Макспул2D
  • Зеркальная панель
    • Поддерживается только ввод 4D в режиме REFLECT . Заполнение должно быть постоянным и допустимо только для размеров H и W.
  • Мул
    • Только определенные формы транслируются. В макете тензора Core ML можно транслировать следующие формы тензора. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • Pad и PadV2
    • Поддерживается только ввод 4D. Заполнение должно быть постоянным и допустимо только для размеров H и W.
  • Релу
  • ReluN1To1
  • Relu6
  • Изменить форму
    • Поддерживается только при целевой версии Core ML 2, не поддерживается при ориентации на Core ML 3.
  • Изменить размерБилинейный
  • СофтМакс
  • Тан
  • TransposeConv
    • Веса должны быть постоянными.

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

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

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

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

API