משתמש שקיבל הרשאה ל-LiteRT Core ML

בעל הגישה ל-LiteRT Core ML מאפשר להריץ מודלים של LiteRT ב Core ML framework, שמובילה להסקת מודלים מהירים יותר במכשירי iOS.

גרסאות 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 כבר נכלל בגרסה הלילית של LiteRT CocoaPods. כדי להשתמש בהענקת גישה ל-Core ML, יש לשנות את רצף LiteRT כך שיכלול את משנה את 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']

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:e&rror];
    if (error != nil) { /* Error handling... */ }

    if (![interpreter allocateTensorsWithError:e&rror]) { /* 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);
      

שיטות מומלצות

שימוש במתן גישה ל-Core ML במכשירים ללא מנוע נוירונים

כברירת מחדל, המערכת תיצור הרשאות גישה ל-Core ML רק אם למכשיר יש מערכת נוירונים המנוע, ויחזיר את הערך null אם לא ייעשה שימוש בהענקת הגישה. אם רוצים להריץ בעל גישה ל-Core ML בסביבות אחרות (למשל, סימולטור), להעביר את .all כאפשרות בעת יצירת נציג ב-Swift. ב-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
      

שימוש בהענקת גישה ל-Meta(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
      

לוגיקת היצירה של הענקת הגישה קוראת את מזהה המחשב של המכשיר (למשל iPhone11,1) אל לקבוע את הזמינות של מנוע הנוירונים שלו. לצפייה קוד לקבלת פרטים נוספים. לחלופין, אפשר להטמיע קבוצה משלך של רשימת ישויות שנחסמו שמשתמשים בספריות אחרות כמו DeviceKit.

שימוש בגרסה ישנה יותר של Core ML

למרות ש-iOS 13 תומך ב-Core ML 3, המודל עשוי לפעול טוב יותר שהומר לפי מפרט המודל של Core ML 2. הגרסה של המרת היעד היא מוגדרת לגרסה האחרונה כברירת מחדל, אבל אפשר לשנות זאת באמצעות ההגדרה coreMLVersion (ב-Swift, coreml_version ב-C API) באפשרות הענקת הגישה אל גרסה ישנה יותר.

פעולות נתמכות

הפעולות הבאות נתמכות על ידי המשתמש שקיבל הרשאה ל-Core ML.

  • הוסף
    • ניתן לשדר רק צורות מסוימות. בפריסת tensor של Core ML, את הצורות הבאות של tensor ניתן לשדר. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • ממוצע בריכה2D
  • שרשור
    • צריך לבצע שרשור לאורך ציר הערוץ.
  • המרות דו-ממדיות
    • המשקולות וההטיה צריכים להיות קבועים.
  • DepthwiseConv2D
    • המשקולות וההטיה צריכים להיות קבועים.
  • חיבור מלא (נקרא גם Dense או InnerProduct)
    • המשקולות וההטיה (אם יש) צריכים להיות קבועים.
    • התכונה תומכת רק במארז עם חבילת גלישה אחת. מידות הקלט צריכות להיות 1, מלבד המאפיין האחרון.
  • קשיח
  • לוגיסטי (נקרא גם Sigmoid)
  • MaxPool2D
  • MirrorPad
    • יש תמיכה רק בקלט 4D במצב REFLECT. המרווח הפנימי צריך להיות קבוע, ומותר רק עבור מאפייני H ו-W.
  • מול
    • ניתן לשדר רק צורות מסוימות. בפריסת tensor של Core ML, את הצורות הבאות של tensor ניתן לשדר. [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.
  • ResizeBilinear
  • SoftMax
  • טאן
  • TransposeConv
    • המשקולות צריכות להיות קבועות.

משוב

אם נתקלת בבעיות, יש ליצור GitHub את כל הפרטים הדרושים לשחזור.

שאלות נפוצות

  • האם איש הקשר של CoreML תומך בחלופה למעבד (CPU) אם תרשים מכיל נתונים לא נתמכים פעולות?
    • כן
  • האם האצלת הגישה ל-CoreML פועלת בסימולטור של iOS?
    • כן. הספרייה כוללת יעדים מסוג x86 ו-x86_64 כדי שניתן יהיה להפעיל אותה סימולטור, אבל לא תראה שיפור בביצועים לעומת המעבד (CPU).
  • האם משתמשי LiteRT ו-CoreML תומכים ב-MacOS?
    • LiteRT נבדק רק ב-iOS ולא ב-MacOS.
  • האם יש תמיכה בפעולות LiteRT מותאמות אישית?
    • לא, בעל הגישה ל-CoreML לא תומך בפעולות מותאמות אישית והוא יפנה אל מעבד (CPU)

ממשקי API