iPhone Xs上的样式转移模型使用更多的内存

3
我正在使用 Core ML 模型进行图像风格转移。在 iOS 12 的 iPhone X 上,初始化一个模型需要约 60 MB 的内存。然而,在 iPhone Xs (Max) 上加载相同的模型会占用超过 700 MB 的 RAM。
在 Instruments 中,我可以看到运行时分配了 38 个 IOSurface,并且每个 IOSurface 的内存印记高达 54 MB,以及其他许多与 Core ML (Espresso) 相关的对象。这些对象在 iPhone X 上不存在。
我猜想 Core ML 运行时做了一些不同的事情来利用 A12 的性能。然而,我的应用由于内存压力而崩溃。
我已经尝试使用最新版本的`coremltools`再次转换我的模型。但是,它们是完全相同的。
我错过了什么吗?

如果你强制Core ML使用CPU进行预测,这种情况是否也会发生? - Matthijs Hollemans
这种情况发生在模型初始化时。由于内存消耗过大,应用程序甚至无法进行预测就会崩溃。 - Frank Rupprecht
听起来像是 Core ML 中的一个错误。我会提交一个漏洞报告。 - Matthijs Hollemans
是的,我做了。让我们看看... - Frank Rupprecht
1个回答

2
这里是我发现的一些结果和解决方法:
从Instruments中看到,我得出结论,当初始化模型时(使用方法Espresso::ANERuntimeEngine::blob_container::force_allocate()),CoreML运行时会预先分配执行神经网络所需的所有缓冲区(因此有许多IOSurfaces)。有趣的是,这种情况只发生在具有相对较高输入大小(1792 x 1792)的模型上,而不是较小的模型(1024 x 1024)。
由于这仅发生在Xs上,我认为它与A12的神经引擎有关。因此,我将该模型配置为仅使用CPU和GPU作为计算单元(MLComputeUnitsCPUAndGPU而不是MLComputeUnitsAll),这样就解决了问题-没有预先分配的缓冲区。因此,我目前正在使用这个解决方法。

是的,ANERuntimeEngine 是为神经引擎设计的。通过您的解决方法,您可能使用的是 MPSEngine。 - Matthijs Hollemans
好的,知道了,很有道理。谢谢! - Frank Rupprecht

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接