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

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 } 编辑:我试过了,那一个在后台工作,所以它似乎是特定于我

我在iPhone 6上运行一个来自keras的mlmodel。预测通常会失败,错误为
计算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输出
    错误?如果没有,你可能有一个不同的问题,然后在这里描述。完全没有注意到他们在
    讨论中添加了这个问题>我知道