Tensorflow Lite Core ML temsilcisi

TensorFlow Lite Core ML temsilcisi, TensorFlow Lite modellerinin Core ML çerçevesinde çalıştırılmasına olanak tanır, bu da iOS cihazlarda daha hızlı model çıkarımına olanak sağlar.

Desteklenen iOS sürümleri ve cihazlar:

  • iOS 12 ve üzeri. Eski iOS sürümlerinde Core ML temsilcisi otomatik olarak CPU'ya geri dönecektir.
  • Varsayılan olarak Core ML temsilcisi, daha hızlı çıkarım için Neural Engine'i kullanmak üzere yalnızca A12 SoC ve sonraki sürümlere (iPhone Xs ve sonraki sürümler) sahip cihazlarda etkinleştirilecektir. Core ML temsilcisini eski cihazlarda da kullanmak istiyorsanız lütfen en iyi uygulamalara bakın.

Desteklenen modeller

Core ML temsilcisi şu anda kayan (FP32 ve FP16) modelleri desteklemektedir.

Core ML temsilcisini kendi modelinizde denemek

Core ML temsilcisi, TensorFlow lite CocoaPod'ların gecelik sürümüne zaten dahil edilmiştir. Core ML temsilcisini kullanmak için TensorFlow lite bölmenizi, CoreML alt spesifikasyonunu Podfile dosyanıza dahil edecek şekilde değiştirin.

target 'YourProjectName'
  pod 'TensorFlowLiteSwift/CoreML', '~> 2.4.0'  # Or TensorFlowLiteObjC/CoreML

VEYA

# Particularily useful when you also want to include 'Metal' subspec.
target 'YourProjectName'
  pod 'TensorFlowLiteSwift', '~> 2.4.0', :subspecs => ['CoreML']

Süratli

    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)
    }
  

Amaç-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'a kadar)

    #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);
      

En iyi uygulamalar

Neural Engine olmayan cihazlarda Core ML temsilcisini kullanma

Varsayılan olarak, Core ML temsilcisi yalnızca cihazda Neural Engine varsa oluşturulacak ve temsilci oluşturulmazsa null değerini döndürecektir. Core ML temsilcisini diğer ortamlarda (örneğin, simülatör) çalıştırmak istiyorsanız, Swift'de temsilci oluştururken seçenek olarak .all iletin. C++'da (ve Objective-C) TfLiteCoreMlDelegateAllDevices iletebilirsiniz. Aşağıdaki örnek bunun nasıl yapılacağını gösterir:

Süratli

    var options = CoreMLDelegate.Options()
    options.enabledDevices = .all
    let coreMLDelegate = CoreMLDelegate(options: options)!
    let interpreter = try Interpreter(modelPath: modelPath,
                                      delegates: [coreMLDelegate])
      

Amaç-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
      

Geri dönüş olarak Metal(GPU) temsilcisini kullanma.

Core ML temsilcisi oluşturulmadığında alternatif olarak performans avantajlarından yararlanmak için Metal temsilcisini kullanmaya devam edebilirsiniz. Aşağıdaki örnek bunun nasıl yapılacağını gösterir:

Süratli

    var delegate = CoreMLDelegate()
    if delegate == nil {
      delegate = MetalDelegate()  // Add Metal delegate options if necessary.
    }

    let interpreter = try Interpreter(modelPath: modelPath,
                                      delegates: [delegate!])
  

Amaç-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
      

Temsilci oluşturma mantığı, Neural Engine kullanılabilirliğini belirlemek için cihazın makine kimliğini (örn. iPhone11,1) okur. Daha fazla ayrıntı için koda bakın. Alternatif olarak, DeviceKit gibi diğer kitaplıkları kullanarak kendi red listesi cihazlarınızı uygulayabilirsiniz.

Eski Core ML sürümünü kullanma

iOS 13, Core ML 3'ü desteklese de model, Core ML 2 model spesifikasyonuyla dönüştürüldüğünde daha iyi çalışabilir. Hedef dönüşüm sürümü varsayılan olarak en son sürüme ayarlanmıştır, ancak bunu, temsilci seçeneğindeki coreMLVersion (Swift'te, C API'de coreml_version ) eski sürüme ayarlayarak değiştirebilirsiniz.

Desteklenen işlemler

Aşağıdaki işlemler Core ML temsilcisi tarafından desteklenir.

  • Eklemek
    • Yalnızca belirli şekiller yayınlanabilir. Core ML tensör düzeninde aşağıdaki tensör şekilleri yayınlanabilir. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • OrtalamaHavuz2D
  • birleştir
    • Birleştirme kanal ekseni boyunca yapılmalıdır.
  • Dönüşüm2D
    • Ağırlıklar ve sapma sabit olmalıdır.
  • DepthwiseConv2D
    • Ağırlıklar ve sapma sabit olmalıdır.
  • Tamamen Bağlantılı (diğer adıyla Yoğun veya İç Ürün)
    • Ağırlıklar ve önyargı (varsa) sabit olmalıdır.
    • Yalnızca tek partili kasayı destekler. Giriş boyutları son boyut hariç 1 olmalıdır.
  • Sert Dilek
  • Lojistik (aka Sigmoid)
  • MaxPool2D
  • AynaPad
    • Yalnızca REFLECT modlu 4D giriş desteklenir. Dolgu sabit olmalıdır ve yalnızca Y ve G boyutları için izin verilir.
  • Mul
    • Yalnızca belirli şekiller yayınlanabilir. Core ML tensör düzeninde aşağıdaki tensör şekilleri yayınlanabilir. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • Ped ve PadV2
    • Yalnızca 4D girişi desteklenir. Dolgu sabit olmalıdır ve yalnızca Y ve G boyutları için izin verilir.
  • Relu
  • ReluN1To1
  • Relu6
  • Yeniden şekillendir
    • Yalnızca hedef Core ML sürümü 2 olduğunda desteklenir, Core ML 3 hedeflenirken desteklenmez.
  • Yeniden BoyutlandırÇift Doğrusal
  • SoftMax
  • Tanh
  • TransposeConv
    • Ağırlıklar sabit olmalıdır.

Geri bildirim

Sorunlar için lütfen çoğaltmak için gerekli tüm ayrıntıları içeren bir GitHub sorunu oluşturun.

SSS

  • Bir grafik desteklenmeyen işlemler içeriyorsa CoreML temsilcisi CPU'ya geri dönüşü destekliyor mu?
    • Evet
  • CoreML temsilcisi iOS Simulator'da çalışıyor mu?
    • Evet. Kitaplık, bir simülatörde çalışabilmesi için x86 ve x86_64 hedeflerini içerir, ancak CPU üzerinde performans artışı görmezsiniz.
  • TensorFlow Lite ve CoreML delegesi MacOS'u destekliyor mu?
    • TensorFlow Lite yalnızca iOS'ta test edilmiştir ancak MacOS'ta test edilmemiştir.
  • Özel TF Lite işlemleri destekleniyor mu?
    • Hayır, CoreML temsilcisi özel işlemleri desteklemez ve CPU'ya geri dönecektir.

API'ler