نماینده LiteRT Core ML اجرای مدلهای LiteRT را در چارچوب Core ML فعال میکند، که منجر به استنتاج سریعتر مدل در دستگاههای iOS میشود.
نسخه ها و دستگاه های iOS پشتیبانی شده:
- iOS 12 به بعد. در نسخههای قدیمیتر iOS، Core ML به طور خودکار به CPU بازگشته است.
- بهطور پیشفرض، Core ML delegate فقط در دستگاههای دارای SoC A12 و جدیدتر (iPhone Xs و جدیدتر) فعال میشود تا از موتور عصبی برای استنتاج سریعتر استفاده کند. اگر میخواهید از نماینده Core ML در دستگاههای قدیمیتر نیز استفاده کنید، لطفاً بهترین شیوهها را ببینید
مدل های پشتیبانی شده
نماینده Core ML در حال حاضر از مدل های شناور (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']
سویفت
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) }
هدف-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)
#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 delegate را در محیطهای دیگر اجرا کنید (مثلاً شبیهساز)، هنگام ایجاد delegate در سوئیفت، .all
به عنوان یک گزینه ارسال کنید. در C++ (و Objective-C)، می توانید TfLiteCoreMlDelegateAllDevices
پاس کنید. مثال زیر نحوه انجام این کار را نشان می دهد:
سویفت
var options = CoreMLDelegate.Options() options.enabledDevices = .all let coreMLDelegate = CoreMLDelegate(options: options)! let interpreter = try Interpreter(modelPath: modelPath, delegates: [coreMLDelegate])
هدف-C
TFLCoreMLDelegateOptions* coreMLOptions = [[TFLCoreMLDelegateOptions alloc] init]; coreMLOptions.enabledDevices = TFLCoreMLDelegateEnabledDevicesAll; TFLCoreMLDelegate* coreMLDelegate = [[TFLCoreMLDelegate alloc] initWithOptions:coreMLOptions]; // Initialize interpreter with delegate
سی
TfLiteCoreMlDelegateOptions options; options.enabled_devices = TfLiteCoreMlDelegateAllDevices; TfLiteDelegate* delegate = TfLiteCoreMlDelegateCreate(&options); // Initialize interpreter with delegate
استفاده از متال (GPU) نماینده به عنوان جایگزین.
هنگامی که نماینده Core ML ایجاد نمی شود، می توانید همچنان از Metal delegate برای دریافت مزایای عملکرد استفاده کنید. مثال زیر نحوه انجام این کار را نشان می دهد:
سویفت
var delegate = CoreMLDelegate() if delegate == nil { delegate = MetalDelegate() // Add Metal delegate options if necessary. } let interpreter = try Interpreter(modelPath: modelPath, delegates: [delegate!])
هدف-C
TFLDelegate* delegate = [[TFLCoreMLDelegate alloc] init]; if (!delegate) { // Add Metal delegate options if necessary delegate = [[TFLMetalDelegate alloc] init]; } // Initialize interpreter with delegate
سی
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) در گزینه delegate به نسخه قدیمیتر، آن را تغییر دهید.
عملیات پشتیبانی شده
عملیات زیر توسط نماینده Core ML پشتیبانی می شود.
- اضافه کنید
- فقط اشکال خاصی قابل پخش هستند. در طرح تانسور Core ML، اشکال تانسور زیر قابل پخش هستند.
[B, C, H, W]
،[B, C, 1, 1]
،[B, 1, H, W]
،[B, 1, 1, 1]
.
- فقط اشکال خاصی قابل پخش هستند. در طرح تانسور Core ML، اشکال تانسور زیر قابل پخش هستند.
- میانگین پول 2D
- Concat
- الحاق باید در امتداد محور کانال انجام شود.
- Conv2D
- وزن و تعصب باید ثابت باشد.
- DepthwiseConv2D
- وزن و تعصب باید ثابت باشد.
- کاملاً متصل (معروف به Dense یا InnerProduct)
- وزن و سوگیری (در صورت وجود) باید ثابت باشد.
- فقط از کیس تک دسته ای پشتیبانی می کند. ابعاد ورودی باید 1 باشد، به جز بعد آخر.
- Hardswish
- لجستیک (با نام مستعار Sigmoid)
- MaxPool2D
- آینه پد
- فقط ورودی 4 بعدی با حالت
REFLECT
پشتیبانی می شود. بالشتک باید ثابت باشد و فقط برای ابعاد H و W مجاز است.
- فقط ورودی 4 بعدی با حالت
- مول
- فقط اشکال خاصی قابل پخش هستند. در طرح تانسور Core ML، اشکال تانسور زیر قابل پخش هستند.
[B, C, H, W]
،[B, C, 1, 1]
،[B, 1, H, W]
،[B, 1, 1, 1]
.
- فقط اشکال خاصی قابل پخش هستند. در طرح تانسور Core ML، اشکال تانسور زیر قابل پخش هستند.
- Pad و PadV2
- فقط ورودی 4 بعدی پشتیبانی می شود. بالشتک باید ثابت باشد و فقط برای ابعاد H و W مجاز است.
- Relu
- ReluN1To1
- Relu6
- تغییر شکل دهید
- فقط زمانی پشتیبانی می شود که نسخه Core ML هدف 2 باشد، در هنگام هدف قرار دادن Core ML 3 پشتیبانی نمی شود.
- ResizeBilinear
- سافت مکس
- تنها
- TransposeConv
- وزن ها باید ثابت باشند.
بازخورد
برای مشکلات، لطفاً یک مشکل GitHub با تمام جزئیات لازم برای بازتولید ایجاد کنید.
سوالات متداول
- اگر یک گراف حاوی عملیات پشتیبانی نشده باشد، آیا CoreML از بازگشت مجدد به CPU پشتیبانی می کند؟
- بله
- آیا نمایندگی CoreML در شبیه ساز iOS کار می کند؟
- بله. این کتابخانه شامل اهداف x86 و x86_64 است، بنابراین میتواند بر روی یک شبیهساز اجرا شود، اما شما شاهد افزایش عملکرد در CPU نخواهید بود.
- آیا نمایندگی LiteRT و CoreML از MacOS پشتیبانی می کند؟
- LiteRT فقط روی iOS تست شده است اما MacOS تست نشده است.
- آیا عملیات سفارشی LiteRT پشتیبانی می شود؟
- خیر، نماینده CoreML از عملیات سفارشی پشتیبانی نمی کند و به CPU بازگشته است.