大多数浏览器和
Developer App 均支持流媒体播放。
-
优化您的 Core ML 使用情况
了解 Core ML 如何与 CPU、GPU 和神经网络引擎协同运行,在设备上为您的 App 提供保护隐私的机器学习体验。我们将探索最新的工具,以便理解并最大限度提高您的模型性能。我们还会介绍如何生成报告来轻松理解您的模型性能特性,帮助您借助 Core ML Instrument 洞察模型,并带您了解 API 增强功能,进一步优化 App 中的 Core ML 集成。为能更好地理解此讲座,请确保观看 WWDC21 的“调整您的 Core ML 模型”。
资源
相关视频
WWDC23
WWDC22
-
下载
♪ 柔和乐器演奏的嘻哈音乐 ♪ ♪ 嗨 我的名字是 Ben 我是 Core ML 团队的工程师 今天我将展示 Core ML 中 一些令人兴奋的新功能 这些功能主要是为了 帮助您更好地使用 Core ML 在本节中 我将介绍 有哪些信息可以帮助您 了解和优化 Core ML 的模型 然后我会介绍一些 帮助实现这类优化增强型 API 最后 我会简单介绍 Core ML 其他的一些能力 和集成的选项 我先从性能工具开始 我先总体介绍一下使用 Core ML 的标准流程 好让您对背景有所了解 第一步是选择您的模型 有多种方式选择 例如使用 Core ML 工具 将一个 PyTorch 或 TensorFlow 模型 转换为 Core ML 格式 使用现成的 Core ML 模型 或使用 Create ML 来训练和导出您的模型 如果您想了解更多 模型转换 或 Create ML 有关的信息 本节内容值得您多加留意 下一步是将该模型 集成到您的 App 中 这一步包括 将模型与 App 进行绑定 并在 App 运行时 使用 Core ML API 在该模型上加载和运行分析 最后一步 是优化 Core ML 的使用 首先 我会介绍如何选择模型 选择是否在 App 中 使用某个模型 有许多要考虑的因素 另外您也可能 有若干个备选的模型 可怎么选择用哪个呢? 您需要的模型 功能必须符合您想实现的目的 因此您要了解模型的准确性 以及性能 要了解一个 Core ML 模型 一个很好的办法就是 用 Xcode 打开该模型 双击任意模型 您会看到以下内容 顶部会显示模型类型 大小和操作系统要求 “常规”选项卡会显示该模型 元数据中的其他详细信息 模型的计算和存储精度 和类似可预测的类标签等信息 预览选项卡中可以输入示例 测试模型所能预测的东西 预测选项卡会显示模型的输入和输出 以及 Core ML 在运行时 所需的类型和尺寸 最后 辅助选项卡可以实现 模型加密和部署任务 这些界面可让您快速浏览 模型的功能并对其准确性有所了解 不过模型的性能该如何了解呢? 模型性能的关键包括 加载模型所需的能耗 单次预测所花费的时间 及其所使用的硬件 您可能要实现某些高难度任务 比如涉及到实时流数据等条件 或者要根据感知延迟 针对用户界面进行重要设计 深入了解模型性能的一种方法 是先将模型 初步整合进您的 App 中 或者创建一个小原型 用来测试和评估 另外 由于性能取决于硬件 这些测试应当 尝试几种不同的硬件支持 现在 Xcode 和 Core ML 甚至可以在 编写代码之前就完成这些任务 Core ML 现在支持创建性能报告 我举个例子
现在我打开了 Xcode 模型查看器 查看 YOLOv3 物体检测模型 现在 在预测和辅助选项卡之间 出现了一个性能选项卡 要生成性能报告 我可以选择左下角的加号图标 选择我要运行的设备 我的 iPhone 点击下一步 然后选择我想让 Core ML 使用的计算单元 我勾选了“全部” 让 Core ML 对所有 可用计算单元进行延迟优化 现在点击“运行”就完成了测试 为保证测试可以运行 所选设备必须解锁 性能报告正在生成期间 会显示一个旋转的图标 要创建报告 模型会被发送到设备上 然后模型会进行 编译、加载以及预测的迭代 完成这些步骤后 性能报告所需的数据就计算好了 现在 模型已经运行完毕 我的 iPhone 性能报告 就展示出来了 顶部显示了一些关于 运行测试的设备 以及选择了哪些计算单元等细节 下面显示的是运行模型有关的数据 预测时间中位数 为 22.19 毫秒 加载时间中位数约为 400 毫秒 此外 如果您计划在设备上编译模型 这里显示编译时间 约为 940 毫秒 大约 22 毫秒的预测时间告诉我 如果我想实时运行该模型 其速度支持约为 45 帧/秒
由于该模型包含神经网络 底部有一个分层展示的 性能报告界面 这里显示了所有层的名称和类型 以及每层运行在哪个计算单元上 高亮的复选标记表示该层 已在该计算单元上运行 未勾选的复选标记表示 该计算单元支持该层模型 但 Core ML 并没有选择 在该单元上运行 空的菱形表示该计算单元 不支持该层 本例中 GPU 上 共运行了 54 层 其中神经引擎上运行了 32 层 您还可以通过单击计算单元 对分层进行筛选
这样就可以用 Xcode 14 为您的 Core ML 模型 生成性能报告 刚刚展示的例子 是 iPhone 上运行的 不过其他操作系统和硬件组合 都可以做类似测试 而无需编写任何代码 那么您的模型选好以后 下一步就是 将此模型集成到 App 当中 这里涉及两步 一是将 App 与模型绑定 二是用 Core ML API 加载模型 并进行预测 本例中 我构建了一个 使用 Core ML 样式 转换模型的 App 来对实时录像作帧对帧的样式转换 目前看来运行正常 不过帧速 比我预期的要慢 而我想知道为什么 这时我们就要进入第三步操作 优化 Core ML 的使用了 生成性能报告可以让我们知道 某个模型在独立环境中的表现 但我们还需要在 App 内部 分析模型实时运行效果 为此 现在可以在 Xcode 14 的“工具箱” App 中 找到 Core ML 工具 该工具可以可视化地展示出 您的模型在 App 中 实时运行情况 帮助您识别潜在的性能问题 下面我给您示范一下如何使用 现在 我在 Xcode 中打开了 样式转换 App 的工作面板 准备对 App 进行分析了 我将强制单击“运行”按钮 并选择“分析”
这样会在我的设备上 安装最新版本的代码 并为我打开已选择设备 与 App 的对应工具箱 我想分析 我的 Core ML 使用情况 因此我要 选择 Core ML 模板 该模板里有 Core ML 工具 还有其他有用的工具 用来帮助分析 您的 Core ML 使用情况 想要进行跟踪的话 点击“记录”即可
现在我的 iPhone 上 已经在运行这个 App 了 我会让它运行几秒钟 并尝试几种不同的样式 现在我按下停止按钮来结束跟踪 现在 我们有了 各种工具的跟踪数据 我们着重看 Core ML 工具 Core ML 工具 会显示跟踪数据中 捕获的所有 Core ML 事件 初始视图将所有事件分为三个通道 活动、数据和计算 活动通道显示的是 最高级的 Core ML 事件 这些事件与 直接调用的 Core ML API 具有一一对应的关系 例如负载和预测 数据通道显示的是 Core ML 在执行 数据检测和转换时的事件 以确保模型的输入与输出 能够安全进行 计算通道显示的是 Core ML 向特定计算单元 发送计算请求时的记录 例如神经引擎或 GPU 您也可以选择未分组界面 该界面的每个事件类型 都有一个单独的通道 底部是模型活动汇总界面 此界面可以看到跟踪信息中 所有事件的汇总统计信息 例如 在此跟踪中 平均模型负载 需要 17.17 毫秒 平均预测耗时 7.2 毫秒 还有一点 该界面可以按 持续时间对事件进行排序 这个列表告诉我 模型所耗费的时间 更多是花在加载过程中 而不是实际预测过程中 加载共用了 6.41 秒 而相比之下 预测仅用了 2.69 秒 也许这就跟低帧率有关 现在我想试试找出加载缓慢的原因
这里我注意到 每次进行预测之前 我的 Core ML 模型 都要重新加载一遍 这种做法一般都不提倡 因为我完全可以只加载一次 并将其保存在内存中 现在我要回到代码里 试着解决这个问题
我找到了加载模型有关的代码 这里的问题在其计算设置上 即每次我引用 styleTransferModel 变量 都要重新计算属性 同时意味着重新加载一次模型 这个问题很好解决 我只需把它改为惰性变量即可
现在我再分析一次 看现在 是否已经解决了重复加载问题
再次选择 Core ML 模板 进行追踪分析 这次像样多了 计数栏告诉我 总共有五次加载事件 这与我在 App 中使用的 样式数量正好匹配 并且加载所耗的总时长 比预测的总时长要少多了 另外 如果我滚动浏览… 这里能看到重复的预测事件 其间并没有重新加载
还有一点 到目前为止 我只查看了 显示所有 Core ML 模型活动的界面 这个 App 中每种样式 对应一个 Core ML 模型 因此 我可以按模型 来查看 Core ML 活动 “工具”很容易做到这一点 单击主图左上角的箭头 会为追踪中使用的每个模型 生成一个子追踪数据 这里显示了用到的所有 不同的样式转换模型 “汇总”界面也提供类似的功能 支持按模型来细分统计数据
为了更好地理解其运作方式 接下来我会拿 我的一个模型进行预测 我会拿“水彩”模型来深入探讨
在这次预测中 计算通道告诉我 我的模型是在一个 神经引擎和 GPU 的组合上运行的 Core ML 会异步发送这些计算请求 因此 如果我想看看这些计算单元 积极运行模型时的状态 就可以结合使用 Core ML、GPU 和新神经引擎三种工具 具体就是将三个工具在此处选定
Core ML 工具会展示 模型运行的整个区域
在这个区域内 神经引擎仪器 显示计算首先是 在神经引擎上运行的 然后 GPU 工具显示 模型从神经引擎移交到了 GPU 上以完成运行 这样 我就能更好地了解 我的模型在硬件上的实际执行状况 回顾一下 我在 Xcode 14 中 使用了 Core ML 工具 来了解我的模型 在 App 中实时运行时的性能 然后我发现了一个问题 模型会频繁地重新加载 我在代码中解决了这个问题 并重新分析 确认问题已得到解决 我还结合 Core ML、GPU 和新神经引擎工具 获得更多 关于模型在不同的 计算单元上实际运行的细节 以上简单介绍了有关 如何了解性能的新工具 接下来 我将介绍 一些能够优化性能的 增强型 API 首先 我来 回顾一下 Core ML 如何处理模型的输入和输出 创建 Core ML 模型时 该模型有一组输入和输出的特征 每个都有自己的类型和大小 运行时 使用 Core ML API 来提供 符合模型界面的输入 并在分析后获得输出 这里我详细讲讲 图像和多维数组 对于图像 Core ML 支持 8 位灰度 和 32 位彩色图像 每个分量 8 位 对于多维数组 Core ML 支持 32 位整数、浮点 和 32 位浮点三种标量类型 如果您的 App 本来就 支持这些类型 只需将它们连接到模型即可 但是 有时类型可能会不匹配 我举个例子 我想在图像处理和样式 App 中 添加一个新的图像处理器 此滤镜可以通过对单通道图像 进行锐化 我的 App 在 GPU 上可以作一些 预处理和后处理 并以 16 位浮点的精度来表征 为此 我使用了 coremltools 将一个图像 用一个 torch 的锐化模型 转换到 Core ML 格式 像这样 该模型的计算精度 设置为 16 位浮点 此外 它接受图像输入 并产生图像输出 我这里有个模型是这样的 请注意 它只接受灰度图像 而 Core ML 中 灰度图是 8 位的 这样我就得写点代码 将输入从 OneComponent16Half 下调至 OneComponent8 再把输出 从 OneComponent8 上调 至 OneComponent16Half 然而 这还没完 因为模型的计算精度设置 是浮点 16 位 Core ML 还需要将 8 位的 输入转换为浮点 16 位 这样的转换很有效 但从 Instruments 中查看 App 运行的追踪信息时却是这样的 注意 Core ML 在执行神经引擎计算 前后的数据步骤 放大“数据”通道 我们看到 Core ML 在复制数据 以准备在神经引擎上进行计算 这里也就意味着 要将其转换为浮点 16 位 这样很多余 因为原始数据 本来是浮点 16 位的 理想情况下 这些数据转换 完全是可以避免的 只要让模型 在 App 和 Core ML 内 直接使用浮点 16 位 输入和输出就可以了 从 iOS 16 和 macOS Ventura 开始 Core ML 将直接支持 OneComponent16Half 的灰度图像 和浮点 16 位多维数组 您可以通过 调用 coremltools 为图像设置新的颜色布局 或为多维数组设置新数据类型 来创建一个支持浮点 16 位 输入输出的模型 这里我为模型指定了 浮点 16 位的灰度图像 由于对浮点 16 位的支持 是从 iOS 16 和 macOS Ventura 开始的 因此 只有 当最小 deployment target 设定为 iOS 16 时才适用 这就是模型重新转换后的样子 注意这里输入和输出 标记为 Grayscale16Half 有了这个浮点 16 位的支持 我的 App 就可以直接向 Core ML 输入浮点 16 位图像 这样就不用将在 App 内部 将输入下调 再将输出上调了 这就是代码 因为我的输入数据 是以 OneComponent16Half CVPixelBuffer 的形式 我可以将像素缓冲 直接发送到 Core ML 这样无需任何数据复制或转换 这样 我就得到了一个 OneComponent16Half CVPixelBuffer 的输出 这样的代码更简单 并且不需要数据转换 还有一件很酷的事情可以做 就是要求 Core ML 将预先分配的缓冲区 用于输出 而不是让 Core ML 为每个预测分配新的缓冲区 做法是分配输出后备缓冲区 并将其设置在预测选项上 我为我的 App 编写了一个名为 outputBackingBuffer 的函数 它会返回一个 OneComponent16Half CVPixelBuffer 然后我将其设置在预测选项上 最后在我的模型上调用 该预测选项的预测方法 指定了输出支持后 可以更好地控制模型输出的 缓冲区管理 那么回顾一下 作了这些改变后 使用 8 位输入输出的 原始模型追踪 结果是这样 而修改代码后 支持了 16 位 缓冲区 IOSurface 将模型改为 16 位版本后 工具追踪结果就是这样 之前在“数据”通道中显示的 数据转换现在消失了 因为 Core ML 现在无需转换了 总结一下 Core ML 现在支持 端到端浮点 16 位数据 也就是说 您可以向 Core ML 输入浮点 16 位数据 并同样输出 16 位数据 还可以使用新的输出支持 API 让 Core ML 使用预先分配的 缓冲区来输出 而无需重新分配 最后 我们建议您 尽量使用 IOSurface 支持的缓冲区 因为这可以利用统一的内存 让 Core ML 无需复制 就能在不同的计算单元间传输数据 接下来 我会快速介绍一下 Core ML 中新增的一些 附加功能 首先是“尺寸压缩” 压缩模型的尺寸可以 在精度不变的前提下缩小模型 在 iOS 12 中 Core ML 使用 训练后尺寸压缩 这样可以降低 Core ML 神经网络模型的大小 我们现在正在将“ML 程序”模型 支持的类型扩展 为 16 位和 8 位 并在稀疏表示中新增一个 存储尺寸的新选项 有了 coremltools 工具 您就为您的 ML 程序模型 进行量化、调色 或稀疏尺寸 接下来是一个新的计算单元选项 Core ML 一直努力 在指定的计算单元偏好下 尽量减少分析延迟 通过 MLModelConfiguration 属性 就可以设置偏好 除了三个现有的计算单元选项外 现在新增了一个 cpuAndNeuralEngine 该选项会制止 Core ML 在 GPU 上计算 这在 App 使用 GPU 进行其他计算时 会很有帮助 能将 Core ML 限制在 CPU 和神经引擎上 下面我们还添加了一种 新的初始化 Core ML 模型实例 能提供更灵活的模型序列 这样可以将模型数据 按照自定义加密方案进行加密 并在加载之前解密 有了这些新 API 就可以编译和加载 内存中的 Core ML 模型设定 而无需存储编译后的模型 最后一条更新关于 Swift 包 及其在 Core ML 中的运作方式 Swift 包可以很好地绑定和分配 可重复使用的代码 Xcode 14 可以将 Core ML 模型 加入 Swift 包中 现在 只要导入 Swift 包 您的模型就能运行了 Xcode 会自动编译 和绑定您的 Core ML 模型 并创建一个您惯用的 代码生成界面 我们很喜欢这个新功能 因为这样可以帮助您 在 Swift 环境中分发您的模型 那么 本课内容到此结束 Xcode 14 中的 Core ML 性能报告和工具 能够帮助您分析和优化 您的 App 中 ML 驱动的 功能的性能 API 新的浮点 16 位支持和输出支持 可以更好地控制 Core ML 数据的传输方式 拓展的尺寸压缩功能 可以帮助您将模型的大小最小化 而模型的内存支持 和 Swift 包支持 则为您展示、整合和发布模型 提供了更多选择 我是 Ben 来自 Core ML 团队 祝大家 WWDC 愉快 ♪
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。