Đại biểu công nghệ học máy của Tensorflow Lite Core

Trình uỷ quyền học máy của TensorFlow Lite Core cho phép chạy các mô hình TensorFlow Lite trên khung học máy cốt lõi, nhờ đó giúp dự đoán mô hình nhanh hơn trên thiết bị iOS.

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

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

Kiểu máy được hỗ trợ

Đại biểu Core ML hiện hỗ trợ các mô hình số thực (FP32 và FP16).

Dùng thử thực thể đại diện của Core ML trên mô hình của riêng bạn

Đại biểu Core ML đã được đưa vào bản phát hành TensorFlow lite CocoaPods hằng đêm. Để sử dụng tính năng uỷ quyền của Core ML, hãy thay đổi nhóm TensorFlow lite để đưa thông số phụ CoreML vào Podfile.

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 phiên bả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 phương thức uỷ quyền của Core ML trên những thiết bị không có Neural Engine

Theo mặc định, uỷ quyền ML của Core sẽ chỉ được tạo nếu thiết bị có Neural Engine và sẽ trả về null nếu uỷ quyền không được tạo. Nếu bạn muốn chạy thực thể đại diện theo mô hình học máy của Core trên các môi trường khác (ví dụ: trình mô phỏng), hãy chuyển .all dưới dạng một lựa chọn khi tạo thực thể đại diện trong Swift. Trên C++ (và Objective-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 uỷ quyền Metal(GPU) làm phương án dự phòng.

Khi không tạo thực thể đại diện theo mô hình học máy, bạn vẫn có thể sử dụng Metal uỷ quyền để hưởng 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 đọc mã máy của thiết bị (ví dụ: iPhone11,1) để xác định khả năng sử dụng Neural Engine của thiết bị đó. Vui lòng xem đoạn mã để biết thêm thông tin chi tiết. Ngoài ra, bạn có thể triển khai nhóm thiết bị của riêng mình trong danh sách từ chối bằ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 được chuyển đổi với thông số kỹ thuật của mẫu Core ML 2. Theo mặc định, phiên bản chuyển đổi mục tiêu được đặt thành phiên bản mới nhất, nhưng bạn có thể thay đổi giá trị này bằng cách đặt coreMLVersion (trong Swift, coreml_version trong API C) trong tuỳ chọn uỷ quyền thành phiên bản cũ.

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

Các hoạt động sau được uỷ quyền của Core ML hỗ trợ.

  • Thêm
    • Chỉ một số hình dạng nhất định có thể truyền phát. Trong bố cục tensor của Core ML, các hình dạng tensor sau đây có thể truyền tin. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • Trung bình nhóm2D
  • Concat
    • Việc nối nên được thực hiện dọc theo trục 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.
  • Kết nối đầy đủ (còn gọi là Dense hoặc InternalProduct)
    • Trọng số và độ chệch (nếu có) phải là không đổi.
    • Chỉ hỗ trợ trường hợp một lô. Kích thước đầu vào phải là 1, ngoại trừ kích thước cuối cùng.
  • Nhạc Hardswish
  • Hậu cần (còn gọi là Sigmoid)
  • Tối đa nhóm 2D
  • MirrorPad
    • Chỉ hỗ trợ phương thức nhập 4D có chế độ REFLECT. Khoảng đệm phải là hằng số và chỉ được phép áp dụng cho kích thước H và W.
    • Chỉ một số hình dạng nhất định có thể truyền phát. Trong bố cục tensor của Core ML, các hình dạng tensor sau đây 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ợ phương thức nhập 4D. Khoảng đệm phải không đổi và chỉ được phép đối với chiều H và W.
  • Relu
  • ReluN1To1
  • Relu6
  • Đổi hình dạng
    • Chỉ được hỗ trợ khi phiên bản học máy cốt lõi mục tiêu là 2, không được hỗ trợ khi nhắm đến công nghệ học máy lõi 3.
  • ResizeBilinear
  • SoftMax
  • Tang
  • TransposeConv
    • Trọng lượng phải không đổi.

Ý kiến phản hồi

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

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

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

API