Core ML异步预测触发BAD_ACCESS,性能优化遇阻求助
macOS Core ML + ScreenCaptureKit 异步预测崩溃与性能优化问题
问题背景
我开发了一款面向macOS的Core ML预测应用,应用能正常运行,但实际预测耗时是Xcode性能报告显示值的两倍。参考WWDC2023视频提到异步可提升预测速度,尝试用异步方法优化时,持续触发BAD_ACCESS错误,且无法定位崩溃位置。
核心代码流程
从ScreenCaptureKit的CMSampleBuffer.imageBuffer输入,流程为runModel()→Metal缩放CVPixelBuffer→预测→向Metal Renderer设置RenderData,代码如下:
func runModel(on pixelBuffer: CVPixelBuffer) { guard let surface = getIOSurface(from: pixelBuffer) else { return } Task { guard let result = try? await self.performInference(surface) else { return } await ScreenRecorder.shared .setRenderDataNormalized(surface: surface, depthData: result) } } func performInference(_ surface: IOSurface) async throws ->[Float]? { try Task.checkCancellation() guard let model = mlmodel else {return nil} // 从IOSurface获取CVPixelBuffer var px: Unmanaged<CVPixelBuffer>? let status = CVPixelBufferCreateWithIOSurface(kCFAllocatorDefault, surface, nil, &px) guard status == kCVReturnSuccess, let px2 = px?.takeRetainedValue() else { return nil } // 缩放输入图像 guard let data = metalResizeFrame(sourcePixelFrame: px2, targetSize: MTLSize.init(width: InputWidth, height: InputHeight, depth: 1), resizeMode: .scaleToFill) else { os_log("Preprocessing failed", type: .error) return nil } // 异步模型预测 let input = model_smallInput(input: data) let prediction = try await model.model.prediction(from: input) // 转换结果格式 var results: [Float] = [] if let output = prediction.featureValue(for: "output")?.multiArrayValue { if let bufferPointer = try? UnsafeBufferPointer<Float>(output) { results = Array(bufferPointer) } } return results }
我曾尝试将IOSurface存入数组以维持其生命周期,仍出现崩溃。
2024-10-15 更新:完整执行流程
createFrame(sampleBuffer: CMSampleBuffer) runModel(pixelBuffer: CVPixelBuffer) await performInference(surface: IOSurface) - metalResizeFrame(sourcePixelFrame: CVPixelBuffer, targetSize: MTLSize, resizeMode: ResizeMode) - await model.prediction(input: ModelInput) await setRenderDataNormalized(surface: IOSurface, depthData: [Float])
Xcode显示崩溃发生在未调用的方法处;我使用的是ScreenCaptureKit异步屏幕捕获示例,推测单流程中使用await可能因后续屏幕捕获输入导致崩溃。
疑问
- 是否应避免使用异步预测?
- ScreenCaptureKit流搭配模型预测是否必须同步?
- 若需同步,该如何提升预测速度?
内容的提问来源于stack exchange,提问作者timyau
相关产品推荐
相关产品推荐

