一、人工智能——基础知识
1 什么是AI模型
AI模型是指运用数学、统计、计算机科学和机器学习等领域的方法,对具有一定规律性和可预测性的数据进行分析、处理、预测和优化的数学模型。简单来说,可以自动从输入数据中学习和提取特征,并根据学习到的知识进行决策和预测。
比如:线性回归,决策树,学习矢量量化,深度神经网络DNN。目标检测算法模型 YOLO
就是基于这些基础的AI模型构建。
2 什么是AI框架
因为我之前学过 TensorFlow
和 Pytorch
,所以我大概了解人工智能训练和推理的流程及原理。TensorFlow
和 Pytorch
就是常用的AI框架,这些框架的作用:提供了基本的神经网络模型(RNN,CNNS,SVM)、算法和优化器,使开发人员能够更轻松地创建自定义模型。
比如:目标检测常用模型 Yolo
,可以使用不用的AI框架进行训练和推理。
1.1 TensorFlow
-
优点:TensorFlow是Google开源的一个深度学习框架,它具有高度的灵活性和可扩展性,能够支持多种机器学习算法和深度学习模型。TensorFlow具有丰富的API和工具库,能够快速构建和训练模型,并实现高效的模型推理和部署。同时,TensorFlow还支持多种编程语言,包括Python、C++和Java等,可以满足不同开发者的需求。
-
缺点:相对较复杂,对初学者来说学习曲线较陡,有时需要编写更多的代码。
1.2 PyTorch
-
优点:PyTorch是Facebook开源的一个深度学习框架,它具有简单易用的API和强大的动态计算图功能,能够快速构建和训练深度学习模型。PyTorch还支持多种硬件平台和分布式训练,可以实现高效的模型训练和部署。同时,PyTorch还具有强大的社区支持和活跃的开发者社区,可以帮助开发者解决各种问题。
-
缺点:相对于TensorFlow,PyTorch在生产部署方面的支持相对较弱,尤其是对于大规模生产系统。
1.3 Keras
-
优点:Keras是一个高级神经网络API,它基于TensorFlow、Theano和CNTK等深度学习框架开发,提供了一种简单易用的方式来构建和训练深度学习模型。Keras具有简洁的API和易于使用的工具库,能够快速构建和训练各种深度学习模型,包括卷积神经网络、循环神经网络和自编码器等。同时,Keras还支持多种编程语言,包括Python和R等,可以满足不同开发者的需求。
-
缺点:相对于TensorFlow和PyTorch,Keras的灵活性较低,不太适合需要自定义层或操作的任务。
1.4 Caffe
-
优点:Caffe是一个基于C++开发的深度学习框架,它具有高效的计算能力和快速的模型训练能力,能够支持多种深度学习模型和算法。Caffe具有简单易用的API和高效的计算库,能够实现快速的模型训练和推理。同时,Caffe还具有强大的社区支持和丰富的模型库,可以帮助开发者快速搭建自己的深度学习应用。
-
缺点:相对较难扩展和定制,不如TensorFlow和PyTorch那样灵活。
3 ONNX开放神经网络交换
3.1 ONNX出现的原因
上面提到了这么多的人工智能框架,在深度学习模型落地的过程中,会面临将模型部署到边端设备的问题,模型训练使用不同的框架,则推理的时候也需要使用相同框架。
但因为每个平台都有不同的功能和特性,所以不同类型的平台,调优和实现起来非常困难。如果需要在该平台上运行多种框架,则会增加复杂性,所以 ONNX 便派上了用场。其通过将不同框架训练的模型转换成通用的 ONNX 模型,再进而转换成各个平台支持的格式,就可以实现简化部署。
3.2 ONNX基本概念
ONNX 是 Open Neural Network Exchange 的简称,也叫开放神经网络交换,是一个用于表示深度学习模型的标准,可使模型在不同框架直接转换。
ONNX 是迈向开放式生态系统的第一步,使得开发人员不局限于某种特定的开发工具,为模型提供了开源格式。
ONNX 目前支持的框架有:Caffe2、PyTorch、TensorFlow、MXNet、TensorRT、CNTK 等
ONNX 通常来说就是一个中介,是一种手段,在把模型转换成 ONNX 之后,再转换成可部署的形式,如 TensorRT。
典型的结构转换路线:
Pytorch → ONNX → TensorRT
4 TensorRt
ensorRT 是由英伟达公司推出的一款用于高性能深度学习模型推理的软件开发工具包,可以把经过优化后的深度学习模型构建成推理引擎部署在实际的生产环境中。用于对嵌入式平台、自动驾驶等平台的推理加速。
TensorRT 是采用 C++ 语言编写的高性能推理框架,可以在所有平台上提供 C++语言的实现,TensorRT 推理应用程序与英伟达的 GPU 结合可以提供最大的吞吐量和较低的延迟速度。
4.1 用途
模型包括训练和推理两个阶段,训练的时候包含了前向传播和反向传播,推理只包含前向传播,所以预测时候的速度更重要。
现在大多数的深度学习网络模型结构复杂并且参数量巨大,需要使用多个高性能的 GPU 分布式训练才能获得全局最优的结果,这使得深度学习方法很难应用中在实际的生产环境中
为了降低生产成本,在实际应用中,模型通常都会部署在嵌入式开发板上,或者使用单个 GPU 甚至是嵌入式平台,其算力相对较低,对于结构复杂且参数量巨大的网络模型较难获取实时的推理速度
模型训练时采用的框架会不同,不同机器的性能会存在差异,导致推理速度变慢,无法满足高实时性。如果在使用深度学习方法时,部署应用的机器的深度学习环境要与网络模型训练时的环境相同,这增加了深度学习方法部署的复杂性。
而 TensorRT 就是推理优化器,把 ONNX 模型转换为 TensorRT 之后,就可以在相关边端部署了。
TensorRT 的优势:
- 与许多轻量级的深度学习网络模型相比,TensorRT 不仅可以大幅提高网络的推理速度,而且只损失些许的精度。
- 同时,使用 TensorRT 优化后的网络模型的部署不再需要与训练时相同的环境。
- 使用 TensorRT 优化之后的网络推理速度有了较大的提高
4.2 TensorRT 优化方法
4.2.1 层间融合或张量融合
TensorRT通过对层间的横向或纵向合并(合并后的结构称为CBR,意指 convolution, bias, and ReLU layers are fused to form a single layer),使得层的数量大大减少。横向合并可以把卷积、偏置和激活层合并成一个 CBR 结构,只占用一个 CUDA 核心。纵向合并可以把结构相同,但是权值不同的层合并成一个更宽的层,也只占用一个CUDA核心。合并之后计算图的层次更少了,占用的CUDA核心数也少了,因此整个模型结构会更小,更快,更高效。
4.2.2 数据精度校准
大部分深度学习框架在训练神经网络时网络中的张量都是 32 位浮点数的精度(Full 32-bit precision,FP32),一旦网络训练完成,在部署推理的过程中由于不需要反向传播,完全可以适当降低数据精度,比如降为 FP16 或 INT8 的精度。更低的数据精度将会使得内存占用和延迟更低,模型体积更小。
4.2.3 Kernel Auto-Tuning
网络模型在推理计算时,是调用 GPU 的 CUDA 进行计算的,TensorRT 可以针对不同的算法、不同的模型结构、不同的 GPU 平台等,进行 CUDA 调整,以保证当前模型在特定平台上以最优的性能计算。
假设在 3090 和 T4 上要分别部署,则需要分别在这两个平台上进行 TensorRT 的转换,然后在对应的平台上使用,而不能在相同的平台上转换,在不同的平台上使用。