我在iPhone 6上运行来自keras的ml模型。预测通常会因错误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,并且该版本在后台运行,因此它似乎特定于我们的项目或模型类型。
答案 0 :(得分:5)
最后,我们可以设置usesCPUOnly
标志。 iOS中禁止在后台使用GPU。 Apple实际上也在documentation中写了这个。要指定此标志,我们不能再使用生成的模型类,而是必须调用原始coreml类。我可以想象这在未来的版本中会发生变化。下面的代码段取自生成的模型类,但添加了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
答案 1 :(得分:2)
我在类似的情况下自己也得到了同样的错误"看似随意的#34;倍。一些调试跟踪确定它是由应用程序有时在发送到后台时尝试加载其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示例中,看起来他们的应用程序只响应用户输入而调用模型,因此它永远不会尝试在后台加载模型。因此我的情况有所不同......也可能是你的情况?