LiteRT Core ML delegesi

LiteRT Core ML delegesi, LiteRT modellerinin çalıştırılmasını sağlar. Temel ML çerçevesi iOS cihazlarda model çıkarımı daha hızlı olur.

Desteklenen iOS sürümleri ve cihazlar:

  • iOS 12 ve sonraki sürümler. Daha eski iOS sürümlerinde Core ML delegesi şu işlemleri gerçekleştirecektir: otomatik olarak CPU'ya geri döner.
  • Varsayılan olarak, Core ML yetki verilmiş olması yalnızca A12 SoC'ye sahip cihazlarda etkinleştirilir. ve sonraki sürümleri (iPhone Xs ve sonraki modeller) daha hızlı çıkarım için Nöral Engine'i kullanabilir. Core ML temsilcinizi eski cihazlarda da kullanmak istiyorsanız lütfen şu makaleye göz atın: en iyi uygulamalar

Desteklenen modeller

Temel makine öğrenimi temsilcisi şu anda kayan (FP32 ve FP16) modelleri desteklemektedir.

Core ML delegesini kendi modelinizde deneme

Temel makine öğrenimi delegesi zaten LiteRT'in gecelik sürümünde yer alıyor CocoaPods'a gidin. Core ML yetkisini kullanmak için LiteRT kapsülünüzü şunu içerecek şekilde değiştirin: Podfile içindeki CoreML alt spesifikasyonu.

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']

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'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

Nöral Engine olmayan cihazlarda Core ML yetkisini kullanma

Varsayılan olarak Core ML yetki verilmiş kişi yalnızca cihazda nöral uygulama varsa oluşturulur. Arama motoru, yetki verilmiş kullanıcı oluşturulmazsa null değerini döndürür. Şunu istiyorsanız: diğer ortamlarda (ör. simülatör) Core ML delegenizi çalıştırma ve .all ayarını geçme seçeneğini kullanabilirsiniz. C++ (ve Objective-C) üzerinde ise TfLiteCoreMlDelegateAllDevices başarılı. Aşağıdaki örnekte bunun nasıl yapılacağı gösterilmektedir:

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) yetkilendirmesini yedek olarak kullanma.

Core ML delegesi oluşturulmadığında alternatif olarak şunu da kullanabilirsiniz: Metal delegesi: avantajları ön plana çıkarırız. Aşağıdaki örnekte bunun nasıl yapılacağı gösterilmektedir:

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
      

Yetki verilen oluşturma mantığı, cihazın makine kimliğini (ör.iPhone11,1) okur. kullanılabilirliğini belirleyecek. Bkz. kod inceleyebilirsiniz. Alternatif olarak kendi ret listesi grubunuzu uygulayabilirsiniz gibi diğer kitaplıkları kullanan cihazlar DeviceKit.

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

iOS 13, Core ML 3'ü desteklese de Core ML 2 model spesifikasyonuyla dönüştürülmüştür. Hedef dönüşüm sürümü: varsayılan olarak en son sürüme ayarlanır, ancak coreMLVersion (Swift'te, C API'de coreml_version) eski sürümü kullanıyor.

Desteklenen operasyonlar

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

  • Ekle
    • Yalnızca belirli şekiller yayınlanabilir. Core ML tensörü düzeninde tensor şekilleri yayınlanabilir. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • OrtalamaHavuz2D
  • Concat
    • Birleştirme işlemi kanal ekseni boyunca yapılmalıdır.
  • Dönş2D
    • Ağırlıklar ve ağırlık sabit olmalıdır.
  • DepthwardDönş2D
    • Ağırlıklar ve ağırlık sabit olmalıdır.
  • FullyConnected (Yoğun veya InnerProduct olarak da bilinir)
    • Ağırlıklar ve ağırlık (varsa) sabit olmalıdır.
    • Yalnızca tekli toplu kılıfları destekler. Giriş boyutları 1 olmalıdır, ancak şunlar hariçtir: son boyutu seçin.
  • Sert
  • Lojistik (Sigmoid olarak da bilinir)
  • Maks. havuz 2D
  • MirrorPad
    • Yalnızca REFLECT modunda 4D giriş desteklenir. Dolgu sabittir ve yalnızca Y ve W boyutlarında izin verilir.
  • Mul
    • Yalnızca belirli şekiller yayınlanabilir. Core ML tensörü düzeninde tensor şekilleri yayınlanabilir. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • Pad ve PadV2
    • Yalnızca 4D giriş desteklenir. Dolgu sabit olmalıdır ve yalnızca Y ve W boyutlarında izin verilir.
  • Relu
  • ReluN1To1
  • Relu6
  • Yeniden şekillendir
    • Yalnızca hedef Core ML sürümü 2 olduğunda desteklenir, Core ML 3'ü hedefler.
  • ResizeBilinear
  • SoftMax
  • Tanh
  • TransposeConv
    • Ağırlıklar sabit olmalıdır.

Geri bildirim

Sorunlar için lütfen bir GitHub gerekli tüm ayrıntıları dahil edin.

SSS

  • Bir grafikte desteklenmeyen bir CPU'ya izin veriliyorsa CoreML de CPU'ya yedek uygulamayı destekliyor mu? Peki ya?
    • Evet
  • CoreML delegesi iOS Simülatöründe çalışır mı?
    • Evet. Kitaplıkta çalıştırılabilmesi için x86 ve x86_64 hedefleri içerir ancak CPU üzerinde performans artışı görmezsiniz.
  • LiteRT ve CoreML delegesi MacOS'i destekliyor mu?
    • LiteRT yalnızca iOS'te test edilir, MacOS'te test edilmez.
  • Özel LiteRT işlemleri destekleniyor mu?
    • Hayır, CoreML temsilcisi özel işlemleri desteklemez ve CPU.

API'ler