Onnxruntime之tensorrt加速

这篇具有很好参考价值的文章主要介绍了Onnxruntime之tensorrt加速。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TensorRT Execution Provider

借助 TensorRT 执行提供程序,与通用 GPU 加速相比,ONNX 运行时可在相同硬件上提供更好的推理性能。

ONNX 运行时中的 TensorRT 执行提供程序利用 NVIDIA 的TensorRT深度学习推理引擎来加速其 GPU 系列中的 ONNX 模型。Microsoft 和 NVIDIA 密切合作,将 TensorRT 执行提供程序与 ONNX Runtime 集成。

Install

Jetson Zoo中的 Jetpack 提供了预构建的包和 Docker 映像。

Requirements

onnxruntime tensorrt,# onnxruntime模型部署,python,人工智能,开发语言

Build

参考构建说明。
ONNX 运行时的 TensorRT 执行提供程序是使用 TensorRT 8.4 构建和测试的。

Usage

C++

Ort::Env env = Ort::Env{ORT_LOGGING_LEVEL_ERROR, "Default"};
Ort::SessionOptions sf;
int device_id = 0;
Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_Tensorrt(sf, device_id));
Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_CUDA(sf, device_id));
Ort::Session session(env, model_path, sf);

C API 详细信息在此处。

TENSORRT 子图的形状推断

如果模型中的某些算子不受 TensorRT 支持,ONNX Runtime 将对图进行分区,仅将支持的子图发送到 TensorRT 执行提供者。因为 TensorRT 要求子图的所有输入都具有指定的形状,所以如果没有输入形状信息,ONNX 运行时将抛出错误。在这种情况下,请先在此处运行脚本,对整个模型进行形状推断。

Python
要使用 TensorRT 执行提供程序,您必须在实例化 InferenceSession 时显式注册 TensorRT 执行提供程序。请注意,建议您还注册 CUDAExecutionProvider 以允许 Onnx Runtime 将节点分配给 TensorRT 不支持的 CUDA 执行提供程序。

import onnxruntime as ort
# set providers to ['TensorrtExecutionProvider', 'CUDAExecutionProvider'] with TensorrtExecutionProvider having the higher priority.
sess = ort.InferenceSession('model.onnx', providers=['TensorrtExecutionProvider', 'CUDAExecutionProvider'])

Configurations

有两种方法可以配置 TensorRT 设置,通过环境变量或通过执行提供程序选项 API。

环境变量

