Tensorrt安装及使用(python版本)

本文详细介绍了如何在Windows和Ubuntu系统上安装TensorRT,包括使用pip、下载文件和docker容器的方式,并展示了从PyTorch到ONNX再到TensorRT的模型转换步骤,以及如何验证和测试TensorRT引擎性能。
摘要由CSDN通过智能技术生成

官方的教程

tensorrt的安装:Installation Guide :: NVIDIA Deep Learning TensorRT Documentation

视频教程:TensorRT 教程 | 基于 8.6.1 版本 | 第一部分_哔哩哔哩_bilibili

代码教程:trt-samples-for-hackathon-cn/cookbook at master · NVIDIA/trt-samples-for-hackathon-cn (github.com)

Tensorrt的安装

官方的教程:

安装指南 :: NVIDIA Deep Learning TensorRT Documentation --- Installation Guide :: NVIDIA Deep Learning TensorRT Documentation

Tensorrt的安装方法主要有:

1、使用 pip install 进行安装;

2、下载 tar、zip、deb 文件进行安装;

3、使用docker容器进行安装:TensorRT Container Release Notes

Windows系统

首先选择和本机nVidia驱动、cuda版本、cudnn版本匹配的Tensorrt版本。

我使用的:cuda版本:11.4;cudnn版本:11.4

建议下载 zip 进行Tensorrt的安装,参考的教程:

windows安装tensorrt - 知乎 (zhihu.com)

Ubuntu系统

首先选择和本机nVidia驱动、cuda版本、cudnn版本匹配的Tensorrt版本。

我使用的:cuda版本:11.7;cudnn版本:8.9.0

1、使用 pip 进行安装:

pip install tensorrt==8.6.1

我这边安装失败

2、下载 deb 文件进行安装

