国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【TensorRT】c++使用面向?qū)ο髞?lái)封裝tensorRT推理代碼的指針釋放問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了【TensorRT】c++使用面向?qū)ο髞?lái)封裝tensorRT推理代碼的指針釋放問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、??代碼框架??

初始化模型

std::shared_ptr<nvinfer1::IExecutionContext> Instance::Init_Instance(const char* model_path, const string class_name_path)
{
    //注冊(cè)防止反序列化報(bào)錯(cuò)
    nvinfer1::ILogger* gLogger = NULL;
    initLibNvInferPlugins(gLogger, "");

    TRTLogger logger;
    ifstream fs(model_path, std::ios::binary);
    std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(fs), {});
    fs.close();
    std::shared_ptr<nvinfer1::IRuntime> runtime = make_nvshared(nvinfer1::createInferRuntime(logger));
    //nvinfer1::IRuntime *runtime = nvinfer1::createInferRuntime(logger);

    _engine = make_nvshared(runtime->deserializeCudaEngine((void*)buffer.data(), buffer.size()));
    //_engine = runtime->deserializeCudaEngine((void*)buffer.data(), buffer.size());

    Malloc_data();
    class_names = get_name(class_name_path);

    //初始化cuda流,不需要了,在類中已經(jīng)作為成員變量初始化了
    //cudaStream_t stream = nullptr;
    checkRuntime(cudaStreamCreate(&stream));
    //創(chuàng)建執(zhí)行的上下文
    auto execution_context = make_nvshared(_engine->createExecutionContext());
    return execution_context;
}

這里可以看到我用了智能指針來(lái)分別定義_engine, _runtime, _context。并且我在頭文件中定義了一個(gè)類來(lái)封裝我的推理代碼,包括初始化模型的步驟:


類封裝

class Instance {
public:
    Instance(float scale_):scale(scale_)
    {
        cout << "調(diào)用了構(gòu)造函數(shù)" << endl;
    }
    ~Instance() {
        cout << "調(diào)用了析構(gòu)函數(shù)" << endl;
    };
    float scale;
    std::shared_ptr < nvinfer1::IExecutionContext > _context = nullptr;
    //nvinfer1::IExecutionContext* _context = nullptr;

    vector<string> class_names;
    string total_output;

	std::shared_ptr<nvinfer1::IExecutionContext> Init_Instance(const char* model_path, const string class_name_path);
    //nvinfer1::IExecutionContext* Init_Instance(const char* model_path, const string class_name_path);

	void Run_Instance(cv::Mat input);
    void check_ptr();
    void Free_Memory();
    vector<string> get_name(string class_name_path);
    void destory_engine();

private:

    void Malloc_data();
    cv::cuda::GpuMat ProcessImage(cv::cuda::GpuMat pre_input);
    void PostcessImage(cv::Mat nums, cv::Mat boxes, cv::Mat scores, cv::Mat classes, cv::Mat masks);
    //void Init_parameters();

    int INPUT_SIZE = 1344;
    int MIN_SIZE = 800;
    int MAX_SIZE = 1333;
    int MASK_SIZE = 28;
    float CONFIDENCE = 0;
    float MASK_THRESHOLD = 0.5;
    int input_numel = 1;
    int output_nums_numel = 1;
    int output_boxes_numel = 1;
    int output_scores_numel = 1;
    int output_classes_numel = 1;
    int output_masks_numel = 1;
    cv::Mat INPUT;

    cudaStream_t stream = nullptr;
    std::shared_ptr<nvinfer1::ICudaEngine> _engine = nullptr;
    std::shared_ptr<nvinfer1::IRuntime> _runtime = nullptr;
    //nvinfer1::ICudaEngine* _engine = nullptr;
    //nvinfer1::IRuntime* _runtime = nullptr;

  
    //初始化輸入和輸出指針
    //static float* input_host_data = nullptr;
    float* input_device_data = nullptr;
    Output_ptr output_host = { nullptr, nullptr, nullptr, nullptr, nullptr };
    Output_ptr output_device = { nullptr, nullptr, nullptr, nullptr, nullptr };
};

在這里可以看到,我已經(jīng)將_engine, _runtime, _context都定義在了類的成員變量當(dāng)中,并且都用的智能指針shared_ptr的方式。(并且我也在類中封裝了Malloc_data()和Free_malloc()函數(shù),作用分別是為tensorRT推理時(shí)在host和device上為輸入輸出的指針?lè)峙浯鎯?chǔ)空間,和在執(zhí)行推理完畢后,將host和device上分配的指針指向的內(nèi)存空間手動(dòng)釋放掉)。


