Минимальное предсказание утечки памяти CoreML - PullRequest
0 голосов
/ 11 февраля 2019

У меня утечка памяти (память приложения только увеличивается) при использовании прогноза CoreML.Я не могу найти какую-либо документацию или примеры, где что-то выпускается, что я мог бы пропустить.В моем реальном проекте у меня отключен ARC, но не здесь (поэтому компилятор не позволяет мне что-либо выпускать вручную, поэтому я думаю, что те вещи, которые я пробовал, не нуждаются в этом)

IЯ уменьшил его до минимального случая, доступного на github .Но вот 99% (хранилище просто имеет модель и дополнительные ресурсы проекта, а также больше проверок на ошибки - ошибок нет, прогноз работает нормально, но урезан для стекового потока)

#import <Cocoa/Cocoa.h>
#import  "SsdMobilenet.h"
#include <string>
#include <iostream>

uint8_t ImageBytes[300*300*4];

CVPixelBufferRef MakePixelBuffer(size_t Width,size_t Height)
{
    auto* Pixels = ImageBytes;
    auto BytesPerRow = Width * 4;
    CVPixelBufferRef PixelBuffer = nullptr;
    auto Result = CVPixelBufferCreateWithBytes( nullptr, Width, Height, kCVPixelFormatType_32BGRA, Pixels, BytesPerRow, nullptr, nullptr, nullptr, &PixelBuffer );
    return PixelBuffer;
}

int main(int argc, const char * argv[])
{
    auto* Pixels = MakePixelBuffer(300,300);

    SsdMobilenet* ssd = nullptr;

    for ( auto i=0; i<10000;    i++ )
    {
        if ( !ssd )
        {
            ssd = [[SsdMobilenet alloc] init];
        }
        auto* Output = [ssd predictionFromPreprocessor__sub__0:Pixels error:nullptr];
    }
    return 0;
}

Есть ли что-тоЯ должен очистить, освободить, освободить, сдать?Я пытался выпустить ssd и воссоздавать его каждую итерацию, но это не помогает.

На HighSierra 10.13.6, xcode 10.1 (10B61).

Утечка происходит на этом imac 2011 года (без металла, при выполнении процессора) и MBP Retina 2013 года (который работает на GPU), а также с другими моделями, не только с SSDMobileNet.

Редактировать 1: Видв инструменты, используя Generations / Snapshots, действительно кажется, что это утечка выходных данных, но я не могу dealloc или release, так что, может быть, мне нужно что-то еще сделать, чтобы освободить результаты?<non-object> - это все распределения внутри вызовов apply_convulution_layer() глубоко внутри CoreML.Instruments Generations

1 Ответ

0 голосов
/ 11 февраля 2019

Благодаря @ Matthijs-Hollemans, использующему NSAutoReleasePool с отключенной ARC, это не дает утечки.(Я также могу автоматически освобождать SSD, но эта конкретная комбинация сохраняет предварительно выделенный SSD постоянным).

У меня нет решения для сборок ARC / AutoReferenceCounting, так как NSAutoReleasePool недоступен.

int main(int argc, const char * argv[])
{
    auto* Pixels = MakePixelBuffer(300,300);

    SsdMobilenet* ssd = [[SsdMobilenet alloc] init];
    //SsdMobilenet* ssd = nullptr;

    for ( auto i=0; i<10000;    i++ )
    {
        NSAutoreleasePool* pool= [[NSAutoreleasePool alloc]init];
        if ( !ssd )
        {
            ssd = [[SsdMobilenet alloc] init];
        }
        auto* Output = [ssd predictionFromPreprocessor__sub__0:Pixels error:nullptr];
        //[Output release];
        //[ssd release];
        //ssd = nullptr;
        [pool drain];
    }
    return 0;
}
...