TensorFlow Lite Core ML 대리자를 사용하면 Core ML 프레임워크에서 TensorFlow Lite 모델을 실행할 수 있으므로 iOS 기기에서 모델 추론이 더 빨라집니다.
참고: 이 대리자는 실험 (베타) 단계입니다. TensorFlow Lite 2.4.0 및 최신 야간 릴리스에서 사용할 수 있습니다.
참고: Core ML 대리자는 Core ML 버전 2 이상을 지원합니다.
지원되는 iOS 버전 및 장치:
- iOS 12 이상. 이전 iOS 버전에서 Core ML 대리자는 자동으로 CPU로 대체됩니다.
- 기본적으로 Core ML 대리자는 A12 SoC 이상 (iPhone Xs 이상)이 있는 기기에서만 활성화되어 더 빠른 추론을 위해 Neural Engine을 사용합니다. Core ML 대리자를 이전 기기에서도 사용하려면 모범 사례를 참조하세요.
지원되는 모델
Core ML 대리자는 현재 float(FP32 및 FP16) 모델을 지원합니다.
자신의 모델에서 Core ML 대리자 시도
Core ML 대리자는 TensorFlow lite CocoaPods의 야간 릴리스에 이미 포함되어 있습니다. Core ML 대리자를 사용하려면 Podfile
에 하위 사양 CoreML
을 포함하도록 TensorFlow lite 포드를 변경합니다.
참고: Objective-C API 대신 C API를 사용하고자 하는 경우, TensorFlowLiteC/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']
참고 : Core ML 대리자는 Objective-C 코드에 C API를 사용할 수도 있습니다. TensorFlow Lite 2.4.0 릴리스 이전에는 이것이 유일한 옵션이었습니다.
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 대리자는 기기에 Neural Engine이 있는 경우에만 생성되고 대리자가 생성되지 않은 경우 null
을 반환합니다. 다른 환경(예: 시뮬레이터)에서 Core ML 대리자를 실행하려면 Swift에서 대리자를 생성하는 동안 .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
Metal(GPU) 대리자를 폴백으로 사용하기
Core ML 대리자가 생성되지 않은 경우에도 여전히 Metal 대리자를 사용하여 성능 이점을 얻을 수 있습니다. 다음 예에서는 이를 수행하는 방법을 보여줍니다.
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 2 모델 사양으로 변환하면 모델이 더 잘 동작할 수 있습니다. 대상 변환 버전은 기본적으로 최신 버전으로 설정되어 있지만 대리자 옵션에서 coreMLVersion
(Swift에서는 C API의 coreml_version
)을 이전 버전으로 설정하여 변경할 수 있습니다.
지원되는 연산
Core ML 대리자는 다음 연산을 지원합니다.
- Add
- 특정 형상만 브로드캐스팅할 수 있습니다. Core ML 텐서 레이아웃에서 다음 텐서 형상을 브로드캐스팅할 수 있습니다.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- 특정 형상만 브로드캐스팅할 수 있습니다. Core ML 텐서 레이아웃에서 다음 텐서 형상을 브로드캐스팅할 수 있습니다.
- AveragePool2D
- Concat
- 채널 축을 따라 연결해야 합니다.
- Conv2D
- 가중치와 바이어스는 일정해야 합니다.
- DepthwiseConv2D
- 가중치와 바이어스는 일정해야 합니다.
- FullyConnected(일명 Dense 또는 InnerProduct)
- 가중치와 바이어스(있는 경우)는 일정해야 합니다.
- 단일 배치 케이스만 지원합니다. 입력 차원은 마지막 차원을 제외하고 1이어야 합니다.
- Hardswish
- Logistic(일명 Sigmoid)
- MaxPool2D
- MirrorPad
REFLECT
모드의 4D 입력만 지원됩니다. 패딩은 일정해야 하며 H 및 W 차원에만 허용됩니다.
- 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
- Reshape
- 대상 Core ML 버전이 2인 경우에만 지원되고 Core ML 3을 대상으로 하는 경우 지원되지 않습니다.
- ResizeBilinear
- SoftMax
- Tanh
- TransposeConv
- 가중치는 일정해야 합니다.
피드백
문제가 발생한 경우 재현하는 데 필요한 모든 세부 정보가 포함된 GitHub 문제를 만드세요.
자주하는 질문
- 그래프에 지원되지 않는 연산이 포함된 경우 CoreML 대리자가 CPU로 폴백을 지원합니까?
- 예
- CoreML 대리자는 iOS 시뮬레이터에서 동작합니까?
- 예. 라이브러리에는 x86 및 x86_64 대상이 포함되어 있으므로 시뮬레이터에서 실행할 수 있지만 CPU에 비해 성능이 향상되지는 않습니다.
- TensorFlow Lite 및 CoreML 대리자는 MacOS를 지원하나요?
- TensorFlow Lite는 iOS에서만 테스트되고 MacOS에서는 테스트되지 않습니다.
- 사용자 정의 TF Lite 연산이 지원되나요?
- 아니요, CoreML 대리자는 사용자 정의 연산을 지원하지 않으며 CPU로 대체됩니다.
API
- Core ML delegate Swift API
- Core ML delegate C API
- Objective-C 코드에 사용될 수 있습니다. ~~~