Модели передачи стиля, использующие намного больше памяти на iPhone Xs
Я использую модели Core ML для передачи стиля изображения. Инициализированная модель занимает около 60 МБ памяти на iPhone X в iOS 12. Однако та же модель, загруженная на iPhone Xs (Max), потребляет более 700 МБ ОЗУ.
В инструментах я вижу, что среда выполнения выделяет 38 IOSurfaces с пищевым отпечатком памяти объемом до 54 МБ каждый вместе со многими другими объектами, связанными с Core ML (Espresso). Таких нет на iPhone X.
Я предполагаю, что время выполнения Core ML делает что-то другое, чтобы использовать всю мощь A12. Тем не менее, мое приложение падает из-за нехватки памяти.
Я уже пытался конвертировать мои модели снова с новейшей версией coremltools
, Однако они идентичны.
Я что-то пропустил?
1 ответ
Вот некоторые выводы и обходные пути, которые я нашел:
Из того, что я увидел в Instruments, я пришел к выводу, что среда выполнения CoreML предварительно выделяет все буферы (отсюда и множество IOSurfaces), необходимые для выполнения нейронной сети при инициализации модели (используя метод Espresso::ANERuntimeEngine::blob_container::force_allocate()
). Интересно, что это происходит только для моделей с относительно высоким входным размером (1792 x 1792), а не для более мелких (1024 x 1024).
Поскольку это происходит только на X, я предположил, что это как-то связано с нейронным двигателем A12. Поэтому я настроил модель для использования CPU и GPU только в качестве вычислительного устройства (MLComputeUnitsCPUAndGPU
вместо MLComputeUnitsAll
) и это добилось цели - больше не было заранее выделенных буферов. Так что сейчас я использую это в качестве обходного пути.