TensorRT笔记(8)处理Dynamic shapes

本文档介绍了TensorRT中处理动态形状的详细步骤,包括指定运行时维度、优化配置文件的创建与绑定、动态形状的图层扩展以及相关限制。内容涵盖如何使用-1作为运行时维度占位符,如何创建和设置优化配置文件,以及动态形状在执行张量和形状张量之间的区别和转换规则。此外,还讨论了动态形状在INT8校准中的注意事项。
摘要由CSDN通过智能技术生成

7.处理Dynamic shapes

Dynamic shapes 是将某些或所有张量尺寸推迟到运行时的能力。 Dynamic shapes 可以通过C ++和Python接口使用。
以下各节提供了更详细的信息; 但是,这是构建具有动态形状的引擎的步骤的概述:

  1. 网络定义不得具有隐式批处理维度。
    C++
    通过调用创建INetworkDefinition
IBuilder::createNetworkV2(1U <<static_cast<int>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH))
Python
	通过调用创建tensorrt.INetworkDefinition
create_network(1 <<int(tensorrt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))

这些调用要求网络不具有隐式批处理维度。
2. 通过使用-1作为该维度的占位符,指定输入张量的每个运行时维度。
3. 在构建时指定一个或多个优化配置文件,这些配置文件为具有运行时尺寸的输入指定允许的尺寸范围&#

好的,以下是使用TensorRT 8对ONNX模型进行推理的Python代码示例: ```python import tensorrt as trt import numpy as np # Load ONNX model onnx_model_path = "/path/to/onnx/model.onnx" onnx_encoder = trt.OnnxParser(trt.Logger(trt.Logger.WARNING)) onnx_encoder.parse(open(onnx_model_path, 'rb').read()) # Set TensorRT builder parameters builder = trt.Builder(trt.Logger(trt.Logger.WARNING)) builder.max_workspace_size = 1 << 20 builder.max_batch_size = 1 # Set input and output shapes input_shape = (1, 3, 224, 224) output_shape = (1, 1000) builder.fp16_mode = True builder.strict_type_constraints = True network = builder.create_network() input_tensor = network.add_input(name="input", dtype=trt.float32, shape=input_shape) output_tensor = network.add_output(name="output", dtype=trt.float32, shape=output_shape) # Add ONNX model to TensorRT network onnx_tensor = {} for i in range(onnx_encoder.num_outputs): onnx_tensor[onnx_encoder.get_output_name(i)] = network.add_output( name=onnx_encoder.get_output_name(i), dtype=trt.float32, shape=onnx_encoder.get_output_shape(i)) onnx_tensor.update( {onnx_encoder.get_input_name(i): network.add_input( name=onnx_encoder.get_input_name(i), dtype=trt.float32, shape=onnx_encoder.get_input_shape(i)) for i in range(onnx_encoder.num_inputs)}) # Build TensorRT engine engine = builder.build_cuda_engine(network) context = engine.create_execution_context() # Generate random input data input_data = np.random.rand(*input_shape).astype(np.float32) # Allocate device memory for input and output data d_input = cuda.mem_alloc(input_data.nbytes) d_output = cuda.mem_alloc(output_shape[0] * np.dtype(np.float32).itemsize) # Copy input data to device memory cuda.memcpy_htod(d_input, input_data) # Do inference context.execute(1, [int(d_input), int(d_output)]) # Copy output data from device memory output_data = np.empty(output_shape, dtype=np.float32) cuda.memcpy_dtoh(output_data, d_output) # Print output data print(output_data) ``` 请注意,此示例假定您已经正确安装了TensorRT 8并且已经添加了必要的路径。如果您需要更多帮助,请参阅TensorRT文档和示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yhwang-hub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值