主函數(shù)
第一次封裝是將我的推理代碼封裝在類中,為了方便c#軟件調(diào)用部署導(dǎo)出的dll,我們將進(jìn)行二次封裝,因此主函數(shù)的接口使用的是二次封裝的:

#include "port.h"

int main()
{
	cv::String folder = ;
	std::vector<cv::String> paths;
	cv::glob(folder, paths);
	const char* model_path = ;
	const string class_path = ;
	Init_model(model_path, class_path);
	for (int i = 0; i < paths.size(); i++)
	{
		char* y_output = NULL;
		cv::Mat input = cv::imread(paths[i]);
		cv::Mat bgr[3];
		cv::split(input, bgr);
		uchar* b_ptr = bgr[0].data;
		uchar* g_ptr = bgr[1].data;
		uchar* r_ptr = bgr[2].data;
		auto time_start = std::chrono::system_clock::now();
		Run_model(b_ptr, g_ptr, r_ptr, 800, 800, 3, y_output);
		auto time_end = std::chrono::system_clock::now();
		std::chrono::duration<double> diff = time_end - time_start;
		cout << y_output;
		cout << "deep learning cost time : " << diff.count() * 1000 << "ms" << endl << endl;
	}
	Free_memory();
	check_Ptr();
	destory_trt();
	system("pause");
	return 0;
}

可以看到在上述代碼經(jīng)過(guò)一個(gè)for循環(huán)遍歷完所有要檢測(cè)的圖像之后,在循環(huán)外部,程序即將結(jié)束之前,我們調(diào)用了Free_memory()來(lái)手動(dòng)釋放host和device指針指向的內(nèi)存以及釋放推理時(shí)創(chuàng)建的cuda流,并且通過(guò)Check_ptr()方法來(lái)判斷指針是否被釋放完成。最后我們通過(guò)destory_trt()接口來(lái)釋放推理時(shí)創(chuàng)建的_engine, _runtime, _context。最后跑出的推理結(jié)果十分正確,代碼跑的也很流暢沒(méi)有bug,并且通過(guò)一個(gè)寫(xiě)了一個(gè)while死循環(huán)來(lái)跑也沒(méi)有發(fā)現(xiàn)內(nèi)存泄露。到這里我以為我已經(jīng)大功告成了。


二、??問(wèn)題以及分析??

【TensorRT】c++使用面向?qū)ο髞?lái)封裝tensorRT推理代碼的指針釋放問(wèn)題,推理平臺(tái)|TensorRT,c++,開(kāi)發(fā)語(yǔ)言,CUDA
這是終端跑出來(lái)的結(jié)果,可以看到執(zhí)行完了Free_memory()并且通過(guò)check_ptr()方法,我們可以判斷指針已經(jīng)釋放完畢了。但是當(dāng)我們經(jīng)過(guò)system(“pause”)繼續(xù)往下執(zhí)行推出程序時(shí),問(wèn)題就來(lái)了:
【TensorRT】c++使用面向?qū)ο髞?lái)封裝tensorRT推理代碼的指針釋放問(wèn)題,推理平臺(tái)|TensorRT,c++,開(kāi)發(fā)語(yǔ)言,CUDA
是NvInferRuntime.h所報(bào)出的問(wèn)題,顯示我們可管理的指針將被執(zhí)行兩次釋放,說(shuō)人話就是我們的指針已經(jīng)釋放完了,但是現(xiàn)在又要執(zhí)行那個(gè)指針的釋放,電腦也不知道咋辦了,只能拋出錯(cuò)誤。于是乎,我便開(kāi)始從頭開(kāi)始查詢我的代碼,看看到底哪里多釋放了一次,后來(lái)突然發(fā)現(xiàn),由于我使用了智能指針,智能指針在其完成調(diào)用之后,根據(jù)引用計(jì)數(shù)可以自動(dòng)釋放,而我的這些_engine, _context, _runtime,也都已經(jīng)在類的成員變量中定義過(guò)了,在類中如果不是new出來(lái)的內(nèi)存,其他的都會(huì)隨著程序的執(zhí)行結(jié)束而自動(dòng)銷毀(new出來(lái)的內(nèi)存需要手動(dòng)delete)。到這里我才恍然大悟,既然我用類來(lái)封裝代碼了,因此也不需要通過(guò)智能指針的方式來(lái)定義推理的變量了,因此我將這三個(gè)智能指針換成了普通指針,最后運(yùn)行,沒(méi)有問(wèn)題!
【TensorRT】c++使用面向?qū)ο髞?lái)封裝tensorRT推理代碼的指針釋放問(wèn)題,推理平臺(tái)|TensorRT,c++,開(kāi)發(fā)語(yǔ)言,CUDA文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-802182.html

