『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT] |
一. 神经网络部署
1.1. 程序语言运行时(Runtime)
1.2. C++运行时(Runtime) 与 C++ 标准
1.3. 神经网络运行时(Runtime)
1.4. 神经网络表示
1.5. 神经网络部署&例子
二. TensorRT教程
- 辅助文档-本教程配套代码,以及更多范例和文档:https://github.com/NVIDIA/trt-samples-for-hackathon-cn/tree/master/cookbook
- Polygraphy:深度学习推理原型设计和调试工具包
2.1. 前置条件-计算机指令执行过程
2.2. 前置条件-计算机处理器架构
- 介绍个工具Torch.Profiler,使用它来确定你的性能瓶颈Introduction of torch.profiler
2.3. TensorRT简介
- TensorRT文档:https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html
- C++ API 文档:https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/
- python API 文档:https://docs.nvidia.com/deeplearning/tensorrt/api/python_api/
- TensorRT下载:https://developer.nvidia.com/tensorrt-download
- 辅助文档-本教程配套代码,以及更多范例和文档:https://github.com/NVIDIA/trt-samples-for-hackathon-cn/tree/master/cookbook
TensorRT究竟使用了哪些技术使得我们的深度学习模型得以在GPU上加速运行呢?
- 一方面模型构建期(推理优化器): 模型从网络结构变成可执行程序的过程,在这个过程中TensorRT的推理优化器主要帮我们完成了下面的工作:
- ①模型解析/建立:TensorRT可以加载 Onnx 等其他格式的模型或在其中使用原生 API 搭建模型
- ②计算图优化:包括横向层融合( Conv )、纵向层融合( Conv+add+ReLU)等
- ③节点消除:去除计算层中的一些无用层,并进行常数融合以及一些节点变换( Pad , Slice , Concat , Shuffle)等,这些变换有利于真正计算时的内存拷贝等操作。
- ④多精度支持:TensorRT支持FP32/FP16/INT8/TF32等多种数据类型的混合计算,以便加快计算速度,但是单价是有可能插入额外的reformat节点,用于数据类型的转换。
- ⑤之后TensorRT会帮我们优选 kernel / format 硬件有关优化,这个是因为对于计算图中的一个节点,我们在GPU上可能有多重实现,具体到我们要运行TensorRT的GPU上得时候,究竟哪一种实现最快呢?这一步需要TensorRT帮我们选择的。[在TensorRT中,kernel是指用于执行特定层计算的 CUDA核函数]
- ⑥导入 plugin:实现自定义操作,有时候计算图中会遇到TensorRT原生不支持的操作,这个时候需要外部导入一些cuda c++编写的plugin,来使用这些plugin帮我们完成计算。
- ⑦显存优化:TensorRT运行的时候,会帮我们维护一个显存池,我们计算过程中所有用到的显存,都可以使用显存池复用,避免重复的内存申请和释放,帮我们节约时间和空间。
- 另一方面模型运行期(运行时环境): 也就是模型的可执行文件真正接收了输入的数据,并运行的阶段,在这个阶段主要完成了运行时环境、序列化/反序列化两方面的工作。
- TensorRT文档有详细介绍,比如说计算图优化部分,具体到哪些layer之间可以发生融合,都有逐一的列举
- https://developer.nvidia.com/blog/production-deep-learning-nvidia-gpu-inference-engine/
- NVIDIA GPU Inference Engine(GIE)具体解释见上面的链接 对神经网络图进行了一些重要的转换和优化。首先,消除未使用输出的层以避免不必要的计算。接下来,在可能的情况下,融合卷积层、偏置层和 ReLU 层以形成单层。图 2显示了图 1 中原始网络的垂直层融合结果(融合层在图 4 中标记为 CBR)。层融合提高了在 GPU 上运行 GIE 优化网络的效率。
- 另一种转换是水平层融合或层聚合,以及所需的聚合层到各自输出的划分,如图3所示。水平层融合通过组合采用相同源张量并应用相似参数的相同操作的层来提高性能,从而形成一个更大的层以提高计算效率。图3中的示例显示了图 2 中 3 个 1×1 CBR 层的组合,这些层将相同的输入放入单个较大的 1×1 CBR 层中。请注意,必须分解该层的输出,以将原始输入图输入到不同的后续层中。
- 图3如下,卷积神经网络上水平层融合的示例。在这里,图 4 中的多个 1×1 CBR 层“水平”融合,或者跨越图中共享相同输入的相似层。
文章来源:https://www.toymoban.com/news/detail-679186.html
- 下面摘选自2021年nvidia的一些讲座中,TensorRT优化的成果: 第1行2张图对比了多种图像分类和目标识别模型,在Tensorflow框架内,以及使用Tensorflow自带的TRT接口下的性能。左下角这张图对比了BERT模型在Tensorflow和TensorRT中的延迟,右下角这张图对比了ONNX Runtime中使用cuda和TensorRT两种后端的性能。总体来看对于计算密集型任务,比如矩阵乘法和卷积,TensorRT选用了高效的算子,提升计算效率。对于访存密集型的任务,TensorRT会采用算子融合减少访问和数据的拷贝量以提高访问的效率,此外TensorRT可以使用低精度的类型,在精度损失可以允许的情况下,同时减少计算时间和内存显存的使用量,以加快计算速度
文章来源地址https://www.toymoban.com/news/detail-679186.html
参考文献
- 模型量化以及部署B站链接:PPQ-神经网络量化框架
- 模型量化以及部署B站链接:神经网络-量化与部署
到了这里,关于『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!