可以为 TensorRT 执行提供程序设置以下环境变量。

  • ORT_TENSORRT_MAX_WORKSPACE_SIZE:TensorRT 引擎的最大工作空间大小。默认值:1073741824 (1GB)。

  • ORT_TENSORRT_MAX_PARTITION_ITERATIONS:TensorRT 模型分区中允许的最大迭代次数。如果在达到最大迭代次数时目标模型无法成功分区,则整个模型将回退到其他执行提供程序,例如 CUDA 或 CPU。默认值:1000。

  • ORT_TENSORRT_MIN_SUBGRAPH_SIZE:分区后子图中的最小节点大小。较小的子图将回退到其他执行提供程序。默认值:1。

  • ORT_TENSORRT_FP16_ENABLE:在 TensorRT 中启用 FP16 模式。1:启用,0:禁用。默认值:0。请注意,并非所有 Nvidia GPU 都支持 FP16 精度。

  • ORT_TENSORRT_INT8_ENABLE:在 TensorRT 中启用 INT8 模式。1:启用,0:禁用。默认值:0。请注意,并非所有 Nvidia GPU 都支持 INT8 精度。

  • ORT_TENSORRT_INT8_CALIBRATION_TABLE_NAME:为 INT8 模式下的非 QDQ 模型指定 INT8 校准表文件。注意 QDQ 模型不应该提供校准表,因为如果模型中有任何 Q/DQ 节点,TensorRT 不允许加载校准表。默认情况下,名称为空。

  • ORT_TENSORRT_INT8_USE_NATIVE_CALIBRATION_TABLE:选择在 INT8 模式下用于非 QDQ 模型的校准表。如果为 1,则使用原生 TensorRT 生成的校准表;如果为 0,则使用 ONNXRUNTIME 工具生成的校准表。默认值:0。 **注意:请在推断前将最新的校准表文件复制到 ORT_TENSORRT_CACHE_PATH。校准表特定于模型和校准数据集。每当生成新的校准表时,应清理或替换路径中的旧文件。

  • ORT_TENSORRT_DLA_ENABLE:启用 DLA(Deep learning accelerator)。1:启用,0:禁用。默认值:0。请注意,并非所有 Nvidia GPU 都支持 DLA。

  • ORT_TENSORRT_DLA_CORE:指定要在其上执行的 DLA 内核。默认值:0。

  • ORT_TENSORRT_ENGINE_CACHE_ENABLE:启用 TensorRT 引擎缓存。使用引擎缓存的目的是在 TensorRT 可能需要很长时间来优化和构建引擎的情况下节省引擎构建时间。引擎将在第一次构建时被缓存,因此下次创建新的推理会话时,引擎可以直接从缓存中加载。为了验证加载的引擎是否可用于当前推理,引擎配置文件也被缓存并与引擎一起加载。如果当前输入形状在引擎配置文件的范围内,则可以安全地使用加载的引擎。否则,如果输入形状超出范围,则将更新配置文件缓存以覆盖新形状,并且将根据新配置文件重新创建引擎(并在引擎缓存中刷新)。请注意,每个引擎都是为特定设置创建的,例如模型路径/名称、精度(FP32/FP16/INT8 等)、工作区、配置文件等,以及特定的 GPU,并且它不可移植,因此必须确保这些设置不会改变,否则需要重新构建引擎并再次缓存。1:启用,0:禁用。默认值:0。警告:如果发生以下任何更改,请清理所有旧引擎和配置文件缓存文件(.engine 和 .profile):

    • 模型更改(如果模型拓扑、opset 版本、运营商等有任何更改)
    • ORT 版本更改(即从 ORT 版本 1.8 移动到 1.9)
    • TensorRT 版本变更(即从 TensorRT 7.0 迁移到 8.0)
    • 硬件变化。(引擎和配置文件不可移植,并且针对特定的 Nvidia 硬件进行了优化)
  • ORT_TENSORRT_CACHE_PATH:如果 ORT_TENSORRT_ENGINE_CACHE_ENABLE 为 1,则指定 TensorRT 引擎和配置文件的路径,如果 ORT_TENSORRT_INT8_ENABLE 为 1,则指定 INT8 校准表文件的路径。

  • ORT_TENSORRT_DUMP_SUBGRAPHS:将转换为onnx格式的TRT引擎的子图转储到文件系统。这可以帮助调试子图,例如通过使用trtexec --onnx my_model.onnx和检查解析器的输出。1:启用,0:禁用。默认值:0。

  • ORT_TENSORRT_FORCE_SEQUENTIAL_ENGINE_BUILD:在多 GPU 环境中跨提供者实例按顺序构建 TensorRT 引擎。1:启用,0:禁用。默认值:0。

One can override default values by setting environment variables ORT_TENSORRT_MAX_WORKSPACE_SIZE, ORT_TENSORRT_MAX_PARTITION_ITERATIONS, ORT_TENSORRT_MIN_SUBGRAPH_SIZE, ORT_TENSORRT_FP16_ENABLE, ORT_TENSORRT_INT8_ENABLE, ORT_TENSORRT_INT8_CALIBRATION_TABLE_NAME, ORT_TENSORRT_INT8_USE_NATIVE_CALIBRATION_TABLE, ORT_TENSORRT_ENGINE_CACHE_ENABLE, ORT_TENSORRT_CACHE_PATH and ORT_TENSORRT_DUMP_SUBGRAPHS. 例如在 Linux 上

将默认最大工作空间大小覆盖为 2GB
导出 ORT_TENSORRT_MAX_WORKSPACE_SIZE=2147483648

将默认最大迭代次数覆盖为 10
导出 ORT_TENSORRT_MAX_PARTITION_ITERATIONS=10

将默认最小子图节点大小覆盖为 5
导出 ORT_TENSORRT_MIN_SUBGRAPH_SIZE=5

在 TENSORRT 中启用 FP16 模式
导出 ORT_TENSORRT_FP16_ENABLE=1

在 TENSORRT 中启用 INT8 模式
导出 ORT_TENSORRT_INT8_ENABLE=1

使用原生 TENSORRT 校准表
导出 ORT_TENSORRT_INT8_USE_NATIVE_CALIBRATION_TABLE=1

启用 TENSORRT 引擎缓存
导出 ORT_TENSORRT_ENGINE_CACHE_ENABLE=1

执行提供程序选项

TensorRT 配置也可以通过执行提供程序选项 API 进行设置。当每个模型和推理会话都有自己的配置时,这很有用。在这种情况下,执行提供程序选项设置将覆盖任何环境变量设置。所有配置都应该明确设置,否则将采用默认值。环境变量和执行提供程序选项之间存在一对一的映射,如下所示,

