Tensorflow Lite Core ML temsilcisi

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

Desteklenen iOS sürümleri ve cihazlar:

  • iOS 12 ve sonraki sürümler. Eski iOS sürümlerinde, Core ML yetkisi otomatik olarak CPU'ya geri döner.
  • Varsayılan olarak, daha hızlı çıkarım için Neural Engine'i kullanmak amacıyla Core ML yetkilendirme yalnızca A12 SoC ve sonraki sürümlere sahip cihazlarda (iPhone Xs ve sonraki modeller) etkinleştirilir. Core ML delegate'i eski cihazlarda da kullanmak istiyorsanız lütfen en iyi uygulamalar bölümüne bakın

Desteklenen modeller

Core ML temsilcisi şu anda float (FP32 ve FP16) modellerini desteklemektedir.

Core ML delegesini kendi modelinizde deneme

Core ML temsilcisi, TensorFlow lite CocoaPods'un gecelik sürümüne zaten dahil edilmiştir. Core ML temsilciliğini kullanmak için TensorFlow lite kapsülünüzü, Podfile içindeki CoreML alt spesifikasyonunu içerecek ş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']

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

Neural Engine bulunmayan cihazlarda Core ML delege'ı kullanma

Varsayılan olarak, Core ML yetkilisi yalnızca cihazda Neural Engine varsa oluşturulur ve yetki verilmiş kullanıcı oluşturulmazsa null değerini döndürür. Diğer ortamlarda (örneğin, simülatör) Core ML delegate'i çalıştırmak istiyorsanız Swift'te yetki oluştururken seçenek olarak .all değerini geçirin. C++'ta (ve Objective-C) TfLiteCoreMlDelegateAllDevices hatasını geçebilirsiniz. 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
      

Yedek olarak Metal(GPU) delege kullanılıyor.

Core ML yetkilisi oluşturulmadığında, alternatif olarak performans avantajlarından yararlanmak için Metal delegate'i kullanabilirsiniz. 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
      

Yetkili oluşturma mantığı, Neural Engine kullanılabilirliğini belirlemek için cihazın makine kimliğini (ör. iPhone11,1) okur. Daha fazla bilgi için kodu inceleyin. Alternatif olarak, DeviceKit gibi diğer kitaplıkları kullanarak kendi ret listesi cihaz grubunuzu uygulayabilirsiniz.

Eski Core ML sürümünü kullanıyorsanız

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 ayarlanır ancak yetki verme seçeneğindeki coreMLVersion değerini (Swift'te, C API'de coreml_version) daha eski bir sürüm olarak ayarlayarak bunu değiştirebilirsiniz.

Desteklenen operasyonlar

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

  • Ekle
    • 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].
  • OrtalamaHavuz 2 Gün
  • Concat
    • Birleştirme işlemi, kanal ekseni boyunca yapılmalıdır.
  • Dönş2D
    • Ağırlıklar ve önyargı sabit olmalıdır.
  • DepthwiseConv2D
    • Ağırlıklar ve önyargı sabit olmalıdır.
  • Tam Bağlantı (Yoğun veya InnerProduct olarak da bilinir)
    • Ağırlıklar ve sapma (varsa) sabit olmalıdır.
    • Yalnızca tekli toplu kılıfı destekler. Son boyut hariç, giriş boyutları 1 olmalıdır.
  • Sert
  • Lojistik (sigmoid olarak da bilinir)
  • MaksHavuz2D
  • MirrorPad
    • Yalnızca REFLECT moduyla 4D giriş desteklenir. Dolgu sabit olmalıdır ve yalnızca H ve W boyutları için kullanılabilir.
  • Çar
    • 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ş desteklenir. Dolgu sabit olmalıdır ve yalnızca Y ve W boyutları için izin verilir.
  • Relu Dili
  • ReluN1To1
  • Relu6
  • Şekillendirin
    • Yalnızca hedef Core ML sürümü 2 olduğunda desteklenir, Core ML 3 hedeflenirken desteklenmez.
  • ResizeBilinear
  • SoftMax
  • Tan
  • TransposeConv
    • Ağırlıklar sabit olmalıdır.

Geri bildirim

Sorunlar için lütfen GitHub sorunlarını yeniden oluşturup gerekli tüm ayrıntıları içeren bir sorun oluşturun.

SSS

  • Bir grafik desteklenmeyen işlemler içeriyorsa CoreML temsilcisi CPU'ya yedekleri destekler mi?
    • Evet
  • CoreML delegesi iOS Simülatörü'nde çalışır mı?
    • Evet. Kitaplık x86 ve x86_64 hedefleri içerdiğinden simülatörde çalışabilir ancak CPU üzerinde performans artışı olmaz.
  • TensorFlow Lite ve CoreML yetkilisi MacOS'i destekliyor mu?
    • TensorFlow Lite yalnızca iOS'ta test edilir, MacOS'te test edilmez.
  • Özel TF Lite işlemleri destekleniyor mu?
    • Hayır. CoreML temsilcisi özel işlemleri desteklemez ve bu işlem CPU'ya yedeklenir.

API'ler