os="ubuntuxx04" 
tag="8.x.x-cuda-x.x" 
sudo dpkg -i nv-tensorrt-local-repo-${os}-${tag}_1.0-1_amd64.deb 
sudo cp /var/nv-tensorrt-local-repo-${os}-${tag}/*-keyring.gpg /usr/share/keyrings/ 
sudo apt-get update sudo apt-get install tensorrt

我这边同样没安装成功

3、使用 tar 文件进行安装(推荐)

推荐使用这种方法进行安装,成功率较高

下载对应的版本:developer.nvidia.com/tensorrt-download

下载后

tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz # 解压文件 
# 将lib添加到环境变量里面 
vim ~/.bashrc 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./TensorRT-8.6.1.6/lib 
source ~/.bashrc 

# 或 直接将 TensorRT-8.6.1.6/lib 以及 /include 添加到 cuda/lib64 cuda/include 里面 
cp -r ./lib/* /usr/local/cuda/lib64/ 
cp -r ./include/* /usr/local/cuda/include/ 

# 安装python的包 
cd TensorRT-8.6.1.6/python 
pip install tensorrt-xxx-none-linux_x86_64.whl

下载成功后验证:

# 验证是否安装成功: 
python 
>>>import tensorrt 
>>>print(tensorrt.__version__) 
>>>assert tensorrt.Builder(tensorrt.Logger())

如果没有报错说明安装成功

使用方法

我这边的使用的流程是:pytorch -> onnx -> tensorrt

选择resnet18进行转换

pytorch转onnx

安装onnx,onnxruntime安装一个就行

pip install onnx 
pip install onnxruntime 
pip install onnxruntime-gpu # gpu版本

将pytorch模型转成onnx模型

import torch
import torchvision

model = torchvision.models.resnet18(pretrained=False)

device = 'cuda' if torch.cuda.is_available else 'cpu'

dummy_input = torch.randn(1, 3, 224, 224, device=device)
model.to(device)
model.eval()
output = model(dummy_input)

print("pytorch result:", torch.argmax(output))

import torch.onnx

torch.onnx.export(model, dummy_input, './model.onnx', input_names=["input"], output_names=["output"], do_constant_folding=True, verbose=True, keep_initializers_as_inputs=True, opset_version=14, dynamic_axes={"input": {0: "nBatchSize"}, "output": {0: "nBatchSize"}})

# 一般情况
# torch.onnx.export(model, torch.randn(1, c, nHeight, nWidth, device="cuda"), './model.onnx', input_names=["x"], output_names=["y", "z"], do_constant_folding=True, verbose=True, keep_initializers_as_inputs=True, opset_version=14, dynamic_axes={"x": {0: "nBatchSize"}, "z": {0: "nBatchSize"}})

import onnx
import numpy as np
import onnxruntime as ort

model_onnx_path = './model.onnx'
# 验证模型的合法性
onnx_model = onnx.load(model_onnx_path)
onnx.checker.check_model(onnx_model)
# 创建ONNX运行时会话
ort_session = ort.InferenceSession(model_onnx_path, providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
# 准备输入数据
input_data = {
    'input': dummy_input.cpu().numpy()
}
# 运行推理
y_pred_onnx = ort_session.run(None, input_data)
print("onnx result:", np.argmax(y_pred_onnx[0]))

onnx转tensorrt

Window使用zip安装后使用 TensorrtRT-8.6.1.6/bin/trtexec.exe 文件生成 tensorrt 模型文件

Ubuntu使用tar安装后使用 TensorrtRT-8.6.1.6/bin/trtexec 文件生成 tensorrt 模型文件

./trtexec --onnx=model.onnx --saveEngine=model.trt --fp16 --workspace=16 --shapes=input:2x3x224x224

其中的参数:

--fp16:是否使用fp16

--shapes:输入的大小。tensorrt支持 动态batch 设置,感兴趣可以尝试

tensorrt的使用

nVidia的官方使用方法:

trt-samples-for-hackathon-cn/cookbook at master · NVIDIA/trt-samples-for-hackathon-cn (github.com)

打印转换后的tensorrt的模型的信息

import tensorrt as trt
# 加载TensorRT引擎
logger = trt.Logger(trt.Logger.INFO)
with open('./model.trt', "rb") as f, trt.Runtime(logger) as runtime:
    engine = runtime.deserialize_cuda_engine(f.read())
for idx in range(engine.num_bindings):
    name = engine.get_tensor_name(idx)
    is_input = engine.get_tensor_mode(name)
    op_type = engine.get_tensor_dtype(name)
    shape = engine.get_tensor_shape(name)
    print('input id: ',idx, '\tis input: ', is_input, '\tbinding name: ', name, '\tshape: ', shape, '\ttype: ', op_type)

测试转换后的tensorrt模型,来自nVidia的 cookbook/08-Advance/MultiStream/main.py

from time import time
import numpy as np
import tensorrt as trt
from cuda import cudart  # 安装 pip install cuda-python

np.random.seed(31193)
nWarmUp = 10
nTest = 30

nB, nC, nH, nW = 1, 3, 224, 224

data = dummy_input.cpu().numpy()

def run1(engine):
    input_name = engine.get_tensor_name(0)
    output_name = engine.get_tensor_name(1)

    output_type = engine.get_tensor_dtype(output_name)
    output_shape = engine.get_tensor_shape(output_name)
    
    context = engine.create_execution_context()
    context.set_input_shape(input_name, [nB, nC, nH, nW])
    _, stream = cudart.cudaStreamCreate()

    inputH0 = np.ascontiguousarray(data.reshape(-1))
    outputH0 = np.empty(output_shape, dtype=trt.nptype(output_type))
    _, inputD0 = cudart.cudaMallocAsync(inputH0.nbytes, stream)
    _, outputD0 = cudart.cudaMallocAsync(outputH0.nbytes, stream)

    # do a complete inference
    cudart.cudaMemcpyAsync(inputD0, inputH0.ctypes.data, inputH0.nbytes, cudart.cudaMemcpyKind.cudaMemcpyHostToDevice, stream)
    context.execute_async_v2([int(inputD0), int(outputD0)], stream)
    cudart.cudaMemcpyAsync(outputH0.ctypes.data, outputD0, outputH0.nbytes, cudart.cudaMemcpyKind.cudaMemcpyDeviceToHost, stream)
    cudart.cudaStreamSynchronize(stream)

    # Count time of memory copy from host to device
    for i in range(nWarmUp):
        cudart.cudaMemcpyAsync(inputD0, inputH0.ctypes.data, inputH0.nbytes, cudart.cudaMemcpyKind.cudaMemcpyHostToDevice, stream)

    trtTimeStart = time()
    for i in range(nTest):
        cudart.cudaMemcpyAsync(inputD0, inputH0.ctypes.data, inputH0.nbytes, cudart.cudaMemcpyKind.cudaMemcpyHostToDevice, stream)
    cudart.cudaStreamSynchronize(stream)
    trtTimeEnd = time()
    print("%6.3fms - 1 stream, DataCopyHtoD" % ((trtTimeEnd - trtTimeStart) / nTest * 1000))

    # Count time of inference
    for i in range(nWarmUp):
        context.execute_async_v2([int(inputD0), int(outputD0)], stream)

    trtTimeStart = time()
    for i in range(nTest):
        context.execute_async_v2([int(inputD0), int(outputD0)], stream)
    cudart.cudaStreamSynchronize(stream)
    trtTimeEnd = time()
    print("%6.3fms - 1 stream, Inference" % ((trtTimeEnd - trtTimeStart) / nTest * 1000))

    # Count time of memory copy from device to host
    for i in range(nWarmUp):
        cudart.cudaMemcpyAsync(outputH0.ctypes.data, outputD0, outputH0.nbytes, cudart.cudaMemcpyKind.cudaMemcpyDeviceToHost, stream)

    trtTimeStart = time()
    for i in range(nTest):
        cudart.cudaMemcpyAsync(outputH0.ctypes.data, outputD0, outputH0.nbytes, cudart.cudaMemcpyKind.cudaMemcpyDeviceToHost, stream)
    cudart.cudaStreamSynchronize(stream)
    trtTimeEnd = time()
    print("%6.3fms - 1 stream, DataCopyDtoH" % ((trtTimeEnd - trtTimeStart) / nTest * 1000))

    # Count time of end to end
    for i in range(nWarmUp):
        context.execute_async_v2([int(inputD0), int(outputD0)], stream)

    trtTimeStart = time()
    for i in range(nTest):
        cudart.cudaMemcpyAsync(inputD0, inputH0.ctypes.data, inputH0.nbytes, cudart.cudaMemcpyKind.cudaMemcpyHostToDevice, stream)
        context.execute_async_v2([int(inputD0), int(outputD0)], stream)
        cudart.cudaMemcpyAsync(outputH0.ctypes.data, outputD0, outputH0.nbytes, cudart.cudaMemcpyKind.cudaMemcpyDeviceToHost, stream)
    cudart.cudaStreamSynchronize(stream)
    trtTimeEnd = time()
    print("%6.3fms - 1 stream, DataCopy + Inference" % ((trtTimeEnd - trtTimeStart) / nTest * 1000))

    cudart.cudaStreamDestroy(stream)
    cudart.cudaFree(inputD0)
    cudart.cudaFree(outputD0)

    print("tensorrt result:", np.argmax(outputH0))


if __name__ == "__main__":
    cudart.cudaDeviceSynchronize()
    f = open("./model.trt", "rb")     # 读取trt模型
    runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING))   # 创建一个Runtime(传入记录器Logger)
    engine = runtime.deserialize_cuda_engine(f.read())      # 从文件中加载trt引擎
    run1(engine)  # do inference with single stream
    print(dummy_input.shape, dummy_input.dtype)

### 回答1: TensorRT是NVIDIA推出的深度学习推理引擎,可以在GPU上高效地运行深度学习模型。TensorRT支持Windows平台,可以通过以下步骤安装: 1. 安装CUDA和cuDNN:TensorRT需要依赖CUDA和cuDNN,需要先安装它们。可以从NVIDIA官网下载对应版本的CUDA和cuDNN,并按照官方文档进行安装。 2. 下载TensorRT:可以从NVIDIA官网下载对应版本TensorRT,下载完成后解压到指定目录。 3. 安装TensorRT Python API:TensorRT提供了Python API,可以通过pip安装。打开命令行窗口,输入以下命令: ``` pip install tensorrt ``` 4. 安装TensorRT UFF Parser:如果需要使用UFF格式的模型,需要安装TensorRT UFF Parser。可以通过pip安装。打开命令行窗口,输入以下命令: ``` pip install uff ``` 安装完成后,就可以在Windows平台上使用TensorRT了。 ### 回答2: TensorRT是NVIDIA推出的一个高效的深度神经网络推理引擎,可以大幅提升神经网络在GPU上的运行速度。TensorRT支持多种深度学习框架,如TensorFlow、Caffe和PyTorch等。在本文中,我们将探讨如何在Windows环境中使用Python安装TensorRT。 1. 准备工作 在安装TensorRT之前,需要先安装CUDA和cuDNN。TensorRT依赖于CUDA和cuDNN,并且需要使用与您的GPU型号相对应版本的CUDA和cuDNN。 首先,下载并安装适合您GPU的CUDA软件包。然后,下载cuDNN库并将其解压缩到CUDA的安装目录中。例如,如果您的CUDA安装在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1路径下,那么解压cuDNN库后应该将库文件放在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\路径下。 2. 下载TensorRT 在完成CUDA和cuDNN的安装后,就可以下载TensorRT了。首先,进入NVIDIA官方网站(https://developer.nvidia.com/nvidia-tensorrt-download)下载TensorRT软件包。下载完成后,解压缩到您喜欢的目录中。例如,将TensorRT解压缩到C:\TensorRT路径下。 3. 配置环境变量 接下来,要将TensorRT的路径添加到环境变量中。在Windows环境中,打开“控制面板”->“系统和安全”->“系统”,然后点击“高级系统设置”->“环境变量”按钮。在“系统变量”中,找到“Path”变量并点击“编辑”按钮。在“变量值”框中添加TensorRT的bin和lib路径,例如:C:\TensorRT\bin;C:\TensorRT\lib; 4. 安装Python包 在安装Python之前,需要将Anaconda环境添加到环境变量中。如果您没有安装Anaconda环境,请先下载并安装Anaconda。在Windows环境中,打开“控制面板”->“系统和安全”->“系统”,然后点击“高级系统设置”->“环境变量”按钮。在“用户变量”中,找到“Path”变量并点击“编辑”按钮。在“变量值”框中添加Anaconda的路径,例如:C:\ProgramData\Anaconda3\Scripts;C:\ProgramData\Anaconda3\; 然后,通过pip命令安装TensorRT Python包。在Anaconda命令行窗口中,输入以下命令: pip install tensorrt 5. 测试安装 完成TensorRT Python包的安装后,可以使用Python脚本测试安装是否成功。创建一个新的Python脚本,并将以下代码复制并粘贴: import tensorrt as trt print(trt.__version__) 保存脚本后运行,如果输出正确的TensorRT版本号,则表明安装成功。可以使用TensorRT创建和优化神经网络模型了。 综上所述,TensorRT在Windows环境中的安装步骤如上所述。安装前需要确认CUDA和cuDNN已成功安装安装时需要添加环境变量并使用pip工具安装TensorRT Python包。 ### 回答3: TensorRT是一个可用于高性能深度学习推理的软件库,可以在GPU上进行加速。对于Windows系统和Python用户来说,安装TensorRT相对来说比较简单,但也需要一定的操作步骤,下面将详细介绍如何安装TensorRT。 首先,需要在NVIDIA官网上下载TensorRT安装程序,这里提供的是TensorRT 5.1.5版本的下载地址:https://developer.nvidia.com/nvidia-tensorrt-5x-download,选择对应的Windows版本,下载后进行安装。 其次,安装完成后需要配置TensorRT环境变量,将TensorRT的bin目录添加到PATH环境变量中,这样就能够在命令行中使用TensorRT相关命令了。同样需要将TensorRT的include和lib目录添加到对应的环境变量中,以便在调用TensorRT库时能够正确编译。 接着,安装TensorRTPython包,可以通过pip安装,打开命令行直接输入以下指令: ``` pip install tensorrt ``` 安装完成后,调用TensorRT就可以在Python使用了。此外,还需要安装对应的TensorFlow和Python版本,以及NVIDIA的CUDA和cuDNN软件包,以便与TensorRT一起使用。 最后,验证TensorRT安装是否成功。在Python中导入TensorRT库,进行简单的模型推理测试。如果能够成功进行推理操作,那么就说明TensorRT安装已经成功了。 总之,TensorRT在Windows系统下的安装还是比较简单的,只需要按照上述步骤进行操作即可。当然,安装过程中也有可能会遇到一些问题,比如环境变量没有设置正确等,这时就需要仔细查看错误信息进行调整了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值