ML Community Day is November 9! Join us for updates from TensorFlow, JAX, and more Learn more

Tensorflow Lite Core ML 委托

利用 TensorFlow Lite Core ML 委托,您可以在 Core ML 框架上运行 TensorFlow Lite 模型,从而加快 iOS 设备上的模型推断速度。

注:此委托仍处于实验(测试)阶段。它可以从 TensorFlow Lite 2.4.0 和最新的 Nightly 版本中获得。

注:Core ML 委托支持 Core ML 版本 2 及更高版本。

支持的 iOS 版本和设备:

  • iOS 12 及更高版本。在旧 iOS 版本中,Core ML 委托会自动回退到 CPU。
  • 默认情况下,仅在使用 A12 SoC 及更高版本(iPhone XS 及更新的型号)的设备上启用 Core ML 委托,从而使用 Neural Engine 加快推断速度。如果要在旧设备上也使用 Core ML 委托,请参阅最佳做法

支持的模型

目前,Core ML 委托支持浮点(FP32 和 FP16)模型。

在自己的模型上尝试 Core ML 委托

Core ML 委托已经包含在 TensorFlow lite CocoaPods 的 Nightly 版本中。要使用 Core ML 委托,请更改您的 TensorFlow lite Pod,在您的 Podfile 中包含子规范 CoreML

注:如果您使用的是 C API 而不是 Objective-C API,则可以包含 TensorFlowLiteC/CoreML Pod。

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']

注:Core ML 委托也可以将 C API 用于 Objective-C 代码。在 TensorFlow Lite 2.4.0 版本之前,这是唯一的选择。

Swift

    let coreMLDelegate = CoreMLDelegate()
    var interpreter: Interpreter
</div>
<pre data-md-type="block_code" data-md-language=""><code>GL_CODE_5</code>

最佳做法

在没有 Neural Engine 的设备上使用 Core ML 委托

默认情况下,仅在具有 Neural Engine 的设备上创建 Core ML 委托,如果没有创建委托,将返回 null。如果要在其他环境(如模拟器)中运行 Core ML 委托,则在 Swift 中创建委托时,将 .all 作为一个选项传递。在 C++(和 Objective-C)中,您可以传递 TfLiteCoreMlDelegateAllDevices。下面的示例介绍了如何执行此操作:

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];
</div>
<pre data-md-type="block_code" data-md-language=""><code>GL_CODE_9</code>

使用 Metal(GPU) 委托作为回退

如果未创建 Core ML 委托,您也可以使用 Metal 委托获得性能优势。下面的示例介绍了如何执行此操作:

Swift

    var delegate = CoreMLDelegate()
    if delegate == nil {
      delegate = MetalDelegate()  // Add Metal delegate options if necessary.
    }
</div>
<pre data-md-type="block_code" data-md-language=""><code>GL_CODE_10</code>

委托创建逻辑读取设备的机器 ID(如 iPhone11,1)以确定其 Neural Engine 可用性。有关更多详细信息,请参见代码。或者,您也可以使用其他库(如 DeviceKit)实现自己的拒绝列表设备集。有关更多详细信息,请参见代码。或者,您也可以使用其他库(如 DeviceKit)实现自己的拒绝名单设备集。

使用旧 Core ML 版本

虽然 iOS 13 支持 Core ML 3,但使用 Core ML 2 模型规范进行转换后,该模型的效果可能更好。目标转换版本默认设置为最新的版本,但您可以通过在委托选项中设置 coreMLVersion(在 Swift 中;在 C API 中则为 coreml_version),将其更改为旧版本。

支持的运算

Core ML 委托支持以下运算。

  • Add

    • 只能广播几种形状。在 Core ML 张量布局中,可以广播以下张量形状。[B, C, H, W][B, C, 1, 1][B, 1, H, W][B, 1, 1, 1]
  • AveragePool2D
  • Concat

    • 串联应沿通道轴执行。
  • Conv2D

    • 权重和偏差应为常量。
  • DepthwiseConv2D

    • 权重和偏差应为常量。
  • FullyConnected(又称 Dense 或 InnerProduct)

    • 权重和偏差(如果存在)应为常量。
    • 仅支持单一批次情况。除最后一个维度外,输入维度应为 1。
  • Hardswish
  • Logistic(又称 Sigmoid)
  • MaxPool2D
  • MirrorPad

    • 仅支持使用 REFLECT 模式的四维输入。填充应为常量,并且只能用于 H 和 W 维度。
  • Mul

    • 只能广播几种形状。在 Core ML 张量布局中,可以广播以下张量形状。[B, C, H, W][B, C, 1, 1][B, 1, H, W][B, 1, 1, 1]
  • Pad 和 PadV2

    • 仅支持四维输入。填充应为常量,并且只能用于 H 和 W 维度。
  • Relu
  • ReluN1To1
  • Relu6
  • Reshape

    • 仅当 Core ML 版本为 2 时才受支持,当目标版本为 Core ML 3 时不受支持。
  • ResizeBilinear
  • SoftMax
  • Tanh
  • TransposeConv

    • 权重应为常量。

反馈

如有问题,请创建 GitHub 问题,并提供重现问题所需的所有必要详情。

常见问题解答

  • 如果计算图包含不受支持的运算,CoreML 委托支持会回退到 CPU 吗?

  • CoreML 委托可以在 iOS 模拟器上工作吗?

    • 可以。该库包括 x86 和 x86_64 目标,因此,它可以在模拟器上运行,但是您不会看到比在 CPU 上更高的性能。
  • TensorFlow Lite 和 CoreML 委托支持 MacOS 吗?

    • TensorFlow Lite 仅在 iOS 上进行过测试,未在 MacOS 上进行测试。
  • 支持自定义 TF Lite 运算吗?

    • 不支持,CoreML 委托不支持自定义运算,它们将回退到 CPU。

API