【问题标题】:Difference of fp16 computing vs fp32 computing in Core MLCore ML 中 fp16 计算与 fp32 计算的区别
【发布时间】:2023-04-07 03:07:01
【问题描述】:

我想问一下 fp16 和 fp32 Core ML 模型的计算如何在 iPhone(我正在使用的 iPhone X 和 iOS 12)上工作。我有一个 fp32 模型,并使用 coremltools 将其量化为 fp16。大小确实减少到 fp32 大小的一半左右,但预测时间并没有减少,我不太明白。

我已经使用 Xcode Shader Debugger 查看了 GPU 帧。所有缓冲区似乎都显示数据采用 RGBA16Float 格式,所以我想知道 fp32 权重或偏差是否已经转换为 fp16?管道统计数据还显示了“高浮动对半比率”的消息。这是否意味着GPU在计算之前将全部转换为fp16?

我用 fp32 和 fp16 类型对 MPSMatrixMultiplication 进行了测试。在大多数情况下,fp16 比 fp32 快 60%。所以我希望 fp16 的计算也可以更快。谢谢!

*这是答案中提到的图像,显​​示了GPU帧和消息。 GPU frame

【问题讨论】:

    标签: gpu metal coreml


    【解决方案1】:

    当 Core ML 在 GPU 上运行模型时,它会使用 fp16 执行此操作,因为 iPhone 中的 GPU 针对 16 位浮点数进行了优化。如果您的权重是 fp32,那么在加载模型时它们首先会转换为 fp16。

    在 CPU 上,Core ML 使用 fp32。 (我不确定神经引擎,但我希望这也是 fp16。)

    【讨论】:

    • 这是否意味着无论范围如何,fp32 都向下转换为 fp16?即使是这种情况,Xcode 仍然会在 fp16 模型中报告消息“高浮点对半比率”。同样在 fp16 模型中,内核 ALU 浮点指令占 CNN 层中一半指令的 5% 的 93%。有这方面的文档吗?这里有点像黑匣子,我没有找到任何真正的规格。
    • 您在哪里看到这个“高浮动对半比率”的消息?请注意,并非所有权重都转换为 fp16。偏差值和批量规范参数保持 float32。
    • 我使用 Xcode Shader Debugger 捕获 GPU 帧,遵循此文档:developer.apple.com/documentation/metal/shader_authoring/…。消息显示在 CNN 层上。
    • 我将在图像中添加答案以显示 GPU 帧和消息。请看我下面的回答。
    • 感谢您的图片(它可能应该成为问题而不是新的答案)。没有看到实际模型,我只能猜测图像的数据格式可能是 32 位浮点数而不是 16 位。或者这可能是您在 MPS 内核中使用 32 位累加器时收到的消息(从 iOS 11.3 开始,内核可以使用 16 位累加器)。但由于这是 Core ML,你会期望它做正确的事情。所以我真的不知道这里发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多