Tensorflow Lite Core ML 대리자

TensorFlow Lite Core ML 대리자를 사용하면 Core ML 프레임 워크 에서 TensorFlow Lite 모델을 실행할 수 있으므로 iOS 기기에서 모델 추론이 더 빨라집니다.

지원되는 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의 야간 릴리스에 이미 포함되어 있습니다. 핵심 ML 대리자를 사용하려면 subspec 포함하도록 TensorFlow 라이트 포드 변경 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);
      

모범 사례

Neural Engine이없는 기기에서 Core ML 대리자 사용

기본적으로 Core ML 델리게이트는 기기에 Neural Engine이있는 경우에만 생성되고 델리게이트가 생성되지 않은 경우 null 을 반환합니다. 다른 환경 (예 : 시뮬레이터)에서 Core ML 델리게이트를 실행하려면 Swift에서 델리게이트를 생성하는 동안 .all 을 옵션으로 전달하십시오. 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
      

델리게이트 생성 로직은 기기의 머신 ID (예 : iPhone11,1)를 읽어 Neural Engine 가용성을 결정합니다. 자세한 내용은 코드 를 참조하십시오. 또는 DeviceKit 과 같은 다른 라이브러리를 사용하여 자체 거부 목록 장치 세트를 구현할 수 있습니다.

이전 Core ML 버전 사용

iOS 13은 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]
  • AveragePool2D
  • Concat
    • 채널 축을 따라 연결해야합니다.
  • Conv2D
    • 가중치와 편향은 일정해야합니다.
  • DepthwiseConv2D
    • 가중치와 편향은 일정해야합니다.
  • 완전 연결 (일명 Dense 또는 InnerProduct)
    • 가중치와 편향 (있는 경우)은 일정해야합니다.
    • 단일 배치 케이스 만 지원합니다. 입력 차원은 마지막 차원을 제외하고 1이어야합니다.
  • 강인한
  • 물류 (일명 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]
  • 패드 및 PadV2
    • 4D 입력 만 지원됩니다. 패딩은 일정해야하며 H 및 W 치수에만 허용됩니다.
  • Relu
  • ReluN1To1
  • Relu6
  • 모양 변경
    • 대상 Core ML 버전이 2 인 경우에만 지원되고 Core ML 3을 대상으로하는 경우 지원되지 않습니다.
  • 크기 조정
  • SoftMax
  • Tanh
  • TransposeConv
    • 가중치는 일정해야합니다.

피드백

문제의 경우 재현하는 데 필요한 모든 세부 정보가 포함 된 GitHub 문제를 생성하세요.

자주하는 질문

  • 그래프에 지원되지 않는 작업이 포함 된 경우 CoreML 대리자가 CPU로 대체를 지원합니까?
  • CoreML 델리게이트는 iOS 시뮬레이터에서 작동합니까?
    • 예. 라이브러리에는 x86 및 x86_64 대상이 포함되어 있으므로 시뮬레이터에서 실행할 수 있지만 CPU보다 성능이 향상되지는 않습니다.
  • TensorFlow Lite 및 CoreML delegate는 MacOS를 지원하나요?
    • TensorFlow Lite는 iOS에서만 테스트되고 MacOS에서는 테스트되지 않습니다.
  • 맞춤 TF Lite 작업이 지원 되나요?
    • 아니요, CoreML 델리게이트는 사용자 지정 작업을 지원하지 않으며 CPU로 대체됩니다.

아피스