ORT_TENSORRT_MAX_WORKSPACE_SIZE <-> trt_max_workspace_size

ORT_TENSORRT_MAX_PARTITION_ITERATIONS <-> trt_max_partition_iterations

ORT_TENSORRT_MIN_SUBGRAPH_SIZE <-> trt_min_subgraph_size

ORT_TENSORRT_FP16_ENABLE <-> trt_fp16_enable

ORT_TENSORRT_INT8_ENABLE <-> trt_int8_enable

ORT_TENSORRT_INT8_CALIBRATION_TABLE_NAME <-> trt_int8_calibration_table_name

ORT_TENSORRT_INT8_USE_NATIVE_CALIBRATION_TABLE <-> trt_int8_use_native_calibration_table

ORT_TENSORRT_DLA_ENABLE <-> trt_dla_enable

ORT_TENSORRT_DLA_CORE <-> trt_dla_core

ORT_TENSORRT_ENGINE_CACHE_ENABLE <-> trt_engine_cache_enable

ORT_TENSORRT_CACHE_PATH <-> trt_engine_cache_path

ORT_TENSORRT_DUMP_SUBGRAPHS <-> trt_dump_subgraphs

ORT_TENSORRT_FORCE_SEQUENTIAL_ENGINE_BUILD <-> trt_force_sequential_engine_build

此外,还可以通过执行提供程序选项设置 device_id。

C++ API 示例

Ort::SessionOptions session_options;
OrtTensorRTProviderOptions trt_options{};
trt_options.device_id = 1;
trt_options.trt_max_workspace_size = 2147483648;
trt_options.trt_max_partition_iterations = 10;
trt_options.trt_min_subgraph_size = 5;
trt_options.trt_fp16_enable = 1;
trt_options.trt_int8_enable = 1;
trt_options.trt_int8_use_native_calibration_table = 1;
trt_options.trt_engine_cache_enable = 1;
trt_options.trt_engine_cache_path = "/path/to/cache"
trt_options.trt_dump_subgraphs = 1;  
session_options.AppendExecutionProvider_TensorRT(trt_options);

PYTHON API 示例

import onnxruntime as ort

model_path = '<path to model>'

providers = [
    ('TensorrtExecutionProvider', {
        'device_id': 1,
        'trt_max_workspace_size': 2147483648,
        'trt_fp16_enable': True,
    }),
    ('CUDAExecutionProvider', {
        'device_id': 1,
        'arena_extend_strategy': 'kNextPowerOfTwo',
        'gpu_mem_limit': 2 * 1024 * 1024 * 1024,
        'cudnn_conv_algo_search': 'EXHAUSTIVE',
        'do_copy_in_default_stream': True,
    })
]

sess_opt = ort.SessionOptions()
sess = ort.InferenceSession(model_path, sess_options=sess_opt, providers=providers)

Performance Tuning

有关性能调优,请参阅此页面上的指南:ONNX 运行时性能调优

当/如果使用onnxruntime_perf_test,使用标志-e tensorrt

Samples

此示例展示了如何在 TensorRT 执行提供程序上运行 Faster R-CNN 模型。

  • 从这里的 ONNX 模型库下载 Faster R-CNN onnx 模型。

  • 通过运行形状推断脚本推断模型中的形状

 python symbolic_shape_infer.py --input /path/to/onnx/model/model.onnx --output /path/to/onnx/model/new_model.onnx --auto_merge
  • 用新模型替换原来的模型,运行 ONNX Runtime build 目录下的 onnx_test_runner 工具。
 ./onnx_test_runner -e tensorrt /path/to/onnx/model/

Reference

https://onnxruntime.ai/docs/execution-providers/TensorRT-ExecutionProvider.html文章来源地址https://www.toymoban.com/news/detail-632449.html

