coreml 推理结果与 cpu 和 gpu 不同
Posted
技术标签:
【中文标题】coreml 推理结果与 cpu 和 gpu 不同【英文标题】:coreml inference results are different with cpu and 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
【问题讨论】:
【参考方案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 位浮点数运行。以上是关于coreml 推理结果与 cpu 和 gpu 不同的主要内容,如果未能解决你的问题,请参考以下文章