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()