Google I / O là một kết quả hoàn hảo! Cập nhật các phiên TensorFlow Xem phiên

Đại biểu Tensorflow Lite Core ML

Đại biểu TensorFlow Lite Core ML cho phép chạy các mô hình TensorFlow Lite trên khung Core ML , dẫn đến 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, đại biểu Core ML sẽ tự động dự phòng cho CPU.
  • Theo mặc định, đại biểu Core ML sẽ chỉ được bật trên các thiết bị có A12 SoC trở lên (iPhone Xs trở lên) để sử dụng Neural Engine cho khả năng suy luận nhanh hơn. Nếu bạn cũng muốn sử dụng Core ML ủy quyền trên các thiết bị cũ hơn, vui lòng xem các phương pháp hay nhất

Các mô hình được hỗ trợ

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

Dùng thử đại biểu 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 hàng đêm của TensorFlow lite CocoaPods. Để sử dụng đại biểu Core ML, hãy thay đổi pod TensorFlow lite của bạn để bao gồm CoreML CoreML trong Podfile của bạn.

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

HOẶC LÀ

# Particularily useful when you also want to include 'Metal' subspec.
target 'YourProjectName'
  pod 'TensorFlowLiteSwift', '~> 2.4.0', :subspecs => ['CoreML']

Nhanh

    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);
      

Thực hành tốt nhất

Sử dụng đại biểu Core ML trên các thiết bị không có Neural Engine

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

Nhanh

    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 đại biểu Metal (GPU) làm phương án dự phòng.

Khi chưa tạo đại biểu Core ML, bạn vẫn có thể sử dụng đại biểu Metal để nhận các lợi ích về hiệu suất. Ví dụ sau cho thấy cách thực hiện điều này:

Nhanh

    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 ủy quyền đọc id máy của thiết bị (ví dụ: iPhone11,1) để xác định tính khả dụng của Neural Engine. Xem để biết thêm chi tiết. Ngoài ra, bạn có thể triển khai bộ thiết bị từ chối của riêng mình bằng cách sử dụng các thư viện khác như DeviceKit .

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

Mặc dù iOS 13 hỗ trợ Core ML 3, nhưng mô hình có thể hoạt động tốt hơn khi nó được chuyển đổi với đặc điểm kỹ thuật của mô hình Core ML 2. Phiên bản chuyển đổi mục tiêu được đặ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 đặt coreMLVersion (trong Swift, coreml_version trong C API) trong tùy chọn ủy quyền cho phiên bản cũ hơn.

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

Các hoạt động sau được hỗ trợ bởi đại biểu Core ML.

  • Thêm vào
    • Chỉ một số hình dạng nhất định mới có thể phát sóng. Trong bố cục tensor Core ML, các hình dạng tensor sau có thể phát sóng. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • AveragePool2D
  • Concat
    • Việc ghép nối nên được thực hiện dọc theo trục kênh.
  • Conv2D
    • Trọng số và độ lệch phải không đổi.
  • DepthwiseConv2D
    • Trọng số và độ lệch phải không đổi.
  • Được kết nối hoàn toàn (hay còn gọi là Sản phẩm dày đặc hoặc Sản phẩm bên trong)
    • Trọng số và độ chệch (nếu có) phải không đổi.
    • Chỉ hỗ trợ trường hợp hàng loạt. Kích thước đầu vào phải là 1, ngoại trừ thứ nguyên cuối cùng.
  • Khó nhọc
  • Logistic (hay còn gọi là Sigmoid)
  • MaxPool2D
  • MirrorPad
    • Chỉ hỗ trợ đầu vào 4D với chế độ REFLECT . Phần đệm phải không đổi và chỉ được phép đối với kích thước H và W.
  • Mul
    • Chỉ một số hình dạng nhất định mới có thể phát sóng. Trong bố cục tensor Core ML, các hình dạng tensor sau có thể phát sóng. [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. Phần đệm phải không đổi và chỉ được phép đối với kích thước H và W.
  • Relu
  • ReluN1To1
  • Relu6
  • Định hình lại
    • Chỉ được hỗ trợ khi phiên bản Core ML mục tiêu là 2, không được hỗ trợ khi nhắm mục tiêu Core ML 3.
  • Thay đổi kích thước
  • SoftMax
  • Tánh
  • 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 vấn đề GitHub với tất cả các chi tiết cần thiết để tái tạo.

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

  • CoreML ủy quyền có hỗ trợ dự phòng cho CPU không nếu một biểu đồ chứa các hoạt động không được hỗ trợ?
    • Đúng
  • Ủy quyền CoreML có hoạt động trên Trình mô phỏng iOS không?
    • Đúng. Thư viện bao gồm các mục tiêu x86 và x86_64 để nó 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 trên CPU.
  • TensorFlow Lite và đại biểu CoreML có hỗ trợ MacOS không?
    • TensorFlow Lite chỉ được thử nghiệm trên iOS chứ không phải MacOS.
  • Các hoạt động TF Lite tùy chỉnh có được hỗ trợ không?
    • Không, đại biểu CoreML không hỗ trợ các hoạt động tùy chỉnh và chúng sẽ dự phòng cho CPU.

API