1.4 TensorRT
简介:
NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK。此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高吞吐量。
在推理过程中,基于 TensorRT 的应用程序的执行速度可比 CPU 平台的速度快 40 倍。借助 TensorRT,您可以优化在所有主要框架中训练的神经网络模型,精确校正低精度,并最终将模型部署到超大规模数据中心、嵌入式或汽车产品平台中。
TensorRT 以 NVIDIA 的并行编程模型 CUDA 为基础构建而成,可帮助您利用 CUDA-X 中的库、开发工具和技术,针对人工智能、自主机器、高性能计算和图形优化所有深度学习框架中的推理。
TensorRT 针对多种深度学习推理应用的生产部署提供 INT8 和 FP16 优化,例如视频流式传输、语音识别、推荐和自然语言处理。推理精度降低后可显著减少应用延迟,这恰巧满足了许多实时服务、自动和嵌入式应用的要求。
使用场景:
框架特点:
1. 权重与激活精度校准
通过将模型量化为 INT8 来更大限度地提高吞吐量,同时保持高准确度
2. 层与张量融合
通过融合内核中的节点,优化 GPU 显存和带宽的使用
3. 内核自动调整
基于目标 GPU 平台选择最佳数据层和算法
4. 动态张量显存
更大限度减少显存占用,并高效地为张量重复利用内存
5. 多流执行
用于并行处理多个输入流的可扩展设计
图片取自TensorRT的官网,里面列出了TensorRT使用的一些技术。可以看到模型量化、动态内存优化、层的融合等技术均已经在TensorRT中集成了,这也是它能够极大提高模型推断速度的原因。总体来说TensorRT将训练好的模型通过一系列的优化技术转化为了能够在特定平台(GPU)上以高性能运行的代码,也就是最后图中生成的Inference Engine。
使用方法:
1.导出模型
2.选择批次大小
3.选择精度
4.转换模型:
- 使用 TF-TRT
- 从文件自动转换 ONNX
- 使用 TensorRT API 手动构建网络(C++或python)
5.部署模型:
- 在 TensorFlow 中部署
- 使用独立的 TensorRT 运行时 API
- 使用 NVIDIA Triton 推理服务器
具体模型转换部署方法详见:[Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation]:https://docs.nvidia.com/deeplearning/tensorrt/quick-start-guide/index.html
1.5 Mediapipe
简介:
MediaPipe是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 YouTube、Google Lens、ARCore、Google Home 以及 Nest,都已深度整合了 MediaPipe。作为一款跨平台框架,MediaPipe 不仅可以被部署在服务器端,更可以在多个移动端 (安卓和苹果 iOS)和嵌入式平台(Google Coral 和树莓派)中作为设备端机器学习推理 (On-device Machine Learning Inference)框架。
除了上述的特性,MediaPipe 还支持 TensorFlow 和 TF Lite 的推理引擎(Inference Engine),任何 TensorFlow 和 TF Lite 的模型都可以在 MediaPipe 上使用。同时,在移动端和嵌入式平台,MediaPipe 也支持设备本身的 GPU 加速。
使用场景:
框架特点:
- 端到端加速:内置快速 ML 推理和处理,即使在普通硬件上也能加速
- 一次构建,随处部署:统一解决方案适用于安卓、iOS、桌面/云、Web 和物联网
- 即用型解决方案:展示框架全部功能的尖端 ML 解决方案
- 免费和开源:Apache 2.0下的框架和解决方案,完全可扩展和可定制
使用方法:
[代码示例]以人脸检测为例:https://google.github.io/mediapipe/solutions/face_detection
import cv2 import mediapipe as mp mp_face_detection = mp.solutions.face_detection mp_drawing = mp.solutions.drawing_utils # 对于静态图像: IMAGE_FILES = [] with mp_face_detection.FaceDetection( model_selection=1, min_detection_confidence=0.5) as face_detection: for idx, file in enumerate(IMAGE_FILES): image = cv2.imread(file) # 将BGR图像转换为RGB并使用MediaPipe人脸检测对其进行处理. results = face_detection.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # 绘制每张人脸的人脸检测. if not results.detections: continue annotated_image = image.copy() for detection in results.detections: print('Nose tip:') print(mp_face_detection.get_key_point( detection, mp_face_detection.FaceKeyPoint.NOSE_TIP)) mp_drawing.draw_detection(annotated_image, detection) cv2.imwrite('/tmp/annotated_image' + str(idx) + '.png', annotated_image) # 用于网络摄像头输入: cap = cv2.VideoCapture(0) with mp_face_detection.FaceDetection( model_selection=0, min_detection_confidence=0.5) as face_detection: while cap.isOpened(): success, image = cap.read() if not success: print("Ignoring empty camera frame.") # 如果加载视频,请使用“中断”而不是“继续”. continue # 若要提高性能,可以选择将图像标记为不可写以通过引用传递. image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释. image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) if results.detections: for detection in results.detections: mp_drawing.draw_detection(image, detection) # 水平翻转图像以获得自拍视图显示. cv2.imshow('MediaPipe Face Detection', cv2.flip(image, 1)) if cv2.waitKey(5) & 0xFF == 27: break cap.release()
2.框架对比
应用平台:
模型推理部署框架 | 应用平台 |
NCNN | 移动端 |
OpenVINO | CPU,GPU,嵌入式平台都可以使用,尤其是在CPU上首选OPenVINO。DepthAI嵌入式空间AI平台。 |
TensorRT | 只能用在NIVDIA的GPU上的推理框架。NIVDIA的Jetson平台。 |
Mediapipe | 服务端,移动端,嵌入式平台,TPU。 |
研发单位:
- 腾讯公司开发的移动端平台部署工具——NCNN;
- Intel公司针对自家设备开开发的部署工具——OpenVINO;
- NVIDIA公司针对自家GPU开发的部署工具——TensorRT;
- Google针对自家硬件设备和深度学习框架开发的部署工具——Mediapipe;
- 由微软、亚马逊 、Facebook 和 IBM 等公司共同开发的开放神经网络交换格式——ONNX;
如何选择:
- ONNXRuntime 是可以运行在多平台 (Windows,Linux,Mac,Android,iOS) 上的一款推理框架,它接受 ONNX 格式的模型输入,支持 GPU 和 CPU 的推理。唯一不足就是 ONNX 节点粒度较细,推理速度有时候比其他推理框架如 TensorRT 较低。
- NCNN是针对手机端的部署。优势是开源较早,有非常稳定的社区,开源影响力也较高。
- OpenVINO 是 Intel 家出的针对 Intel 出品的 CPU 和 GPU 友好的一款推理框架,同时它也是对接不同训练框架如 TensorFlow,Pytorch,Caffe 等。不足之处可能是只支持 Intel 家的硬件产品。
- TensorRT 针对 NVIDIA 系列显卡具有其他框架都不具备的优势,如果运行在 NVIDIA 显卡上, TensorRT 一般是所有框架中推理最快的。一般的主流的训练框架如TensorFlow 和 Pytorch 都能转换成 TensorRT 可运行的模型。当然了,TensorRT 的限制就是只能运行在 NVIDIA 显卡上,同时不开源 kernel。
- MediaPipe 不支持除了tensorflow之外的其他深度学习框架。MediaPipe 的主要用例是使用推理模型和其他可重用组件对应用机器学习管道进行快速原型设计。MediaPipe 还有助于将机器学习技术部署到各种不同硬件平台上的演示和应用程序中,为移动、桌面/云、web和物联网设备构建世界级ML解决方案和应用程序。
3.小结
本文主要介绍了5种推理框架,目的是使大家更加直观的了解这几种框架的特点,应用场景以及如何选择,为大家之后的学习提供有限的帮助,不足之处请大家多多指正。
参考资料
- https://learn.microsoft.com/zh-cn/windows/ai/
- https://github.com/Tencent/ncnn
- https://zhuanlan.zhihu.com/p/344442534
- https://github.com/google/mediapipe
- https://www.zhihu.com/question/346965029/answer/2395418101
原文首发微信公众号【自动驾驶之心】:一个专注自动驾驶与AI的社区(https://mp.weixin.qq.com/s/NK-0tfm_5KxmOfFHpK5mBA)