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