LiteRT Core 機器學習委派功能可讓系統在 核心機器學習架構, 進而在 iOS 裝置上加快模型推論速度
支援的 iOS 版本和裝置:
- iOS 12 以上版本。在舊版 iOS 中,Core ML 委派將 會自動採用 CPU 備用選項
- 根據預設,系統只會在搭載 A12 SoC 的裝置上啟用 Core ML 委派功能 及較新版本 (iPhone Xs 及更新版本) 使用 Neural Engine 加快推論速度。 如要同時在舊版裝置上使用 Core ML 委派,請參閱 最佳做法
支援的模型
Core ML 委任目前支援浮點 (FP32 和 FP16) 模型。
在自己的模型中試用 Core ML 委派功能
LiteRT 夜間版本已包含 Core ML 代表
CocoaPods,如要使用 Core ML 委派功能,請將 LiteRT Pod 變更為
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']
Swift
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) }
Objective-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);
最佳做法
在沒有 Neural Engine 的裝置上使用 Core ML 委派功能
根據預設,只有在裝置具備 Neural 的情況下,系統才會建立 Core ML 委派
,如果委派代表未建立,則會傳回 null
。如果您想
在其他環境 (例如模擬工具) 上執行 Core ML 委派,然後傳遞 .all
設為 Swift 委派代表在 C++ (和 Objective-C) 上,
傳遞 TfLiteCoreMlDelegateAllDevices
。以下範例說明如何執行此操作:
Swift
var options = CoreMLDelegate.Options() options.enabledDevices = .all let coreMLDelegate = CoreMLDelegate(options: options)! let interpreter = try Interpreter(modelPath: modelPath, delegates: [coreMLDelegate])
Objective-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 委派,您還是可以使用 金屬委派:可取得 效能優勢以下範例說明如何執行此操作:
Swift
var delegate = CoreMLDelegate() if delegate == nil { delegate = MetalDelegate() // Add Metal delegate options if necessary. } let interpreter = try Interpreter(modelPath: modelPath, delegates: [delegate!])
Objective-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
委派建立邏輯會讀取裝置的機器 ID (例如 iPhone11、1), 取決於神經引擎的可用性詳情請參閱 程式碼 ,掌握更多詳細資訊。或者,您也可以導入自己的拒絕清單 偵測應用程式、使用 DeviceKit.
使用舊版 Core ML
雖然 iOS 13 支援 Core ML 3,但
與 Core ML 2 模型規格的轉換相同目標轉換版本為
預設為最新版本,但您可以變更這項設定
coreMLVersion
(在 Swift,C API 中的 coreml_version
) 委派給下列使用者:
如果沒有啟用物件版本管理功能
根據預設,新版本一律會覆寫舊版本
支援的作業
Core ML 代表支援下列作業。
- 新增
- 只有特定形狀可以播送。在 Core ML Tensor 配置中
下列張量形狀可以播送
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
。
- 只有特定形狀可以播送。在 Core ML Tensor 配置中
下列張量形狀可以播送
- 平均集區 2D
- 康卡
- 請沿著管道軸進行串連,
- 轉換 2D
- 權重和偏誤應維持不變。
- 深度轉換 2D
- 權重和偏誤應維持不變。
- 完全連結 (又稱 Dense 或 InnerProduct)
- 權重和偏誤 (如有) 應是常數。
- 僅支援單一批次類型。輸入維度應為 1,但以下除外: 最後一個維度
- 硬質
- 物流 (又稱 Sigmoid)
- MaxPool2D
- MirrorPad
- 僅支援使用
REFLECT
模式的 4D 輸入。邊框間距應為 常數,而且只適用於 H 和 W 尺寸。
- 僅支援使用
- 穆爾
- 只有特定形狀可以播送。在 Core ML Tensor 配置中
下列張量形狀可以播送
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
。
- 只有特定形狀可以播送。在 Core ML Tensor 配置中
下列張量形狀可以播送
- Pad and PadV2
- 系統僅支援 4D 輸入。邊框間距必須是常數,且 H 和 W 尺寸都一樣
- Relu
- ReluN1To1
- Relu6
- 重新塑形
- 只有在目標核心機器學習版本為 2 時,系統才會支援。此外, 針對 Core ML 3
- ResizeBilinear
- SoftMax
- 坦赫
- TransposeConv
- 權重必須固定。
意見回饋
如有問題,請建立 GitHub 並附上所有重現問題的必要詳細資料。
常見問題
- 如果圖表含有不支援的功能,CoreML 是否會委派支援使用到 CPU
糟糕?
- 是
- CoreML 委派功能可在 iOS 模擬器上使用嗎?
- 可以。程式庫包含 x86 和 x86_64 目標,可在 模擬工具,但無法透過 CPU 提升效能。
- LiteRT 和 CoreML 委派功能是否支援 MacOS?
- LiteRT 僅針對 iOS 裝置進行測試,不支援 MacOS。
- 系統是否支援自訂 LiteRT 運算?
- 否,CoreML 委派不支援自訂作業,且會改回使用 也就是 CPU