Делегат 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]
.
- Только определенные формы могут транслироваться. В макете тензора Core ML можно транслировать следующие фигуры тензора.
- AveragePool2D
- Concat
- Конкатенацию следует производить по оси канала.
- Conv2D
- Веса и смещения должны быть постоянными.
- DepthwiseConv2D
- Веса и смещения должны быть постоянными.
- Полностью подключенный (также известный как Dense или InnerProduct)
- Веса и смещение (если есть) должны быть постоянными.
- Поддерживает только единичные партии. Входные размеры должны быть равны 1, кроме последнего измерения.
- Hardswish
- Логистический (он же сигмоид)
- MaxPool2D
- MirrorPad
- Поддерживается только ввод 4D с режимом
REFLECT
. Заполнение должно быть постоянным и допускается только для размеров H и W.
- Поддерживается только ввод 4D с режимом
- Mul
- Только определенные формы могут транслироваться. В макете тензора Core ML можно транслировать следующие фигуры тензора.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Только определенные формы могут транслироваться. В макете тензора Core ML можно транслировать следующие фигуры тензора.
- 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
- Core ML делегат Swift API
- Core ML делегат C API
- Это можно использовать для кодов Objective-C. ~~~