关于tensorRT的失败使用总结

tensorRT入门

在这里插入图片描述

简介

TensorRT 是NVIDIA公司发布的一个高性能的深度学习推理加速框架

训练主要是获得层与层之间的权重参数,目的是为了获得一个性能优异的模型,关注点集中在模型的准确度、精度等指标。

推理(inference)则不一样,其没有了训练中的反向迭代过程,只是针对新的数据进行预测。相较于训练,推理的更关注的是部署简单、处理速度快、吞吐率高和资源消耗少。

作用:TensorRT优化深度学习模型结构,并提供高吞吐率和低延迟的推理部署。

应用:TensorRT可用于大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。

————————————————
版权声明:本文为CSDN博主「一颗小树x」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41204464/article/details/123998448

TensorRT的流程

TensorRT整个过程可以分三个步骤,即模型的解析(Parser),Engine优化执行(Execution)。

首先输入是一个预先训练好的FP32的模型和网络,将模型通过parser等方式输入到TensorRT中,TensorRT可以生成一个Serialization,也就是说将输入串流到内存或文件中,形成一个优化好的engine,得到优化好的engine可以序列化到内存(buffer)或文件(file),读的时候需要反序列化,将其变成engine以供使用。然后在执行的时候创建context,主要是分配预先的资源,engine加context就可以做推断(Inference)。

什么模型可以转换为TensorRT

TensorRT官方支持Caffe、Tensorflow、Pytorch、ONNX等模型的转换(不过Caffe和Tensorflow的转换器Caffe-Parser和UFF-Parser已经有些落后了),也提供了三种转换模型的方式:

  • 使用TF-TRT,将TensorRT集成在TensorFlow中
  • 使用ONNX2TensorRT,即ONNX转换trt的工具
  • 手动构造模型结构,然后手动将权重信息挪过去,非常灵活但是时间成本略高,有大佬已经尝试过了:tensorrtx

不过目前TensorRT对ONNX的支持最好,TensorRT-8最新版ONNX转换器又支持了更多的op操作。而深度学习框架中,TensorRT对Pytorch的支持更为友好,除了Pytorch->ONNX->TensorRT这条路,还有:

总而言之,理论上95%的模型都可以转换为TensorRT,条条大路通罗马嘛。只不过有些模型可能转换的难度比较大。如果遇到一个无法转换的模型,先不要绝望,再想想,再想想,看看能不能通过其他方式绕过去。

关于TensorRT部署

部署TensorRT的方式,官方提供了三种:

  • 集成在Tensorflow中使用,比例TF-TRT,这种操作起来比较便捷,但是加速效果并不是很好;
  • 在TensorRT Runtime环境中运行模型,就是直接使用TensorRT;
  • 搭配服务框架使用,最配的就是官方的triton-server,完美支持TensorRT,用在生产环境杠杠的!

TensorRT支持权重精度

支持FP32、FP16、INT8、TF32等,这几种类型都比较常用。

  • FP32:单精度浮点型,没什么好说的,深度学习中最常见的数据格式,训练推理都会用到;
  • FP16:半精度浮点型,相比FP32占用内存减少一半,有相应的指令值,速度比FP32要快很多;
  • TF32:第三代Tensor Core支持的一种数据类型,是一种截短的 Float32 数据格式,将FP32中23个尾数位截短为10bits,而指数位仍为8bits,总长度为19(=1+8 +10)。保持了与FP16同样的精度(尾数位都是 10 位),同时还保持了FP32的动态范围指数位都是8位);
  • INT8:整型,相比FP16占用内存减小一半,有相应的指令集,模型量化后可以利用INT8进行加速。

TensorRT的缺点

TensorRT不是没有“缺点”的,有一些小小的缺点需要吐槽一下:

  • 经过infer优化后的模型与特定GPU绑定,例如在1080TI上生成的模型在2080TI上无法使用;
  • 高版本的TensorRT依赖于高版本的CUDA版本,而高版本的CUDA版本依赖于高版本的驱动,如果想要使用新版本的TensorRT,更换环境是不可避免的;
  • TensorRT尽管好用,但推理优化infer还是闭源的,像深度学习炼丹一样,也像个黑盒子,使用起来会有些畏手畏脚,不能够完全掌控。所幸TensorRT提供了较为多的工具帮助我们调试。

部署流程

Nvidia Triton使用教程

参考资料

关于tensorRT

TensorRT详细入门指北,如果你还不了解TensorRT,过来看看吧! - OLDPAN的文章 - 知乎 https://zhuanlan.zhihu.com/p/371239130

NVIDIA官方文档

TRT安装包下载

【TensorRT系列】1.TensorRT安装教程 - Tramac的文章 - 知乎 https://zhuanlan.zhihu.com/p/379287312

官方安装文档中文翻译

b站教程


TensorRT (TF-TRT)

将 TensorRT 直接集成到 TensorFlow 中。它选择 TensorFlow 图的子图由 TensorRT 加速,同时让图的其余部分由 TensorFlow 本地执行。结果仍然可以照常执行的 TensorFlow 图。

