【问题标题】:coreml inference results are different with cpu and gpucoreml 推理结果与 cpu 和 gpu 不同
【发布时间】:2020-05-07 13:27:32
【问题描述】:

操作系统:macos Catalina 10.15.2
xcode: 11.3
coreml3.0

我将相同的模型输入提供给相同的 mlmodel。但是使用 cpu 设备和 gpu 设备的推理结果是不同的。

结果如下,左边文件是使用cpu的推理结果(第二列),右边文件是使用CpuAndGpu的推理结果(第二列)。我用beyond compare来比较两个文件,红色标注的数据就是区别。

有谁知道这个问题以及如何解决它?

enter image description here

【问题讨论】:

    标签: xcode macos coreml mlmodel


    【解决方案1】:

    这本身不是问题。在 GPU 上使用 16 位浮点数,而在 CPU 上使用 32 位浮点数。 16 位浮点数的精度较低,这解释了您得到的不同结果。

    有些数字会稍大一些,有些会稍小一些,但通常这些影响会相互抵消,您不会注意到差异。

    (但是,如果您的模型生成图像,您可能会注意到 16 位浮点数提供的较低精度造成的像素伪影。)

    【讨论】:

    • 我还有两个问题。首先,我使用 coremltools 对模型进行了 16 位量化。但是在设备上的推理速度并没有提高。只有模型尺寸减小。其次,某些检测模型使用coremltools的16bit量化可能会损失很多精度。但是在设备(gpu-16bit)上运行的模型不会损失精度。那么为什么设备上的 gpu(或 npu)-16bit 比使用 coremltools 的 quantization-16bit 更好呢?他们用来量化 mlmodel 的方法可能不同吗?谢谢@Matthijs Hollemans
    • 量化仅影响权重在模型中的存储方式,而不影响运行时发生的情况。在 GPU/ANE 上,无论权重如何量化(或不量化),网络始终以 16 位浮点数运行。
    猜你喜欢
    • 2015-07-24
    • 2016-07-16
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2021-12-19
    • 2017-09-08
    相关资源
    最近更新 更多