到了這里,關(guān)于【TensorRT】c++使用面向?qū)ο髞?lái)封裝tensorRT推理代碼的指針釋放問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • yolov7的 TensorRT c++推理,win10, cuda11.4.3 ,cudnn8.2.4.15,tensorrt8.2.1.8。

    yolov7的 TensorRT c++推理,win10, cuda11.4.3 ,cudnn8.2.4.15,tensorrt8.2.1.8。

    yolov7的 tensorrt8 推理, c++ 版本 環(huán)境 win10 vs2019 opencv4.5.5 cuda_11.4.3_472.50_win10.exe cudnn-11.4-windows-x64-v8.2.4.15 TensorRT-8.2.1.8.Windows10.x86_64.cuda-11.4.cudnn8.2.zip RTX2060推理yolov7, FP32 耗時(shí) 28ms? ,F(xiàn)P16 耗時(shí) 8ms,單幀對(duì)應(yīng)總耗時(shí)30ms 和 10ms。 推理yolov7-tiny,F(xiàn)P32 耗時(shí) 8ms? ,F(xiàn)P16 耗時(shí) 2ms。 tensorr

    2024年02月15日
    瀏覽(21)
  • 【模型部署 01】C++實(shí)現(xiàn)GoogLeNet在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署

    【模型部署 01】C++實(shí)現(xiàn)GoogLeNet在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署

    深度學(xué)習(xí)領(lǐng)域常用的基于CPU/GPU的推理方式有OpenCV DNN、ONNXRuntime、TensorRT以及OpenVINO。這幾種方式的推理過(guò)程可以統(tǒng)一用下圖來(lái)概述。整體可分為模型初始化部分和推理部分,后者包括步驟2-5。 以GoogLeNet模型為例,測(cè)得幾種推理方式在推理部分的耗時(shí)如下: 結(jié)論: GPU加速首選

    2024年02月06日
    瀏覽(27)
  • 【模型部署 01】C++實(shí)現(xiàn)分類模型(以GoogLeNet為例)在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署

    【模型部署 01】C++實(shí)現(xiàn)分類模型(以GoogLeNet為例)在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署

    深度學(xué)習(xí)領(lǐng)域常用的基于CPU/GPU的推理方式有OpenCV DNN、ONNXRuntime、TensorRT以及OpenVINO。這幾種方式的推理過(guò)程可以統(tǒng)一用下圖來(lái)概述。整體可分為模型初始化部分和推理部分,后者包括步驟2-5。 以GoogLeNet模型為例,測(cè)得幾種推理方式在推理部分的耗時(shí)如下: 結(jié)論: GPU加速首選

    2024年02月06日
    瀏覽(26)
  • TensorRT(C++)基礎(chǔ)代碼解析

    TensorRT(C++)基礎(chǔ)代碼解析

    TensorRT build engine的過(guò)程 創(chuàng)建builder 創(chuàng)建網(wǎng)絡(luò)定義:builder — network 配置參數(shù):builder — config 生成engine:builder — engine (network, config) 序列化保存:engine — serialize 釋放資源:delete 2.1.1 創(chuàng)建builder nvinfer1 是 NVIDIA TensorRT 的 C++ 接口命名空間。構(gòu)建階段的最高級(jí)別接口是 Builder。Bu

    2024年01月18日
    瀏覽(18)
  • 【深度學(xué)習(xí)】SDXL tensorRT 推理,Stable Diffusion 轉(zhuǎn)onnx,轉(zhuǎn)TensorRT

    【深度學(xué)習(xí)】SDXL tensorRT 推理,Stable Diffusion 轉(zhuǎn)onnx,轉(zhuǎn)TensorRT

    juggernautXL_version6Rundiffusion.safetensors文件是pth pytroch文件,需要先轉(zhuǎn)為diffusers 的文件結(jié)構(gòu)。 FP16在后面不好操作,所以最好先是FP32: 有了diffusers 的文件結(jié)構(gòu),就可以轉(zhuǎn)onnx文件。 項(xiàng)目:https://huggingface.co/docs/diffusers/optimization/onnx stabilityai/stable-diffusion-xl-1.0-tensorrt 項(xiàng)目:https://hug

    2024年01月19日
    瀏覽(16)
  • TensorRT 推理 (onnx->engine)

    TensorRT 推理 (onnx->engine)

    測(cè)試使用:【W(wǎng)in10+cuda11.0+cudnn8.2.1+TensorRT8.2.5.1】 關(guān)于安裝 一、模型轉(zhuǎn)換 onnx2trt 方法1:使用wang-xinyu/tensorrtx部署yolov5方法:https://wangsp.blog.csdn.net/article/details/121718501 方法2:使用tensorRT轉(zhuǎn)成engine 方法3:使用C++ onnx_tensorrt將onnx轉(zhuǎn)為trt 的推理engine 參考 【python 方法參考】 方法4:

    2023年04月08日
    瀏覽(16)
  • TensorRT推理手寫(xiě)數(shù)字分類(三)

    TensorRT推理手寫(xiě)數(shù)字分類(三)

    (一)使用pytorch搭建模型并訓(xùn)練 (二)將pth格式轉(zhuǎn)為onnx格式 (三)onxx格式轉(zhuǎn)為engine序列化文件并進(jìn)行推理 ??上一節(jié)我們已經(jīng)成功搭從pth文件轉(zhuǎn)為onnx格式的文件,并對(duì)導(dǎo)出的onnx文件進(jìn)行了驗(yàn)證,結(jié)果并無(wú)問(wèn)題。這一節(jié)我們就從這個(gè)onnx文件入手,一步一步生成engine文件并

    2024年02月12日
    瀏覽(27)
  • 【TensorRT】TensorRT C# API 項(xiàng)目更新 (1):支持動(dòng)態(tài)Bath輸入模型推理(下篇)

    【TensorRT】TensorRT C# API 項(xiàng)目更新 (1):支持動(dòng)態(tài)Bath輸入模型推理(下篇)

    關(guān)于該項(xiàng)目的調(diào)用方式在上一篇文章中已經(jīng)進(jìn)行了詳細(xì)介紹,具體使用可以參考《最新發(fā)布!TensorRT C# API :基于C#與TensorRT部署深度學(xué)習(xí)模型》,下面結(jié)合Yolov8-cls模型詳細(xì)介紹一下更新的接口使用方法。 4.1 創(chuàng)建并配置C#項(xiàng)目 ? 首先創(chuàng)建一個(gè)簡(jiǎn)單的C#項(xiàng)目,然后添加項(xiàng)目配置

    2024年04月17日
    瀏覽(21)
  • TensorRT創(chuàng)建Engine并推理engine

    NVIDIA TensorRT是一個(gè)高性能的深度學(xué)習(xí)推理庫(kù),專為部署神經(jīng)網(wǎng)絡(luò)模型而設(shè)計(jì)。TensorRT通過(guò)優(yōu)化和高效的內(nèi)存管理來(lái)提高模型的推理速度,從而提高整體應(yīng)用程序的性能。以下是使用TensorRT創(chuàng)建Engine并進(jìn)行推理的步驟: 安裝TensorRT庫(kù): 首先,確保您已經(jīng)安裝了TensorRT庫(kù)。請(qǐng)?jiān)L問(wèn)

    2023年04月14日
    瀏覽(16)
  • 大語(yǔ)言模型推理提速:TensorRT-LLM 高性能推理實(shí)踐

    大語(yǔ)言模型推理提速:TensorRT-LLM 高性能推理實(shí)踐

    作者:顧靜 大型語(yǔ)言模型(Large language models,LLM)是基于大量數(shù)據(jù)進(jìn)行預(yù)訓(xùn)練的超大型深度學(xué)習(xí)模型。底層轉(zhuǎn)換器是一組神經(jīng)網(wǎng)絡(luò),這些神經(jīng)網(wǎng)絡(luò)由具有 self-attention 的編碼器和解碼器組成。編碼器和解碼器從一系列文本中提取含義,并理解其中的單詞和短語(yǔ)之間的關(guān)系。 當(dāng)前

    2024年01月25日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包