【解决方案】TensorRT安装方法,及测试TensorRT中sample给出的mnist时,出现Could not find x.pgm错误解决方法

关于tensor-serving

官方文档:https://www.tensorflow.org/tfx/serving/docker
亚马逊的中文文档:https://docs.aws.amazon.com/zh_cn/dlami/latest/devguide/tutorial-tfserving.html

官方中文文档

官方介绍
TensorFlow Serving使用指南
TensorFlow Serving入门
tensorflow serving docker
tensorflow serving + docker部署模型

关于TensorRT Inference Server

TensorRT Inference Server 的简单教程 - 纳米酱的文章 - 知乎 https://zhuanlan.zhihu.com/p/103263351

关于NVIDIA-trition

GitHub - triton-inference-server/server: The Triton Inference Server provides an optimized cloud and edge inferencing solution.

NVIDIA Triton是什么? - OpenPPL的回答 - 知乎 https://www.zhihu.com/question/507633460/answer/2426145504

推理服务器是一个更高级别的库,可提供跨 CPU 和 GPU 的优化推理。它提供了启动和管理多个模型的功能,以及用于服务推理的 REST 和 gRPC 端点。

其他

tensor-serving

Tensorflow Serving官方Docker仓库

TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库,可以将训练好的模型直接上线并提供服务。其一个重要特性是:它支持模型热更新与自动模型版本管理,这意味着一旦部署 TensorFlow Serving 后,你再也不需要为线上服务操心,只需要关心你的线下模型训练。
TF Serving采用客户端/服务端模式,其通信方式有两种 gRPC和REST API
————————————————
版权声明:本文为CSDN博主「I’m George」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40922744/article/details/102872607


Your ONNX model has been generated with INT64 weights, while TensorRT does not natively support INT64. Attempting to cast down to INT32.

GitHub - onnx/tensorflow-onnx: Convert TensorFlow, Keras, Tensorflow.js and Tflite models to ONNX

解决bug

https://blog.csdn.net/wohenibdxt/article/details/124748731

https://aijishu.com/a/1060000000207612

https://www.yanxishe.com/columnDetail/10275


部署环境之:tf2onnx - Convert TensorFlow models to ONNX - 一坨小哥的文章 - 知乎 https://zhuanlan.zhihu.com/p/157477465

手动编译安装TF-TRT

pb_graph = tf.graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(), [v.op.name for v in outputs])
with tf.gfile,FastGFile('./pbmodel_name.pb',model='wb') as f:
    f.write(pb_graph.SerializeToString())\

更多资料

https://blog.csdn.net/kunhe0512/article/details/124908238

Nvidia CUDA, cuDNN, TensorRT,驱动以及架构之间的相互兼容关系 - Devymex Wang的文章 - 知乎 https://zhuanlan.zhihu.com/p/438939299

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorRT是英伟达(NVIDIA)专门为深度学习模型推理(inference)而开发的高性能推理引擎。TensorRT可以优化和加速深度学习推理,并提供支持各种深度学习框架的API,例如 TensorFlow,PyTorch,Caffe 等等。 使用TensorRT进行推理可以大幅度提高推理速度,因为它采用了多项技术优化,包括半精度计算(half precision),kernel融合(kernel fusion),动态tensor缓冲区等等。 TensorRT使用流程一般如下: 1. 用深度学习框架训练好模型,如TensorFlow、PyTorch等等。 2. 导出训练好的模型为ONNX或UFF格式。 3. 用TensorRT API读取ONNX或UFF格式的模型,创建推理引擎。 4. 将待推理的数据输入到引擎中,进行推理计算。 5. 获取结果并输出。 以下是一个简单的使用TensorRT API进行推理的示例代码: ```python import tensorrt as trt # Load the serialized TensorRT model from disk. with open('model.engine', 'rb') as f: engine_data = f.read() # Create a TensorRT engine from the serialized data. trt_runtime = trt.Logger(trt.Logger.WARNING) engine = trt_runtime.deserialize_cuda_engine(engine_data) # Allocate memory for input and output tensors. input_shape = (1, 3, 224, 224) output_shape = (1, 1000) input_tensor = cuda.mem_alloc(np.prod(input_shape) * np.dtype(np.float32).itemsize) output_tensor = cuda.mem_alloc(np.prod(output_shape) * np.dtype(np.float32).itemsize) # Create a CUDA stream for the engine to execute on. stream = cuda.Stream() # Create a bindings object that maps the input and output tensors to memory. bindings = [int(input_tensor), int(output_tensor)] # Create a Python context object that can execute the engine. context = engine.create_execution_context() # Perform inference on a batch of data. input_data = np.random.rand(*input_shape).astype(np.float32) cuda.memcpy_htod_async(input_tensor, input_data, stream) context.execute_async_v2(bindings=bindings, stream_handle=stream.handle) cuda.memcpy_dtoh_async(output_data, output_tensor, stream) stream.synchronize() # Print the inference result. print(output_data) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值