后台运行coreml时出错:Error计算NN输出错误

Posted

技术标签:

【中文标题】后台运行coreml时出错:Error计算NN输出错误【英文标题】:Error when running coreml in the background: Error computing NN outputs error 【发布时间】:2018-07-06 22:18:39 【问题描述】:

我在 iPhone 6 上运行来自 keras 的 mlmodel。预测经常失败,错误为 Error computing NN outputs。有谁知道可能是什么原因,我能做些什么吗?

do 
    return try model.prediction(input1: input)
 catch let err 
    fatalError(err.localizedDescription) // Error computing NN outputs error

编辑:我试过apple's sample project,它在后台工作,所以它似乎特定于我们的项目或模型类型。

【问题讨论】:

我也看到其他人报告过这种情况(在 Stack Overflow 或 Apple Dev Forms 上)。我不知道是什么原因造成的,但请注意,您不能无限期地在后台运行应用程序。 我们正在开发一个锻炼应用程序,可以在后台跟踪位置和运动,效果很好。 【参考方案1】:

我自己在类似的“看似随机”的时间也遇到了同样的错误。一些调试跟踪确定这是由于应用程序有时在将其发送到后台时尝试加载其 coreml 模型,然后在重新加载到前台时崩溃或冻结。

消息Error computing NN outputs error前面是:

Execution of the command buffer was aborted due to an error during execution. Insufficient Permission (to submit GPU work from background) (IOAF code 6)

当应用程序处于后台时,我不需要(或不希望)使用模型,因此我检测到应用程序何时进入/退出后台,在尝试调用之前设置一个标志并使用保护语句模型。

    在 AppDelegate.swift 文件中使用 applicationWillResignActive 进入后台时检测并设置 Bool 标志,例如appInBackground = true。更多信息请参见:Detect ios app entering background

    在同一个 AppDelegate.swift 文件中使用 applicationDidBecomeActive 检测应用何时重新进入前台,并重置标志 appInBackground = false

    然后在调用模型的函数中,就在调用模型之前,使用如下语句:

    guard appInBackground == false else return // new line to add guard let model = try? VNCoreMLModel(for modelName.model) else fatalError("could not load model") // original line to load model

我怀疑这是最优雅的解决方案,但它对我有用。

我还没有确定为什么在后台加载模型的尝试有时会发生。

在您链接到的 Apple 示例中,看起来他们的应用只调用模型以响应用户输入,因此它永远不会在后台尝试加载模型。因此,我的情况有所不同......可能还有你的情况?

【讨论】:

【参考方案2】:

最后,我们设置usesCPUOnly 标志就足够了。在 iOS 中似乎禁止在后台使用 GPU。苹果实际上也在他们的documentation 中写过这个。要指定这个标志,我们不能再使用生成的模型类,而是必须调用原始的 coreml 类。然而,我可以想象这在未来的版本中会发生变化。下面的 sn-p 取自生成的模型类,但指定了添加的MLPredictionOptions

let options = MLPredictionOptions()
options.usesCPUOnly = true // Can't use GPU in the background

// Copied from from the generated model class
let input = model_input(input: mlMultiArray)
let output = try generatedModel.model.prediction(from: input, options: options)
let result = model_output(output: output.featureValue(for: "output")!.multiArrayValue!).output

【讨论】:

完全错过了他们在Discussion 部分添加的内容,我从 GPU 分析中知道基于 GPU 的后台模型会失败。 ? @Simon Bengtsson 我有这个问题,但它只是在模型初始化期间崩溃。而且我只能在预测时间内发送选项 CpuFlag。有什么想法吗? 您收到NN outputs 错误吗?如果不是,您可能有不同的问题,然后在此处描述。

以上是关于后台运行coreml时出错:Error计算NN输出错误的主要内容,如果未能解决你的问题,请参考以下文章

准备 CoreML 模型时出错:CoreML 代码生成不支持“<something>”

将 keras 模型转换为 coreml 时出错(“InputLayer”对象不可迭代)

初始化 CoreML 模型时崩溃:Error Domain=com.apple.CoreML Code=0 "Error in declaring network."

当应用程序进入后台时,应用程序在前台使用带有 GPU 的 CoreML 无法切换到 CPU

PHP运行时强制显示出错信息

如何格式化从keras转换的coreml中conv1d/lstm nn的输入数据