ช่วยปกป้อง Great Barrier Reef กับ TensorFlow บน Kaggle เข้าร่วมท้าทาย

ตัวแทน Tensorflow Lite Core ML

TensorFlow Lite Core ML delegate เปิดใช้งานโมเดล TensorFlow Lite บน เฟรมเวิร์ก Core ML ซึ่งส่งผลให้การอนุมานแบบจำลองเร็วขึ้นบนอุปกรณ์ iOS

เวอร์ชันและอุปกรณ์ iOS ที่รองรับ:

  • iOS 12 ขึ้นไป ใน iOS เวอร์ชันเก่าผู้ร่วมประชุม Core ML จะเปลี่ยนกลับเป็น CPU โดยอัตโนมัติ
  • ตามค่าเริ่มต้นผู้รับมอบสิทธิ์ Core ML จะเปิดใช้งานบนอุปกรณ์ที่มี A12 SoC และใหม่กว่าเท่านั้น (iPhone Xs และใหม่กว่า) เพื่อใช้ Neural Engine เพื่อการอนุมานที่เร็วขึ้น หากคุณต้องการใช้ Core ML delegate บนอุปกรณ์รุ่นเก่าด้วยโปรดดู แนวทางปฏิบัติที่ดีที่สุด

รุ่นที่รองรับ

ปัจจุบันผู้รับมอบสิทธิ์ Core ML รองรับรุ่น float (FP32 และ FP16)

ลองใช้ตัวแทน Core ML ในแบบจำลองของคุณเอง

ผู้ร่วมประชุม Core ML รวมอยู่ใน TensorFlow lite CocoaPods ทุกคืนแล้ว ในการใช้ผู้รับมอบสิทธิ์ Core ML ให้เปลี่ยนพ็อด TensorFlow lite ของคุณเพื่อรวมซับสเปค 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 delegate บนอุปกรณ์ที่ไม่มี Neural Engine

โดยค่าเริ่มต้นผู้รับมอบสิทธิ์ Core ML จะถูกสร้างขึ้นก็ต่อเมื่ออุปกรณ์มี Neural Engine และจะคืน null หากไม่ได้สร้างผู้รับมอบสิทธิ์ หากคุณต้องการเรียกใช้ Core ML delegate บนสภาพแวดล้อมอื่น ๆ (เช่นโปรแกรมจำลอง) ให้ส่ง .all เป็นตัวเลือกในขณะที่สร้างผู้รับมอบสิทธิ์ใน Swift บน 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
      

ใช้ Metal (GPU) delegate เป็นทางเลือก

เมื่อไม่ได้สร้างผู้รับมอบสิทธิ์ 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) เพื่อตรวจสอบความพร้อมใช้งานของ Neural Engine ดู รหัส สำหรับรายละเอียดเพิ่มเติม หรือคุณสามารถใช้ชุดอุปกรณ์ Denylist ของคุณเองโดยใช้ไลบรารีอื่น ๆ เช่น DeviceKit

ใช้ Core ML รุ่นเก่ากว่า

แม้ว่า iOS 13 จะรองรับ Core ML 3 แต่โมเดลดังกล่าวอาจทำงานได้ดีกว่าเมื่อแปลงด้วยข้อมูลจำเพาะของรุ่น Core ML 2 เวอร์ชันการแปลงเป้าหมายถูกตั้งค่าเป็นเวอร์ชันล่าสุดตามค่าเริ่มต้น แต่คุณสามารถเปลี่ยนแปลงได้โดยตั้งค่า coreMLVersion (ใน Swift, coreml_version ใน C API) ในตัวเลือกมอบหมายเป็นเวอร์ชันเก่ากว่า

ปฏิบัติการที่รองรับ

การดำเนินการต่อไปนี้ได้รับการสนับสนุนโดยผู้รับมอบสิทธิ์ Core ML

  • เพิ่ม
    • รูปทรงบางส่วนเท่านั้นที่สามารถออกอากาศได้ ในเค้าโครงเทนเซอร์ Core ML สามารถถ่ายทอดรูปทรงเทนเซอร์ต่อไปนี้ได้ [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1]
  • AveragePool2D
  • Concat
    • การเชื่อมต่อควรทำตามแกนของช่อง
  • Conv2D
    • น้ำหนักและอคติควรคงที่
  • DepthwiseConv2D
    • น้ำหนักและอคติควรคงที่
  • FullyConnected (aka Dense หรือ InnerProduct)
    • น้ำหนักและอคติ (ถ้ามี) ควรคงที่
    • รองรับเฉพาะกรณีแบทช์เดียว มิติข้อมูลอินพุตควรเป็น 1 ยกเว้นมิติข้อมูลสุดท้าย
  • ยาก
  • โลจิสติกส์ (aka Sigmoid)
  • MaxPool2D
  • MirrorPad
    • รองรับเฉพาะอินพุต 4D ที่มีโหมด REFLECT ช่องว่างภายในควรคงที่และอนุญาตเฉพาะมิติ H และ W เท่านั้น
  • มัล
    • รูปทรงบางส่วนเท่านั้นที่สามารถออกอากาศได้ ในเค้าโครงเทนเซอร์ Core ML สามารถถ่ายทอดรูปทรงเทนเซอร์ต่อไปนี้ได้ [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1]
  • Pad และ PadV2.0
    • รองรับเฉพาะอินพุต 4D เท่านั้น ระยะห่างควรคงที่และอนุญาตเฉพาะมิติ H และ W เท่านั้น
  • รีลู
  • ReluN1To1
  • รีลู 6
  • ก่อร่างใหม่
    • รองรับเฉพาะเมื่อรุ่น Core ML เป้าหมายเป็น 2 ไม่รองรับเมื่อกำหนดเป้าหมาย Core ML 3
  • ปรับขนาด
  • ซอฟต์แม็กซ์
  • Tanh
  • TransposeConv
    • น้ำหนักควรคงที่

ข้อเสนอแนะ

สำหรับปัญหาโปรดสร้างปัญหา GitHub พร้อมรายละเอียดที่จำเป็นทั้งหมดเพื่อทำซ้ำ

คำถามที่พบบ่อย

  • CoreML มอบสิทธิ์สนับสนุนซีพียูทางเลือกหรือไม่หากกราฟมีตัวเลือกที่ไม่รองรับ
    • ใช่
  • CoreML delegate ทำงานบน iOS Simulator ได้หรือไม่
    • ใช่. ไลบรารีประกอบด้วยเป้าหมาย x86 และ x86_64 ดังนั้นจึงสามารถทำงานบนโปรแกรมจำลองได้ แต่คุณจะไม่เห็นการเพิ่มประสิทธิภาพเหนือ CPU
  • TensorFlow Lite และ CoreML delegate รองรับ MacOS หรือไม่
    • TensorFlow Lite ได้รับการทดสอบบน iOS เท่านั้น แต่ไม่ใช่ MacOS
  • รองรับ TF Lite แบบกำหนดเองหรือไม่
    • ไม่ผู้รับมอบสิทธิ์ CoreML ไม่สนับสนุนการดำเนินการที่กำหนดเองและจะเปลี่ยนกลับเป็น CPU

API