快速入门使用tensorRT进行推理

本文介绍了如何使用PyTorch构建一个简单的模型,并将其转换为ONNX格式,然后利用TensorRT进行编译和压测,关注了动态shape设置、模型优化、吞吐量、延迟等关键性能指标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参数解释

--onnx     # 指定ONNX model
# build option
# eg: input0:1x3x256x256,input1:1x3x128x128
--minShapes    # 模型输入的最小shape, 可动态
--optShapes    # 模型输入的推荐hape, 可动态
--maxShapes    # 模型输入的最大shape, 可动态

--inputIOFormats=spec    # 以什么样的格式获取值, 默认fp32
--outputIOFormats=spec    # 以什么样的格式输出值, 默认fp32

# build options
--memPoolSize=poolspec    # 分配的最大的内存容量
# eg: --memPoolSize=workspace:1024.5,dlaSRAM:256 单位M
--profillingVerbosity=mode  # 打印消息的详细程度
# eg: --mode ::=layer_names_only|detailed|none(default=layer_names_only)
# 只打印ops name, 详细(会打印ops参数), none(不打印)

--fp16  # 默认default 是否对模型执行fp16加速
--int8  # 默认default 是否对模型执行int8量化
--calib=<file>  # 当执行int8量化时用来标定参数的文件, 如果给的是带QDQ节点的model, 则不用给。如果给的不是QDQ model且没给定calib文件,默认会把dynamic range设置为4, 这时model量化会产生很大误差

--best    # 默认disabled, 是否开启全精度方案来达到最优性能FP32+FP16+INT8 使用三种方案同时运行, 然后选最快的
--saveEngine=<file>  # 保存序列化的engine
--loadEngine=<file>  # 加载engine进行反序列化, infer时用到
# === Build Options ===
--tacticSources=tactics  # 默认所有库都允许使用
# 某些平台使用某些库可能会报错, 且各种lib有各自缺点
# 通过 加上(+), 去掉(-) 指定什么包能用, 什么包不能用: +lib -lib
# eg: --taticSources=-CUDNN,+CUBLAS

# ==== inference Options ====  推理的时候指定
--shapes=spec    # 给推理设置输入tenosr形状(支持动态)
# eg: --shapes=input0:1x3x256x256,input1:1x3x128x128
--loadInputs=spec    # 从文件中加载输入, tensor文件
# eg: --loadInputs=input0:input0.binary,input1:input1.binary
--iterations=N    # 推理至少 运行几次 (默认10次)
--warmUp=N    # 默认200ms, 设置多少毫秒用来热启动, 可以缩减误差
--duration=N    # 默认3s, 运行inference所消耗的最少时间
--sleepTime=N    # 默认0s, inference从开始到计算延迟多少s
--idleTime=N    # 默认0s, 两次infer间隔多少s
--streams=N    # 默认1, 使用多个流来运行推理, 多线程下可能会得到加速
--separateProfileRun    # 默认False, 是否在infer时将profiler和benchmark分开, 做benchmark时设置为True
--buildOnly  
### TensorRT 模型推理 示例代码 对于TensorRT中的模型推理过程,可以通过Python接口实现。下面是一个使用TensorRT进行MNIST数据集推理的简化版本示例[^1]: ```python import tensorrt as trt import numpy as np import pycuda.driver as cuda import pycuda.autoinit def allocate_buffers(engine): inputs = [] outputs = [] bindings = [] stream = cuda.Stream() for binding in engine: size = trt.volume(engine.get_binding_shape(binding)) * engine.max_batch_size dtype = trt.nptype(engine.get_binding_dtype(binding)) # Allocate host and device buffers host_mem = cuda.pagelocked_empty(size, dtype) device_mem = cuda.mem_alloc(host_mem.nbytes) # Append the device buffer to device bindings. bindings.append(int(device_mem)) # Append to the appropriate list. if engine.binding_is_input(binding): inputs.append({'host': host_mem, 'device': device_mem}) else: outputs.append({'host': host_mem, 'device': device_mem}) return inputs, outputs, bindings, stream def do_inference(context, bindings, inputs, outputs, stream, batch_size=1): # Transfer input data to the GPU. [cuda.memcpy_htod_async(inp['device'], inp['host'], stream) for inp in inputs] # Run inference. context.execute_async(batch_size=batch_size, bindings=bindings, stream_handle=stream.handle) # Transfer predictions back from the GPU. [cuda.memcpy_dtoh_async(out['host'], out['device'], stream) for out in outputs] # Synchronize the stream stream.synchronize() return [out['host'] for out in outputs] # Load your previously created TensorRT engine file here (omitted) with open("mnist_engine.trt", "rb") as f, trt.Runtime(TRT_LOGGER) as runtime: engine = runtime.deserialize_cuda_engine(f.read()) context = engine.create_execution_context() inputs, outputs, bindings, stream = allocate_buffers(engine) input_data = np.random.rand(1, 1, 28, 28).astype(np.float32) # Replace with actual MNIST image preprocessing code np.copyto(inputs[0]['host'], input_data.ravel()) trt_outputs = do_inference(context, bindings=bindings, inputs=inputs, outputs=outputs, stream=stream)[0].reshape(-1) print(trt_outputs.argmax()) # Print predicted digit class index ``` 此段代码展示了如何创建输入输出缓冲区、执行实际推断以及处理结果的过程。 为了提升性能,在遇到吞吐量受限于排队时间和GPU计算时间不稳定的警告时,可以根据具体情况进行调整,比如尝试`--useCudaGraph`选项或锁定GPU时钟频率等措施来优化性能表现[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值