tensorRT onnx中属性名相同,但实际大小不同生成问题

部署运行你感兴趣的模型镜像

onnx转TensorRT的问题

TensorRT7.0.1.1转换没出问题

TensorRT8.2.4.2一直报下面的错误

4: [shapeCompiler.cpp::nvinfer1::builder::DynamicSlotBuilder::evaluateShapeChecks::832] Error Code 4: Internal Error (kOPT values for profile 0 violate shape constraints: condition '==' violated. IAssertionLayer (Unnamed Layer* 5) [Assertion]: condition[0] is false: (EQUAL (# 2 (SHAPE input0)) (# 2 (SHAPE input1))). For input: 'input0' all named dimensions that share the same name must be equal. Note: Named dimensions were present on the following axes: 2 (name: 'height'), 2 (name: 'height'))

原因是:

input0 input1 input2 在实际使用的时候,width height大小是/2递减的,而在保存onnx的时候,命名的时候是相同的(上一辈留下的问题,心里苦)

 TensorRT8.2.4.2中要求,相同name的维度需要一致,input0中叫height,如果在input1中也有相同名字的height,那么这两个大小必须一致,不然就会报错。

解决方法,生成的onnx的时候,分别命名即可:

增加onnx直接修改名字的代码:

import onnx
import torch
import argparse
import os


def Test_Onnx_Change_Param_Name(onnx_model):
    for input in onnx_model.graph.input:
            dim1 = input.type.tensor_type.shape.dim[2]
            dim2 = input.type.tensor_type.shape.dim[3]
            dim1.dim_param = "height" + input.name[-1]
            dim2.dim_param = "width" + input.name[-1]

    for output in onnx_model.graph.output:
            dim1 = output.type.tensor_type.shape.dim[2]
            dim2 = output.type.tensor_type.shape.dim[3]
            dim1.dim_param = "height" + output.name[-1]
            dim2.dim_param = "width" + output.name[-1]


def apply(transform, infile, outfile):
    model = onnx.load(infile)
    transform(model)
    onnx.save(model, outfile)





parser = argparse.ArgumentParser(description='Configurations for Change Onnx Name')
parser.add_argument('--onnx_path', type=str, default=r'D:\networks\deblur\rst/model.onnx', help='src onnx path')
parser.add_argument('--save_new_path', type=str, default=r'D:\networks\deblur\rst/modified.onnx', help='new onnx path')
args = parser.parse_args()


if __name__ == "__main__":
    apply(Test_Onnx_Change_Param_Name, args.onnx_path, args.save_new_path)

您可能感兴趣的与本文相关的镜像

TensorRT-v8.6

TensorRT-v8.6

TensorRT

TensorRT 是NVIDIA 推出的用于深度学习推理加速的高性能推理引擎。它可以将深度学习模型优化并部署到NVIDIA GPU 上,实现低延迟、高吞吐量的推理过程。

### 使用ONNX模型与TensorRT集成 在深度学习领域,TensorRT 是 NVIDIA 提供的一个高性能推理库,用于优化和部署神经网络模型。它支持多种输入格式,其中包括 ONNX (Open Neural Network Exchange)[^1]。以下是关于如何使用 ONNX 模型与 TensorRT 集成以及解决相关问题的具体说明。 #### 1. 将ONNX模型转换为TensorRT引擎 要将 ONNX 模型加载到 TensorRT 中,可以按照以下流程操作: - **安装必要的依赖项** 确保已安装最新版本的 TensorRT 和 PyTorch 或 TensorFlow(如果适用),因为它们通常提供导出至 ONNX 的功能。 - **构建TensorRT引擎** 下面是一个 Python 脚本示例,展示如何通过 `onnx` 文件创建 TensorRT 引擎: ```python import tensorrt as trt from typing import Optional def build_engine(onnx_file_path: str, engine_file_path: str, logger: Optional[trt.Logger]=None) -> bool: """ 构建并保存 TensorRT 引擎文件. 参数: onnx_file_path (str): 输入的 ONNX 文件路径. engine_file_path (str): 输出的 TensorRT 引擎文件路径. logger (Optional[tensorrt.Logger]): 日志记录器实例. 返回: 成功返回 True,失败返回 False. """ if not logger: TRT_LOGGER = trt.Logger(trt.Logger.WARNING) else: TRT_LOGGER = logger builder = trt.Builder(TRT_LOGGER) network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser = trt.OnnxParser(network, TRT_LOGGER) with open(onnx_file_path, 'rb') as model: if not parser.parse(model.read()): for error in range(parser.num_errors): print(f"解析错误: {parser.get_error(error)}") return False config = builder.create_builder_config() config.max_workspace_size = 1 << 30 # 设置最大工作区大小为1GB serialized_engine = builder.build_serialized_network(network, config) with open(engine_file_path, "wb") as f: f.write(serialized_engine) return True ``` 此脚本定义了一个函数 `build_engine()` 来读取 `.onnx` 文件,并将其序列化为 TensorRT 可执行的二进制格式 `.engine`。 --- #### 2. 解决常见的兼容性和性能问题 当尝试将 ONNX 模型导入 TensorRT 时,可能会遇到一些常见问题,例如不支持的操作符或精度损失等问题。下面是一些解决方案: - **检查ONNX模型的有效性**: 在某些情况下,ONNX 导出可能包含未被 TensorRT 支持的操作符。可以通过运行以下命令验证模型是否有效: ```bash polygraphy inspect model your_model.onnx --mode=full ``` Polygraphy 工具可以帮助识别潜在的问题节点。 - **降低精度需求**: 如果发现高精度模式下无法正常运行,则考虑切换到 FP16 或 INT8 推理方式。这可通过修改配置实现: ```python config.set_flag(trt.BuilderFlag.FP16) calibrator = YourCalibrationClass(...) # 自定义校准类 config.int8_calibrator = calibrator ``` 上述代码片段展示了启用半精度浮点数推断的方式。 - **动态形状的支持**: 对于具有动态输入尺寸的情况,需显式声明最小/最佳/最大维度范围以便 TensorRT 正确分配内存资源: ```python profile = builder.create_optimization_profile() profile.set_shape('input_tensor_name', min=(1, 3, 224, 224), opt=(1, 3, 512, 512), max=(1, 3, 1024, 1024)) config.add_optimization_profile(profile) ``` 此处假设输入张量名为 `'input_tensor_name'` 并指定了三种不同分辨率下的边界条件。 --- #### 3. 性能调优建议 除了基本的功能适配外,还可以采取额外措施进一步提升推理速度: - 利用多流并发处理机制; - 合理设置 GPU 显存占用上限; - 测试不同的 batch size 找寻最优解等等。 以上策略均有助于充分发挥硬件潜力从而获得更佳的实际效果。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ListenAlone

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

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

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

打赏作者

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

抵扣说明:

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

余额充值