Người được uỷ quyền công nghệ học máy LiteRT Core

Bộ uỷ quyền công nghệ học máy LiteRT cho phép chạy các mô hình LiteRT trên khung ML cốt lõi, giúp suy luận mô hình nhanh hơn trên thiết bị iOS.

Các phiên bản và thiết bị iOS được hỗ trợ:

  • iOS 12 trở lên. Trong các phiên bản iOS cũ hơn, tính năng uỷ quyền Học máy Core sẽ tự động dự phòng sang CPU.
  • Theo mặc định, tính năng uỷ quyền Học máy Core sẽ chỉ được bật trên các thiết bị có SoC A12 trở lên (iPhone Xs trở lên) để sử dụng Neural Engine nhằm suy luận nhanh hơn. Nếu bạn cũng muốn sử dụng tính năng uỷ quyền Học máy Core trên các thiết bị cũ, vui lòng xem các phương pháp hay nhất

Mô hình được hỗ trợ

Đại biểu Core ML hiện hỗ trợ các mô hình độ chính xác đơn (FP32 và FP16).

Dùng thử tính năng uỷ quyền máy học cốt lõi trên mô hình của riêng bạn

Đại biểu công nghệ Core ML đã có trong bản phát hành LiteRT hằng đêm CocoaPods. Để sử dụng uỷ quyền học máy Core, hãy thay đổi nhóm LiteRT để đưa vào phụ đề CoreML trong Podfile của bạn.

target 'YourProjectName'
  pod 'TensorFlowLiteSwift/CoreML', '~> 2.4.0'  # Or TensorFlowLiteObjC/CoreML

OR

# 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 (Cho đến 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);
      

Các phương pháp hay nhất

Sử dụng tính năng uỷ quyền học máy Core trên các thiết bị không có Neural Engine

Theo mặc định, công cụ uỷ quyền cho công nghệ học máy Core sẽ chỉ được tạo nếu thiết bị có Neural Engine và sẽ trả về null nếu không tạo uỷ quyền. Nếu bạn muốn chạy uỷ quyền ML Core trên các môi trường khác (ví dụ: trình mô phỏng), truyền .all làm một tuỳ chọn khi tạo uỷ quyền trong Swift. Trên C++ (và Object-C), bạn có thể truyền TfLiteCoreMlDelegateAllDevices. Ví dụ sau cho thấy cách thực hiện việc này:

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
      

Sử dụng tính năng uỷ quyền Metal(GPU) làm phương án dự phòng.

Khi không tạo được uỷ quyền Học máy cốt lõi, bạn vẫn có thể sử dụng Uỷ quyền bằng kim loại để nhận các lợi ích về hiệu suất. Ví dụ sau cho thấy cách thực hiện việc này:

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
      

Logic tạo uỷ quyền sẽ đọc mã máy của thiết bị (ví dụ: iPhone11,1) để xác định khả năng sử dụng Neural Engine. Xem để biết thêm chi tiết. Ngoài ra, bạn có thể triển khai một nhóm danh sách từ chối của riêng mình đang sử dụng các thư viện khác như DeviceKit.

Sử dụng phiên bản Core ML cũ

Mặc dù iOS 13 hỗ trợ Core ML 3 nhưng mô hình này có thể hoạt động tốt hơn khi chuyển đổi bằng thông số kỹ thuật của mô hình Core ML 2. Phiên bản lượt chuyển đổi mục tiêu là đặt thành phiên bản mới nhất theo mặc định, nhưng bạn có thể thay đổi điều này bằng cách cài đặt coreMLVersion (trong Swift, coreml_version trong API C) trong tuỳ chọn uỷ quyền để phiên bản cũ hơn.

Hoạt động được hỗ trợ

Các hoạt động sau được hỗ trợ bởi thực thể đại diện Core ML.

  • Thêm
    • Chỉ có thể truyền một số hình dạng nhất định. Trong bố cục tensor ML Core, sau đây là các hình dạng tensor có thể truyền tin. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • Trung bìnhPool2D
  • Tiếng Concat
    • Bạn nên thực hiện việc nối dọc theo trục của kênh.
  • Chuyển đổi 2D
    • Trọng số và độ chệch phải không đổi.
  • depthwiseConv2D
    • Trọng số và độ chệch phải không đổi.
  • Hoàn toàn kết nối (còn gọi là Dense hoặc InsideProduct)
    • Trọng số và độ chệch (nếu có) phải không đổi.
    • Chỉ hỗ trợ trường hợp một lô. Phương diện đầu vào phải là 1, ngoại trừ phương diện cuối cùng.
  • Hardswish
  • Kho vận (còn gọi là Sigmoid)
  • MaxPool2D
  • MirrorPad
    • Chỉ hỗ trợ đầu vào 4D có chế độ REFLECT. Khoảng đệm phải là không đổi và chỉ được phép đối với kích thước H và W.
  • Linh
    • Chỉ có thể truyền một số hình dạng nhất định. Trong bố cục tensor ML Core, sau đây là các hình dạng tensor có thể truyền tin. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • Pad và PadV2
    • Chỉ hỗ trợ đầu vào 4D. Khoảng đệm phải là không đổi và chỉ cho phép đối với kích thước H và W.
  • Relu
  • ReluN1To1
  • Relu6
  • Đổi hình
    • Chỉ được hỗ trợ khi phiên bản Core ML mục tiêu là 2 và không được hỗ trợ khi nhắm đến công nghệ Core ML 3.
  • ResizeBilinear
  • SoftMax
  • Tanh
  • TransposeConv
    • Trọng lượng phải không đổi.

Phản hồi

Đối với các vấn đề, vui lòng tạo một GitHub vấn đề với tất cả chi tiết cần thiết để tái tạo.

Câu hỏi thường gặp

  • Tính năng uỷ quyền CoreML có hỗ trợ tính năng dự phòng cho CPU không nếu biểu đồ chứa tệp không được hỗ trợ hoạt động?
  • Tính năng uỷ quyền CoreML có hoạt động trên Trình mô phỏng iOS không?
    • Có. Thư viện này bao gồm các mục tiêu x86 và x86_64 để có thể chạy trên nhưng bạn sẽ không thấy hiệu suất tăng so với CPU.
  • LiteRT và CoreML có hỗ trợ MacOS không?
    • LiteRT chỉ được thử nghiệm trên iOS chứ không phải MacOS.
  • Hoạt động LiteRT tuỳ chỉnh có được hỗ trợ không?
    • Không, uỷ quyền CoreML không hỗ trợ hoạt động tuỳ chỉnh và chúng sẽ dự phòng để CPU.

API