我有两个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上运行模型来避免此错误消息吗?
任何帮助都很感激,谢谢。
2条答案
按热度按时间gwbalxhn1#
这是很多层!
Espresso是运行Core ML模型的C++库。ANERuntimeEngine与Apple Neural Engine芯片一起使用。
通过在加载Core ML模型时传入
MLModelConfiguration
,并将computeUnits
设置为.cpuAndGPU
,您可以告诉Core ML不要使用神经引擎。km0tfn4u2#
Apple神经引擎在
float16
中进行原生计算(符合IEEE 754)。这意味着,如果您的模型包含超出
float16
可表示的范围(-65504 <= x <= 65504
)的权重,或者包含超出此范围的任何中间计算结果,您将看到此错误。根据我的个人经验,我见过抛出错误但产生可接受结果的模型,但也见过在抛出错误时输出完全垃圾的模型。
我知道有两种方法(不幸的是不是很方便)来避免这个错误:
float32
中计算)。float16
中重新训练模型(并确保训练框架使用float16
的IEEE 754实现,而不是bfloat
)。