cuda和cudnn的安装可以参考我的另一篇博文:
【软件安装】win10装anaconda3-4.2.0、python3.5、opencv3.0和tensorflow1.2(gpu)_LeonJin的博客-CSDN博客
cuda10.2需要把所有的补丁装好,参考:Error Code 2: Internal Error (Assertion cublasStatus == CUBLAS_STATUS_SUCCES_Thanks for all things-CSDN博客
等cuda、cudnn都下载好,并把环境配置好了之后,才可以执行下面的步骤,
因为tensorRT就是cuda的基础上封装了一层,可以用来做模型加载和推理。
tensorRT的中文介绍文档:
使用 TensorRT 加速深度学习推理 - NVIDIA 开发者博客
tensorRT的英文介绍文档:https://developer.nvidia.com/blog/speeding-up-deep-learning-inference-using-tensorrt/
tensorRT下载:
https://developer.nvidia.com/nvidia-tensorrt-8x-download
下载之后的文件目录结构如下:
其中,data文件夹里面有一些预先准备好的数据和模型,比如mnist
这里面有一些onnx模型或者caffe模型等。
提示:
如果你下载的tensorrt是其他版本的,比如TensorRT-7.2.3.4,那么data/mnist里面就没有下载好的pgm文件,你需要运行download_pgms.py(从网络上下载这些pmg文件)
samples文件夹里面有一些官方准备好的测试实例(*.sln),可以直接用VS打开
提示:
用VS打开某个sln之后,可能需要设置好Windows SDK 版本,才能够顺利编译
VS更新后报错 error MSB8036: 找不到 Windows SDK 版本10_明年十八岁-CSDN博客_msb8036怎么解决
比如,打开sample_onnx_mnist.sln
提示:
我们其实不需要对项目的属性进行任何设置
只要能把cuda和cudnn安装好,然后把cudnn的include、lib、bin文件夹里面的文件拷贝到cuda安装路径下的同名文件夹中即可。
编译好了之后可以在bin文件夹中找到 sample_onnx_mnist.exe
现在我们可以开始来使用这个测试实例:
“win+r”输入cmd,
输入下面的命令行:
cd /d C:\Project\TensorRT-8.0.3.4\bin
sample_onnx_mnist.exe --datadir C:\Project\TensorRT-8.0.3.4\data\mnist
正常的话你能看到这部分内容:
这里输入是数字1的图像,是随机从data/mnist文件夹中读取出来的,然后调用了mnist.onnx进行模型推理,得到以下结果。
到这里就TensorRT的mnist测试实例就是跑完了。
后续再继续把TensorRT的代码结构了解清楚,我们可以用它来做点其他更高级的事情,
比如,跑一个大型的分割模型(比如,mask-rcnn),
比如,进行多线程推理(C/C++ TensorRT引擎多线程推理多个rtsp流并显示或保存_highoooo的博客-CSDN博客_多线程推理)
在SampleOnnxMNIST这个实例中,我简单的利用opencv自己导入图像进行推理,
#include<opencv2/opencv.hpp>
bool SampleOnnxMNIST::processInput(const samplesCommon::BufferManager& buffers)
{
#if 0
const int inputH = mInputDims.d[2];
const int inputW = mInputDims.d[3];
std::cout << "[jhq] inputH: " << inputH << std::endl;
std::cout << "[jhq] inputW: " << inputW << std::endl;
// Read a random digit file
srand(unsigned(time(nullptr)));
std::vector<uint8_t> fileData(inputH * inputW);
mNumber = rand() % 10;
readPGMFile(locateFile(std::to_string(mNumber) + ".pgm", mParams.dataDirs), fileData.data(), inputH, inputW);
// Print an ascii representation
sample::gLogInfo << "Input:" << std::endl;
for (int i = 0; i < inputH * inputW; i++)
{
sample::gLogInfo << (" .:-=+*#%@"[fileData[i] / 26]) << (((i + 1) % inputW) ? "" : "\n");
}
sample::gLogInfo << std::endl;
float* hostDataBuffer = static_cast<float*>(buffers.getHostBuffer(mParams.inputTensorNames[0]));
for (int i = 0; i < inputH * inputW; i++)
{
hostDataBuffer[i] = 1.0 - float(fileData[i] / 255.0);
}
return true;
#else
const int inputH = mInputDims.d[2];
const int inputW = mInputDims.d[3];
std::cout << "[jhq] inputH: " << inputH << std::endl;
std::cout << "[jhq] inputW: " << inputW << std::endl;
std::string mFilename = "test.png";
std::cout << "[jhq] mFilename: " << mFilename << std::endl;
cv::Mat srcIm = cv::imread(mFilename, 0);
cv::resize(srcIm, srcIm, cv::Size(inputW, inputH));
//cv::imshow("srcIm",srcIm);
//cv::waitKey(0);
// Print an ascii representation
sample::gLogInfo << "Input:" << std::endl;
for (int i = 0; i < inputH * inputW; i++)
{
sample::gLogInfo << (" .:-=+*#%@"[srcIm.data[i] / 26]) << (((i + 1) % inputW) ? "" : "\n");
}
sample::gLogInfo << std::endl;
float* hostDataBuffer = static_cast<float*>(buffers.getHostBuffer(mParams.inputTensorNames[0]));
for (int i = 0; i < inputH * inputW; i++)
{
hostDataBuffer[i] = 1 - float(srcIm.data[i]) / 255.0;
}
return true;
#endif
}
提示:
在SampleOnnxMNIST.cpp文件中找到SampleOnnxMNIST::processInput这个函数并替换,
这里我主要是读取了”test.png“图像(如下),进行resize和归一化,然后放到hostdatabuffer里面。
test.png
推理结果:
可以看到模型给出了预测结果,感觉泛化能力还是可以的~
后续再继续把TensorRT的代码结构了解清楚,我们可以用它来做点其他更高级的事情,
比如,跑一个大型的分割模型(比如,mask-rcnn),
比如,进行多线程推理(C/C++ TensorRT引擎多线程推理多个rtsp流并显示或保存_highoooo的博客-CSDN博客_多线程推理)