TRT(TensorRT)格式的模型与.pth或.pt格式、onnx格式模型区别与联系

本文比较了PyTorch的.pth/pt格式、ONNX格式和TensorRT格式的深度学习模型,强调了TensorRT在NVIDIAGPU上的性能优势,以及它们在训练、推理和跨框架转换中的适用场景和转换流程。

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

TRT(TensorRT)格式的模型与PyTorch的.pth或.pt格式模型和ONNX格式模型有一些显著的差异。以下是三者之间的主要区别:

设计目的:

PyTorch (.pth/.pt): 这种格式是PyTorch的原生格式,主要用于保存和加载PyTorch模型。
ONNX (Open Neural Network Exchange): 这是一个开放的模型表示格式,允许在不同的深度学习框架之间交换模型,如PyTorch、TensorFlow、Caffe2等。
TensorRT (TRT): TensorRT是一个深度学习模型优化器和运行时,主要用于加速模型的推理。TRT格式是为NVIDIA GPU优化的,并且经过了量化、层融合和其他优化。
性能:

使用TensorRT优化的模型通常在NVIDIA GPU上有更快的推理速度。这是因为TensorRT会进行很多针对性能的优化。

兼容性:

PyTorch: 由于它是PyTorch的原生格式,所以它与PyTorch高度兼容。
ONNX: 设计为跨框架的,但并不是所有的模型和操作都能轻松地转换为ONNX或从ONNX转换。
TensorRT: 主要为NVIDIA GPU优化,对于使用不支持的层或操作的模型,可能需要额外的工作来进行转换。

使用场景:

PyTorch (.pth/.pt): 当你想继续训练或在PyTorch中进行推理时使用。
ONNX: 当你想在不同的框架之间移动模型或使用支持ONNX的工具和平台时使用。
TensorRT (TRT): 当你想在NVIDIA GPU上进行高性能的推理时使用,特别是在生产环境或嵌入式设备上。
转换流程:

通常,你可能首先从PyTorch转换为ONNX,然后从ONNX转换为TensorRT格式,尽管也有直接从PyTorch到TensorRT的工具和方法

### 将 `best.onnx` 和 `best.pt` 模型量化为 INT8 的方法 #### 转换流程概述 为了实现模型的 INT8 量化并进行推理,可以采用以下两种主要路径分别针对 `.pt` 文件和 `.onnx` 文件: 1. **PyTorch PT 模型的 INT8 量化** PyTorch 提供了工具来完成模型的量化操作。对于 `.pt` 文件,可以通过 PyTorch 自带的量化 API 实现 INT8 转换[^1]。 2. **ONNX 模型的 INT8 量化** 对于 `.onnx` 文件,通常会借助 TensorRT ONNX Runtime 工具来进行 INT8 量化优化[^2]。 --- #### 方法一:PT 模型的 INT8 量化 ##### 准备工作 确保安装必要的依赖库: ```bash pip install torch torchvision ``` ##### Python 代码示例 以下是将 `.pt` 模型转换为 INT8 并保存的过程: ```python import torch # 加载原始 .pt 模型 model = torch.load('best.pt', map_location=torch.device('cpu')) # 设置模型为评估模式 model.eval() # 配置量化设置 quantized_model = torch.quantization.quantize_dynamic( model, # 待量化的模型 {torch.nn.Linear}, # 可选层类型列表 dtype=torch.qint8 # 数据类型 ) # 保存量化后的模型 torch.save(quantized_model.state_dict(), 'best_int8.pth') print("INT8 Quantized Model Saved.") ``` 上述代码通过动态量化的方式实现了模型的 INT8 转换[^4]。 --- #### 方法二:ONNX 模型的 INT8 量化 ##### 使用 TensorRT 进行 INT8 转换 TensorRT 是 NVIDIA 提供的一种高性能深度学习推理库,能够显著加速 INT8 推理性能[^3]。 ###### 步骤说明 1. 安装 TensorRT 库及其 Python 绑定。 2. 编写脚本加载 `.onnx` 模型,并配置 INT8 校准器(calibrator)。 3. 导出经过 INT8 优化的 TensorRT 引擎文件。 ###### Python 代码示例 ```python from tensorrt import * import pycuda.driver as cuda import pycuda.autoinit import numpy as np def build_engine(onnx_file_path): TRT_LOGGER = trt.Logger(trt.Logger.WARNING) builder = trt.Builder(TRT_LOGGER) network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) config = builder.create_builder_config() parser = trt.OnnxParser(network, TRT_LOGGER) with open(onnx_file_path, 'rb') as model: if not parser.parse(model.read()): print('Failed to parse the ONNX file.') for error in range(parser.num_errors): print(parser.get_error(error)) return None # 启用 INT8 精度 config.set_flag(trt.BuilderFlag.INT8) calib_cache = "calibration.cache" config.int8_calibrator = MyCalibrator(calib_cache=calib_cache) engine = builder.build_serialized_network(network, config) return engine engine = build_engine('best.onnx') with open("best_int8.trt", "wb") as f: f.write(engine) print("INT8 Engine Created and Saved.") ``` 注意:需要自定义校准类 `MyCalibrator` 来提供数据集用于 INT8 校准。 --- #### 方法三:使用 ONNX Runtime 进行 INT8 推理 如果不想生成新的引擎文件,可以直接利用 ONNX Runtime 支持的 INT8 功能运行推理。 ###### Python 代码示例 ```python import onnxruntime as ort # 创建会话时启用 INT8 options = ort.SessionOptions() options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL session = ort.InferenceSession('best.onnx', sess_options=options, providers=['CUDAExecutionProvider']) # 输入张量准备 input_name = session.get_inputs()[0].name dummy_input = np.random.randn(1, 3, 640, 640).astype(np.float32) # 执行推理 outputs = session.run(None, {input_name: dummy_input}) print(outputs) ``` 此方式无需额外转换即可直接调用硬件支持的 INT8 计算能力。 --- ### 注意事项 - 在实际应用中,建议先验证 INT8 量化对模型精度的影响程度。 - 如果目标设备不支持某些特定功能(如 FP16),则可能需要调整量化策略重新设计网络结构。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值