到了这里,关于Onnxruntime之tensorrt加速的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大模型——MobileSAM的Onnxruntime cpp部署

    该项目旨在为Segment Anything和MobileSAM创建一个纯 C++ 推理 api ,在运行时不依赖于 Python。代码存储库包含一个带有测试程序的 C++ 库,以便于将接口轻松集成到其他项目中。 模型加载大约需要 10 或 1 秒,单次推理大约需要 20 毫秒,使用 Intel Xeon W-2145 CPU(16 线程)获得。在运行

    2024年02月09日
    浏览(34)
  • AI模型部署 | onnxruntime部署YOLOv8分割模型详细教程

    本文首发于公众号【DeepDriving】,欢迎关注。 0. 引言 我之前写的文章《基于YOLOv8分割模型实现垃圾识别》介绍了如何使用 YOLOv8 分割模型来实现垃圾识别,主要是介绍如何用自定义的数据集来训练 YOLOv8 分割模型。那么训练好的模型该如何部署呢? YOLOv8 分割模型相比检测模型

    2024年04月24日
    浏览(34)
  • OnnxRuntime TensorRT OpenCV::DNN性能对比(YoloV8)实测

    之前把ORT的一套推理环境框架搭好了,在项目中也运行得非常愉快,实现了cpu/gpu,fp32/fp16的推理运算,同onnx通用模型在不同推理框架下的性能差异对比贴一下,记录一下自己对各种推理框架的学习状况 YoloV8模型大小 模型名称 参数量 NANO 3.2M ... ... CPU推理框架性能比较 框架 推理耗时

    2024年02月14日
    浏览(41)
  • C++模型部署:qt+yolov5/6+onnxruntime+opencv

    作者平时主要是写 c++ 库的,界面方面了解不多,也没有发现“美”的眼镜,界面有点丑,大家多包涵。 本次介绍的项目主要是通过 cmake 构建一个 基于 c++ 语言的,以 qt 为框架的,包含 opencv 第三方库在内的,跨平台的,使用 ONNX RUNTIME 进行前向推理的 yolov5/6 演示平台。文章

    2024年02月05日
    浏览(46)
  • [segment-anything]使用onnxruntime部署sam模型,速度提高30倍!

    1、一台带有英伟达显卡的电脑 2、anaconda环境 3、CUDA以及cudnn 最近sam火遍了cv圈,号称可用一个模型分割一切,本文使用sam导出onnx模型,并通过onnxruntime(ort)进行部署,能够明显提升sam在本地的运算速度。话不多说,先看效果: pytorch运行时间: ort运行时间: 可见,sam的v

    2024年02月06日
    浏览(43)
  • ONNX格式模型 学习笔记 (onnxRuntime部署)---用java调用yolov8模型来举例

    ONNX(Open Neural Network Exchange)是一个开源项目,旨在建立一个开放的标准,使深度学习模型 可以在不同的软件平台和工具之间轻松移动和重用 。 ONNX模型可以用于各种应用场景,例如机器翻译、图像识别、语音识别、自然语言处理等。 由于ONNX模型的互操作性,开发人员 可以

    2024年01月22日
    浏览(43)
  • pytorch 42 C#使用onnxruntime部署内置nms的yolov8模型

    在进行目标检测部署时,通常需要自行编码实现对模型预测结果的解码及与预测结果的nms操作。所幸现在的各种部署框架对算子的支持更为灵活,可以在模型内实现预测结果的解码,但仍然需要自行编码实现对预测结果的nms操作。其实在onnx opset===11版本以后,其已支持将nms操

    2024年02月12日
    浏览(36)
  • Ubuntu环境下C++使用onnxruntime和Opencv进行YOLOv8模型部署

    目录 环境配置 系统环境 项目文件路径  文件环境  config.txt  CMakeLists.txt type.names  读取config.txt配置文件 修改图片尺寸格式 读取缺陷标志文件 生成缺陷随机颜色标识 模型推理 推理结果获取 缺陷信息还原并显示 总代码 Ubuntu18.04 onnxruntime-linux-x64 1.12.1:https://github.com/microsof

    2024年01月17日
    浏览(42)
  • VS c++ onnxruntime 环境配置、onnx教程、部署推理模型、sklearn pkl模型转onnx、问题汇总

    目录 一、初步认识ONNX 二、pkl转ONNX+可视化模型 三、ONNX Runtime运行时 3.1 相关介绍(了解此运行时): 3.2 VS、c++部署onnxruntime 3.3 头文件引用的一些问题 四、问题汇总: 1. 类没有成员 2. 版本兼容问题 3. 3.“GetInputName“: 不是 “Ort::Session“ 的成员 官网: ONNX Runtime | Home GitHub

    2024年04月09日
    浏览(39)
  • ONNXRuntime介绍及如何使用ONNXRuntime进行模型推理

    ONNXRuntime介绍及如何使用ONNXRuntime进行模型推理 随着人工智能的发展,越来越多的深度学习模型被应用到实际场景中。ONNX(Open Neural Network Exchange)是一个可跨平台、可扩展的开源模型交换格式,许多常见的深度学习框架都支持导出ONNX模型。而ONNXRuntime是由微软开发的一个高性

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包