TensorRT 增加内存使用(泄漏?)

Posted

技术标签:

【中文标题】TensorRT 增加内存使用(泄漏?)【英文标题】:TensorRT increasing memory usage (leak?) 【发布时间】:2020-05-28 21:40:23 【问题描述】:

我有一个循环,我将 ONNX 模型解析为 TensorRT,创建一个引擎并进行推理。 我确保我在所有对象上调用 x->destroy() 并为每个 cudaMalloc 使用 cudaFree。 然而,在连续迭代中,我通过 nvidia-smi 不断增加内存使用量。 我真的不确定问题出在哪里。 cuda-memcheck 工具也没有报告泄漏。 运行 Ubuntu 18.04、TensorRT 7.0.0、CUDA 10.2 并使用 GTX 1070。 代码、ONNX 文件以及 CMakeLists.txt 可在 this repo 上获得

这是代码

#include <memory>
#include <iostream>
#include <cuda_runtime_api.h>
#include <NvOnnxParser.h>
#include <NvInfer.h>

class Logger : public nvinfer1::ILogger           

    void log(Severity severity, const char* msg) override
    
        // suppress info-level messages
        if (severity != Severity::kINFO)
            std::cout << msg << std::endl;
    
;


int main(int argc, char * argv[])

    Logger gLogger;

    auto builder = nvinfer1::createInferBuilder(gLogger);

    const auto explicitBatch = 1U << static_cast<uint32_t>(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
    auto network = builder->createNetworkV2(explicitBatch);

    auto config = builder->createBuilderConfig();

    auto parser = nvonnxparser::createParser(*network, gLogger);

    parser->parseFromFile("../model.onnx", static_cast<int>(0));
    builder->setMaxBatchSize(1);
    config->setMaxWorkspaceSize(128 * (1 << 20)); // 128 MiB

    auto engine = builder->buildEngineWithConfig(*network, *config);

    builder->destroy();
    network->destroy();
    parser->destroy();
    config->destroy();

    for(int i=0; i< atoi(argv[1]); i++)
    
        auto context = engine->createExecutionContext();
        void* deviceBuffers[2]0;

        int inputIndex = engine->getBindingIndex("input_rgb:0");
        constexpr int inputNumel = 1 * 128 * 64 * 3;
        int outputIndex = engine->getBindingIndex("truediv:0");
        constexpr int outputNumel = 1 * 128;

        //TODO: Remove batch size hardcoding
        cudaMalloc(&deviceBuffers[inputIndex], 1 * sizeof(float) * inputNumel);
        cudaMalloc(&deviceBuffers[outputIndex], 1 * sizeof(float) * outputNumel);

        cudaStream_t stream;
        cudaStreamCreate(&stream);

        float inBuffer[inputNumel] = 0;
        float outBuffer[outputNumel] = 0;

        cudaMemcpyAsync(deviceBuffers[inputIndex], inBuffer, 1 * sizeof(float) * inputNumel, cudaMemcpyHostToDevice, stream);

        context->enqueueV2(deviceBuffers, stream, nullptr);

        cudaMemcpyAsync(outBuffer, deviceBuffers[outputIndex], 1 * sizeof(float) * outputNumel, cudaMemcpyDeviceToHost, stream);

        cudaStreamSynchronize(stream);

        cudaFree(deviceBuffers[inputIndex]);
        cudaFree(deviceBuffers[outputIndex]);

        cudaStreamDestroy(stream);

        context->destroy();
    
    engine->destroy();

    return 0;



【问题讨论】:

如果您有重现案例,我会直接联系 NVIDIA 并将其报告为可能的错误 我是新手,所以只是想确保我正确使用了库 【参考方案1】:

看起来问题来自重复的 IExecutionContext 创建,尽管在每次迭代结束时都会销毁它。在引擎为我解决问题的同时创建/删除上下文。尽管如此,它仍然可能是一个错误,上下文创建会泄漏一点内存,并且泄漏会随着时间的推移而累积。提交了一个 github 问题。

【讨论】:

Stack Overflow 不仅仅是为您自己的问题找到解决方案,而是为阅读此问答时遇到类似问题的每个人找到它,因此请附上 Github 问题的实际链接,以便任何人都可以确定这种内存泄漏是否真的存在/存在。

以上是关于TensorRT 增加内存使用(泄漏?)的主要内容,如果未能解决你的问题,请参考以下文章

MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏。添加了 11 个消息列表。使用emitter.setMaxListeners() 增加限制

Socket.io 聊天应用程序显示检测到 EventEmitter 内存泄漏。增加了 11 位听众。使用发射器.setMaxListeners()

AJAX 请求 + jQuery 的内存泄漏

排查内存泄漏最简单和直观的方法

httpd [apache 2.4] 内存泄漏问题

我在 Android 中使用 ListActivity 时出现内存泄漏