Swift 在后台运行coreml时出错:错误计算NN输出错误
我在iPhone 6上运行一个来自keras的mlmodel。预测通常会失败,错误为Swift 在后台运行coreml时出错:错误计算NN输出错误,swift,ios11,coreml,Swift,Ios11,Coreml,我在iPhone 6上运行一个来自keras的mlmodel。预测通常会失败,错误为计算NN输出时出错。有人知道原因是什么吗?如果我能做些什么 do { return try model.prediction(input1: input) } catch let err { fatalError(err.localizedDescription) // Error computing NN outputs error } 编辑:我试过了,那一个在后台工作,所以它似乎是特定于我
计算NN输出时出错。有人知道原因是什么吗?如果我能做些什么
do {
return try model.prediction(input1: input)
} catch let err {
fatalError(err.localizedDescription) // Error computing NN outputs error
}
编辑:我试过了,那一个在后台工作,所以它似乎是特定于我们的项目或模型类型的。我自己在类似的“看似随机”的时间里也遇到了同样的错误。一点调试跟踪表明,这是由于应用程序有时试图在发送到后台时加载其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文件中的applicationwillresignative
进入后台时进行检测,并设置Bool标志,例如appInBackground=true
。有关更多信息,请参见此:
使用同一AppDelegate.swift文件中的applicationIDbecomeactive
检测应用程序何时重新进入前台,并重置标志appInBackground=false
然后在调用模型的函数中,在调用模型之前,使用如下语句:
guard-appInBackground==false-else{return}//要添加的新行
卫兵让模型=尝试?VNCoreMLModel(对于modelName.model)else{fatalError(“无法加载模型”)//加载模型的原始行
我怀疑这是最优雅的解决方案,但它对我有效
我还没有确定为什么在后台加载模型的尝试只是偶尔发生
在您链接到的苹果示例中,他们的应用程序似乎只会调用模型以响应用户输入,因此在后台它永远不会尝试加载模型。因此,我的情况不同……可能你的情况也不同?我自己在类似的“看似随机”中也遇到了同样的错误一点调试跟踪证实,这是由于应用程序有时试图在发送到后台时加载其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文件中使用application willresignative
进入后台时进行检测,并设置Bool标志,例如appInBackground=true
。有关更多信息,请参阅此:
使用同一AppDelegate.swift文件中的applicationIDbecomeactive
检测应用程序何时重新进入前台,并重置标志appInBackground=false
然后在调用模型的函数中,在调用模型之前,使用如下语句:
guard-appInBackground==false-else{return}//要添加的新行
guard let model=try?VNCoreMLModel(对于modelName.model)else{fatalError(“无法加载模型”)//加载模型的原始行
我怀疑这是最优雅的解决方案,但它对我有效
我还没有确定为什么在后台加载模型的尝试只是偶尔发生
在您链接到的苹果示例中,他们的应用程序似乎只会调用模型以响应用户输入,因此在后台它永远不会尝试加载模型。因此,在我的情况下……可能你的情况下也会有所不同?最后,我们设置usesCPUOnly
标志就足够了。在后台使用GPUnd在iOS中似乎是被禁止的。苹果实际上也在他们的版本中写到了这一点。为了指定这个标志,我们不能再使用生成的模型类,而是必须调用原始的coreml类。我可以想象在未来的版本中会发生这种变化。下面的代码片段取自生成的模型类,但添加了MLPredicti指定了选项
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
最后,我们设置了usesCPUOnly
标志就足够了。在iOS中,在后台使用GPU似乎是被禁止的。苹果实际上也在他们的文件中写到了这一点。为了指定这个标志,我们不能再使用生成的模型类,而必须调用原始的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
我也看到过其他人的报告(在Stack Overflow或Apple Dev窗体上)。我不知道是什么原因造成的,但请注意,你不能无限期地在后台运行应用程序。我们正在开发一个在后台跟踪位置和运动的练习应用程序,效果很好。我也看到其他人的报告(此处为堆栈溢出或Apple Dev窗体)。我不知道是什么原因导致了这种情况,但请注意,你不能无限期地在后台运行应用程序。我们正在开发一个在后台跟踪位置和运动的练习应用程序,效果非常好。完全没有注意到他们在讨论
部分中添加的内容,我从GPU评测中了解到,基于GPU的后台模型uld失败。@Simon Bengtsson我有这个问题,但它只是在模型初始化时崩溃。我只能在预测时间内发送选项CpuFlag。有什么想法吗?你有没有得到NN输出
错误?如果没有,你可能有一个不同的问题,然后在这里描述。完全没有注意到他们在讨论中添加了这个问题>我知道