pytorch Espresso ANERuntimeEngine程序推理溢出

kqqjbcuj  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(146)

我有两个CoreML模型。一个工作正常,另一个生成以下错误消息:

[espresso] [Espresso::ANERuntimeEngine::__forward_segment 0] evaluate[RealTime]WithModel returned 0; code=5 err=Error Domain=com.apple.appleneuralengine Code=5 "processRequest:qos:qIndex:error:: 0x3: Program Inference overflow" UserInfo={NSLocalizedDescription=processRequest:qos:qIndex:error:: 0x3: Program Inference overflow}
[espresso] [Espresso::overflow_error] /var/containers/Bundle/Application/E0DE5E08-D2C6-48AF-91B2-B42BA7877E7E/xxx demoapp.app/mpii-hg128.mlmodelc/model.espresso.net:0

两种型号都很相似(Conv 2D模型)。使用相同的脚本和PyTorch,ONNX和onnx-coreml版本生成。工作的模型有1036层,生成错误的模型有599层。它们都使用标准层-Conv 2D,BatchNorm,ReLU,MaxPool,和上采样(没有自定义层,也没有Functional或Numpy之类的东西)。它们每层都使用相对相同数量的特征。它们基本上遵循相同的结构,除了误差模型在开始时跳过MaxPool层(因此输出分辨率更高)。
它们都采用256 x256彩色图像作为输入,并以(工作)64 x64和(误差)128 x128像素输出16个通道。
应用程序不会崩溃,但会为错误模型提供垃圾结果。
这两个模型都能以其原生格式(PyTorch)很好地进行训练、评估等。
我不知道什么是Code=5 "processRequest:qos:qIndex:error:: 0x3: Program Inference overflow"错误,谷歌搜索也没有产生任何有成效的结果,因为我收集的“Espresso”和“ANERuntimeEngine”都是私人的苹果图书馆。
这个错误消息告诉我什么?我如何修复它?
我可以通过不在仿生芯片上而是在CPU/GPU上运行模型来避免此错误消息吗?
任何帮助都很感激,谢谢。

gwbalxhn

gwbalxhn1#

这是很多层!
Espresso是运行Core ML模型的C++库。ANERuntimeEngine与Apple Neural Engine芯片一起使用。
通过在加载Core ML模型时传入MLModelConfiguration,并将computeUnits设置为.cpuAndGPU,您可以告诉Core ML不要使用神经引擎。

km0tfn4u

km0tfn4u2#

Apple神经引擎在float16中进行原生计算(符合IEEE 754)。
这意味着,如果您的模型包含超出float16可表示的范围(-65504 <= x <= 65504)的权重,或者包含超出此范围的任何中间计算结果,您将看到此错误。
根据我的个人经验,我见过抛出错误但产生可接受结果的模型,但也见过在抛出错误时输出完全垃圾的模型。
我知道有两种方法(不幸的是不是很方便)来避免这个错误:

  • 如果您的推理时间性能要求允许,请将模型限制为仅使用CPU和GPU,正如@Matthijs在他的回答中所述(CPU和GPU都能够在float32中计算)。
  • float16中重新训练模型(并确保训练框架使用float16的IEEE 754实现,而不是bfloat)。

相关问题