Делегат LiteRT Core ML позволяет запускать модели LiteRT в платформе 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 уже включен в ночной выпуск LiteRT CocoaPods. Чтобы использовать делегат Core ML, измените модуль LiteRT, включив в Podfile
подспецификацию CoreML
.
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
С
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]
.
- Транслировать можно только определенные формы. В тензорном макете Core ML доступны следующие формы тензоров.
- Средний пул2D
- Конкат
- Объединение должно выполняться вдоль оси канала.
- Конв2D
- Веса и смещение должны быть постоянными.
- ГлубинаConv2D
- Веса и смещение должны быть постоянными.
- FullyConnected (он же Dense или InnerProduct)
- Веса и смещение (если они присутствуют) должны быть постоянными.
- Поддерживается только однопакетный случай. Входные размеры должны быть равны 1, за исключением последнего измерения.
- Хардсвиш
- Логистический (он же сигмовидный)
- Макспул2D
- ЗеркалоPad
- Поддерживается только вход 4D в режиме
REFLECT
. Заполнение должно быть постоянным и допускается только для размеров H и W.
- Поддерживается только вход 4D в режиме
- Мул
- Транслировать можно только определенные формы. В тензорном макете Core ML доступны следующие формы тензоров.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Транслировать можно только определенные формы. В тензорном макете Core ML доступны следующие формы тензоров.
- Пад и ПадВ2
- Поддерживается только вход 4D. Заполнение должно быть постоянным и допускается только для размеров H и W.
- Релу
- РелуН1То1
- Релу6
- Изменить форму
- Поддерживается только в том случае, если целевая версия Core ML равна 2, и не поддерживается при использовании Core ML 3.
- Изменение размераБилинейный
- СофтМакс
- Тань
- Транспонирование конв.
- Вес должен быть постоянным.
Обратная связь
В случае возникновения проблем создайте задачу на GitHub со всеми необходимыми сведениями для воспроизведения.
Часто задаваемые вопросы
- Поддерживает ли делегат CoreML возврат к ЦП, если граф содержит неподдерживаемые операции?
- Да
- Работает ли делегат CoreML в симуляторе iOS?
- Да. Библиотека включает в себя целевые устройства x86 и x86_64, поэтому ее можно запускать на симуляторе, но прироста производительности по сравнению с ЦП вы не увидите.
- Поддерживает ли делегат LiteRT и CoreML MacOS?
- LiteRT тестируется только на iOS, но не на MacOS.
- Поддерживаются ли пользовательские операции LiteRT?
- Нет, делегат CoreML не поддерживает пользовательские операции, и они будут использовать резервный процессор.