LiteRT Core ML デリゲートを使用すると、Google Cloud 上で LiteRT モデルを実行できます。 Core ML フレームワーク: iOS デバイスでのモデルの推論が高速になります。
サポートされている iOS のバージョンとデバイス:
- iOS 12 以降。古い iOS バージョンでは、Core ML デリゲートは 自動的にフォールバックされます。
- デフォルトでは、Core ML デリゲートは A12 SoC を搭載したデバイスでのみ有効になります。 Neural Engine を使用して推論を高速化できます。 古いデバイスでも Core ML デリゲートを使用する場合は、 ベスト プラクティス
サポートされているモデル
現在、Core ML デリゲートは浮動小数点数(FP32 と FP16)モデルをサポートしています。
独自のモデルで Core ML デリゲートを試す
Core ML デリゲートは LiteRT のナイトリー リリースにすでに含まれている
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 デリゲートを使用する
デフォルトでは、Core ML デリゲートは、デバイスにニューラル ネットワーク
委任が作成されていない場合は null
が返されます。目標
他の環境(シミュレータなど)で Core ML デリゲートを実行する場合は、.all
を渡します。
を使用します。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
フォールバックとしてメタル(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)を読み取り、 Neural Engine の可用性を判断します。詳しくは、 コード をご覧ください。または、独自の拒否リストのセットを実装することもできます。 など、他のライブラリを使用するデバイス DeviceKit.
古い Core ML バージョンの使用
iOS 13 は Core ML 3 をサポートしていますが、Core ML 3 が適しているのは
Core ML 2 モデル仕様で変換されたモデルです。ターゲット コンバージョンのバージョン:
デフォルトで最新バージョンに設定されますが、この設定は
coreMLVersion
(Swift では、C API では coreml_version
)
古いバージョンです。
サポートされているオペレーション
Core ML デリゲートでは、次の演算がサポートされています。
- 以下を追加
- ブロードキャストできるのは特定のシェイプのみです。Core ML のテンソル レイアウトでは、
次のテンソル形状はブロードキャスト可能です。
[B, C, H, W]
、[B, C, 1, 1]
、[B, 1, H, W]
、[B, 1, 1, 1]
。
- ブロードキャストできるのは特定のシェイプのみです。Core ML のテンソル レイアウトでは、
次のテンソル形状はブロードキャスト可能です。
- 平均プール 2 日
- 連結
<ph type="x-smartling-placeholder">
- </ph>
- 連結はチャネルの軸に沿って行う必要があります。
- コンバージョン(2 日間)
<ph type="x-smartling-placeholder">
- </ph>
- 重みとバイアスは一定である必要があります。
- DepthwiseConv2D
<ph type="x-smartling-placeholder">
- </ph>
- 重みとバイアスは一定である必要があります。
- FullyConnected(別名 Dense または InnerProduct)
<ph type="x-smartling-placeholder">
- </ph>
- 重みとバイアス(存在する場合)は一定である必要があります。
- 単一バッチのケースのみをサポートします。入力ディメンションは 1 にしてください。例外 作成します。
- ハードスウィッシュ
- ロジスティック(別名 Sigmoid)
- 最大プール 2D
- MirrorPad
<ph type="x-smartling-placeholder">
- </ph>
REFLECT
モードの 4D 入力のみがサポートされています。パディングは 高さと幅の寸法にのみ使用できます。
- ムル
<ph type="x-smartling-placeholder">
- </ph>
- ブロードキャストできるのは特定のシェイプのみです。Core ML のテンソル レイアウトでは、
次のテンソル形状はブロードキャスト可能です。
[B, C, H, W]
、[B, C, 1, 1]
、[B, 1, H, W]
、[B, 1, 1, 1]
。
- ブロードキャストできるのは特定のシェイプのみです。Core ML のテンソル レイアウトでは、
次のテンソル形状はブロードキャスト可能です。
- Pad と PadV2
<ph type="x-smartling-placeholder">
- </ph>
- 4D 入力のみがサポートされています。パディングは一定で、 横幅と縦幅は指定できません
- Relu
- ReluN1To1
- Relu6
- 形を変更
<ph type="x-smartling-placeholder">
- </ph>
- 対象の Core ML バージョンが 2 の場合にのみサポートされ、次の場合はサポートされない Core ML 3 がターゲットになります。
- ResizeBilinear
- Softmax
- タン
- TransposeConv
<ph type="x-smartling-placeholder">
- </ph>
- 重みは一定である必要があります。
フィードバック
問題がある場合は、 GitHub 報告します。
よくある質問
- サポートされていない内容がグラフに含まれている場合、CoreML デリゲートは CPU へのフォールバックをサポートしますか?
どうでしょうか。
- ○
- iOS Simulator で CoreML デリゲートは機能しますか?
- はい。ライブラリには x86 および x86_64 ターゲットが含まれているため、 ただし、CPU によるパフォーマンスの向上は見られません。
- LiteRT と CoreML デリゲートは MacOS をサポートしていますか?
- LiteRT は iOS でのみテストされ、macOS ではテストされません。
- カスタム LiteRT オペレーションはサポートされていますか?
- いいえ。CoreML デリゲートはカスタム演算をサポートしておらず、 できます。