Приложение использует CoreML с графическим процессором на переднем плане, не может переключиться на ЦП, когда приложение переходит в фоновый режим

Я работаю со Swift над реализацией CoreML в приложении для iOS. Находясь на переднем плане, я хочу, чтобы CoreML использовал GPU для повышения производительности, однако при переключении в фоновый режим CoreML должен использовать CPU, потому что в iOS GPU не может работать в фоновом режиме.

Однако в фоновом режиме графический процессор выдает ошибку разрешения, говорящую о том, что нет разрешения на использование графического процессора в фоновом режиме. Но в коде я уже зарегистрировал CoreML для использования ЦП только тогда, когда приложение находится в фоновом режиме, но похоже, что класс CoreML не читает параметр.

Сообщение об ошибке, полученное, когда CoreML работает в фоновом режиме, несмотря на то, что для параметра useCpuOnly установлено значение true.

2019-07-23 12:04:21.747498+0800 Demo[351:9947] Execution of the command buffer was aborted due to an error during execution. Insufficient Permission (to submit GPU work from background) (IOAF code 6)
Error: command buffer exited with error status.
    The Metal Performance Shaders operations encoded on it may not have completed.
    Error: 
    (null)
    Insufficient Permission (to submit GPU work from background) (IOAF code 6)
    <AGXA9FamilyCommandBuffer: 0x106b70720>
    label = <none> 
    device = <AGXA9Device: 0x10bdc4000>
        name = Apple A9 GPU 
    commandQueue = <AGXA9FamilyCommandQueue: 0x106a7f670>
        label = <none> 
        device = <AGXA9Device: 0x10bdc4000>
            name = Apple A9 GPU 
    retainedReferences = 1
2019-07-23 12:04:21.748800+0800 Demo[351:9982] [espresso] [Espresso::handle_ex_plan] exception=Espresso exception: "Generic error": Insufficient Permission (to submit GPU work from background) (IOAF code 6); code=7 status=-1
2019-07-23 12:04:21.749744+0800 Demo[351:9982] [StarMobile] [ERROR] CoreMLClassifier:112 processClassifications(for:error:) error: Unable to classify image. : Optional(Error Domain=com.apple.vis Code=9 "Could not run network (-1: ESPRESSO_STATUS_ERROR_GENERIC)" UserInfo={NSLocalizedDescription=Could not run network (-1: ESPRESSO_STATUS_ERROR_GENERIC)})
2019-07-23 12:04:21.750350+0800 Demo[351:9982] [StarMobile] [ERROR] CoreMLClassifier:105 updateClassifications(for:as:) Failed to perform classification.
Could not run network (-1: ESPRESSO_STATUS_ERROR_GENERIC)

Пожалуйста помоги!

// AppDelegate.swift
func applicationWillResignActive(_ application: UIApplication) {
    Constants.APP_IS_IN_FOREGROUND = false
}
func applicationDidBecomeActive(_ application: UIApplication) {
    Constants.APP_IS_IN_FOREGROUND = true
}

// Main.swift
class Main() {
    func run_coreml(imageData: Data) {
        do {
            self.usesCpuOnly = Constants.APP_IS_IN_FOREGROUND
            let configuration = MLModelConfiguration()
            if self.usesCpuOnly {
                 configuration.computeUnits = .cpuOnly
            } else {
                 configuration.computeUnits = .all
            }
            let model = try VNCoreMLModel(for: 
            CoreMLImageClassifier(configuration: configuration).model)

            let request = VNCoreMLRequest(model: model, 
            completionHandler: 
            { [weak self] request, error in
                 self?.process(for: request, error: error)
            })
            request.usesCPUOnly = self.usesCpuOnly

            let handler = VNImageRequestHandler(data: imageData)
            try handler.perform([request])
         } catch {}
    }

   // omit implementation
   func process() {}
}

person maymaymaymaymay    schedule 23.07.2019    source источник


Ответы (1)


Когда приложение перейдет в фоновый режим, вам нужно будет создать новый экземпляр VNCoreMLModel с конфигурацией, установленной на .cpuOnly, и создать новый экземпляр VNCoreMLRequest. Core ML не переключается автоматически с GPU на CPU.

person Matthijs Hollemans    schedule 23.07.2019
comment
Я инициализирую новую модель при каждом запуске, но она не работает. - person maymaymaymaymay; 23.07.2019