AI部署这个词儿大家肯定不陌生,可能有些小伙伴还不是很清楚这个是干嘛的,但总归是耳熟能详了。
近些年来,在深度学习算法已经足够卷卷卷之后,深度学习的另一个偏向于工程的方向–部署工业落地,才开始被谈论的多了起来。当然这也是大势所趋,毕竟AI算法那么多,如果用不着,只在学术圈搞研究的话没有意义。因此很多AI部署相关行业和AI芯片相关行业也在迅速发展,现在虽然已经2021年了,但我认为AI部署相关的行业还未到头,AI也远远没有普及。
简单收集了一下知乎关于“部署”话题去年和今年的一些提问:
提问的都是明白人,随着人工智能逐渐普及,使用神经网络处理各种任务的需求越来越多,如何在生产环境中快速、稳定、高效地运行模型,成为很多公司不得不考虑的问题。不论是通过提升模型速度降低latency提高用户的使用感受,还是加速模型降低服务器预算,都是很有用的,公司也需要这样的人才。
在经历了算法的神仙打架、诸神黄昏、灰飞烟灭等等这些知乎热搜后。AI部署工业落地这块似乎还没有那么卷…相比AI算法来说,AI部署的入坑机会更多些。
聊聊AI部署
AI部署的基本步骤:
- 训练一个模型,也可以是拿一个别人训练好的模型
- 针对不同平台对生成的模型进行转换,也就是俗称的parse、convert,即前端解释器
- 针对转化后的模型进行优化,这一步很重要,涉及到很多优化的步骤
- 在特定的平台(嵌入端或者服务端)成功运行已经转化好的模型
- 在模型可以运行的基础上,保证模型的速度、精度和稳定性
就这样,虽然看起来没什么,但需要的知识和经验还是很多的。
因为实际场景中我们使用的模型远远比ResNet50要复杂,我们部署的环境也远远比实验室的环境条件更苛刻,对模型的速度精度需求也比一般demo要高。
对于硬件公司来说,需要将深度学习算法部署到性能低到离谱的开发板上,因为成本能省就省。在算法层面优化模型是一方面,但更重要的是从底层优化这个模型,这就涉及到部署落地方面的各个知识(手写汇编算子加速、算子融合等等);对于软件公司来说,我们往往需要将算法运行到服务器上,当然服务器可以是布满2080TI的高性能CPU机器,但是如果QPS请求足够高的话,需要的服务器数量也是相当之大的。这个要紧关头,如果我们的模型运行的足够快,可以省机器又可以腾一些buffer上新模型岂不很爽,这个时候也就需要优化模型了,其实优化手段也都差不多,只不过平台从arm等嵌入式端变为gpu等桌面端了。
作为AI算法部署工程师,你要做的就是将训练好的模型部署到线上,根据任务需求,速度提升2-10倍不等,还需要保证模型的稳定性。
是不是很有挑战性?
需要什么技术呢?
需要一些算法知识以及扎实的工程能力。
老潘认为算法部署落地这个方向是比较踏实务实的方向,相比设计模型提出新算法,对于咱们这种并不天赋异禀来说,只要肯付出,收获是肯定有的(不像设计模型,那些巧妙的结果设计不出来就是设计不出来你气不气)。
其实算法部署也算是开发了,不仅需要和训练好的模型打交道,有时候也会干一些粗活累活(也就是dirty work),自己用C++、cuda写算子(预处理、op、后处理等等)去实现一些独特的算子。也需要经常调bug、联合编译、动态静态库混搭等等。
算法部署最常用的语言是啥,当然是C++了。如果想搞深度学习AI部署这块,C++是逃离不了的。
所以,学好C++很重要,起码能看懂各种关于部署精巧设计的框架(再列一遍:Caffe、libtorch、ncnn、mnn、tvm、OpenVino、TensorRT,不完全统计,我就列过我用过的)。当然并行计算编程语言也可以学一个,针对不同的平台而不同,可以先学学CUDA,资料更多一些,熟悉熟悉并行计算的原理,对以后学习其他并行语言都有帮助。
系统的知识嘛,还在整理,还是建议实际中用到啥再看啥,或者有项目在push你,这样学习的更快一些。
可以选择上手的项目:
- 好用的开源推理框架:Caffe、NCNN、MNN、TVM、OpenVino
- 好用的半开源推理框架:TensorRT
- 好用的开源服务器框架:triton-inference-server
- 基础知识:计算机原理、编译原理等
AI大模型学习的理论基础
数学基础:
- 线性代数:AI 大模型中大量使用向量和矩阵运算,如矩阵乘法、向量点积等,用于表示和操作数据。
- 概率论与统计学:模型中的概率分布、随机变量和参数估计等都需要概率论和统计学的知识。
- 微积分:优化算法中的梯度计算和反向传播等都涉及到微积分的概念。
算法原理:
- 反向传播:这是深度学习中常用的算法,用于更新模型的参数,通过计算损失函数的梯度来调整模型。
- 随机梯度下降:一种常用的优化方法,通过不断迭代更新参数来最小化损失函数。
- 激活函数:用于对神经元的输出进行非线性变换,增加模型的表达能力。
模型架构设计:
- 卷积神经网络(CNN):擅长处理图像、视频等具有空间结构的数据,通过卷积操作提取特征。
- 循环神经网络(RNN):适用于处理序列数据,如自然语言处理中的文本。
- Transformer:一种全新的架构,在自然语言处理中取得了巨大成功,通过自注意力机制捕捉长距离依赖关系。
在大规模数据处理中的优势:
- 能够处理海量的数据,通过分布式训练等技术可以加速训练过程。
- 可以自动学习数据中的模式和特征,不需要人工设计特征。
- 模型的泛化能力强,可以应用于各种不同的任务和领域。
挑战:
- 模型的复杂度高,需要大量的计算资源和时间来训练。
- 容易过拟合,需要进行适当的正则化和超参数调整。
- 解释性较差,难以理解模型的决策过程。
AI模型部署方法
在AI深度学习模型的训练中,一般会用Python语言实现,原因是其灵活、可读性强。但在AI模型实际部署中,主要会用到C++,原因在于其语言自身的高效性。
对于AI模型的部署,有这几种方法可供选择:
-
使用 C++ 实现深度学习模型(★★★)
可以使用 C++ 编写自己的深度学习库或框架,但这需要您具有深入的数学和计算机科学知识。此外,也可以使用现有的开源 C++ 框架,如 TensorRT 和 OpenCV DNN 等。 -
导出深度学习模型到应用平台(★★)
许多深度学习框架支持将训练好的模型导出为 C++ 可以读取的格式,如 ONNX、TensorFlow Lite、Caffe2 等。这样可以在不重新训练模型的情况下,在 C++ 代码中加载和运行模型。 -
使用 C++ 库来加载和运行深度学习模型(★)
许多开发人员使用现有的 C++ 库来加载和运行深度学习模型,如 OpenCV、Dlib、Libtorch 等。这些库提供了一些方便的函数和接口,可以轻松地集成到您的 C++ 项目中。
AI模型部署框架
模型部署常见的推理框架有:ONNX、NCNN、OpenVINO、 TensorRT、Mediapipe。
- ONNX
官网:https://onnx.ai/
github:https://github.com/onnx/onnx
开放神经网络交换ONNX(Open Neural Network Exchange)是一套表示深度神经网络模型的开放格式,由微软和Facebook于2017推出,然后迅速得到了各大厂商和框架的支持。通过短短几年的发展,已经成为表示深度学习模型的实际标准,并且通过ONNX-ML,可以支持传统非神经网络机器学习模型,大有一统整个AI模型交换标准的趋势。
无论使用什么样的训练框架来训练模型(比如TensorFlow/Pytorch/OneFlow/Paddle),你都可以在训练后将这些框架的模型统一转为ONNX存储。ONNX文件不仅存储了神经网络模型的权重,还存储了模型的结构信息、网络中各层的输入输出等一些信息。目前,ONNX主要关注在模型预测方面(inferring),将转换后的ONNX模型,转换成我们需要使用不同框架部署的类型,可以很容易的部署在兼容ONNX的运行环境中。
- NCNN
github:https://github.com/Tencent/ncnn
ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架,也是腾讯优图实验室成立以来的第一个开源项目。ncnn 从设计之初深刻考虑手机端的部署和使用,无第三方依赖,跨平台,手机端 CPU 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 App。
从NCNN的发展矩阵可以看出,NCNN覆盖了几乎所有常用的系统平台,尤其是在移动平台上的适用性更好,在Linux、Windows和Android、以及iOS、macOS平台上都可以使用GPU来部署模型。
- OpenVINO
官网:https://docs.openvino.ai/latest/home.html
github:https://github.com/openvinotoolkit/openvino
OpenVINO是一种可以加快高性能计算机视觉和深度学习视觉应用开发速度的工具套件,支持各种英特尔平台的硬件加速器上进行深度学习,并且允许直接异构执行。OpenVINO™工具包是用于快速开发应用程序和解决方案的综合工具包,可解决各种任务,包括模拟人类视觉,自动语音识别,自然语言处理,推荐系统等。可在英特尔®硬件上扩展计算机视觉和非视觉工作负载,从而最大限度地提高性能。
OpenVINO在模型部署前,首先会对模型进行优化,模型优化器会对模型的拓扑结构进行优化,去掉不需要的层,对相同的运算进行融合、合并以加快运算效率,减少内存拷贝;FP16、INT8量化也可以在保证精度损失很小的前提下减小模型体积,提高模型的性能。在部署方面,OpenVIVO的开发也是相对比较简单的,提供了C、C++和python3种语言编程接口。
- TensorRT
官网:https://developer.nvidia.com/zh-cn/tensorrt
github:https://github.com/NVIDIA/TensorRT
NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK。此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高吞吐量。
在推理过程中,基于 TensorRT 的应用程序的执行速度可比 CPU 平台的速度快 40 倍。借助 TensorRT,您可以优化在所有主要框架中训练的神经网络模型,精确校正低精度,并最终将模型部署到超大规模数据中心、嵌入式或汽车产品平台中。
TensorRT 以 NVIDIA 的并行编程模型 CUDA 为基础构建而成,可帮助您利用 CUDA-X 中的库、开发工具和技术,针对人工智能、自主机器、高性能计算和图形优化所有深度学习框架中的推理。
- Mediapipe
官网:https://google.github.io/mediapipe/
github:https://github.com/google/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 加速。
如何选择
- 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解决方案和应用程序。
AI模型部署平台
AI 模型部署是将训练好的 AI 模型应用到实际场景中的过程。以下是一些常见的 AI 模型部署平台:
-
云端部署
云端部署是最流行的 AI 模型部署方式之一,通常使用云计算平台来托管模型和处理请求。例如,Amazon Web Services (AWS)、Microsoft Azure 和 Google Cloud Platform (GCP) 等云服务提供商都提供了 AI 模型部署解决方案。 -
边缘设备部署
边缘设备部署是将模型部署到 IoT 设备或嵌入式系统等边缘设备上的过程。这种部署方式可以减少延迟和网络带宽消耗,并提高隐私性和安全性。 -
移动设备部署
移动设备部署是将 AI 模型部署到移动设备上的过程,允许设备在本地执行推理而不需要依赖网络连接。这种部署方式对于需要快速响应和保护用户隐私的应用非常有用。 -
容器化部署
容器化部署是将 AI 模型封装到一个轻量级的容器中,然后在不同的环境中进行部署和运行。容器化部署可以提高可移植性和灵活性,并简化部署过程。
AI大模型的训练与优化
训练和优化大规模机器学习模型确实是一个具有挑战性的任务,以下是一些有效的方法和技巧:
- 计算资源分配:合理分配计算资源,例如使用 GPU 加速训练、分布式训练等技术,以提高训练效率。
- 参数调优:通过网格搜索、随机搜索或基于启发式的方法来调整模型的超参数,如学习率、正则化参数等。
- 正则化方法:应用正则化技术,如 L1、L2 正则化或dropout,以防止过拟合并提高模型的泛化能力。
- 模型压缩:采用压缩技术,如剪枝、量化等,减少模型的参数量和计算量,使其能够在资源有限的设备上运行。
- 数据增强:通过数据增强技术,如翻转、旋转、缩放等,增加训练数据的多样性,提高模型的鲁棒性。
- 梯度裁剪:限制梯度的范数,以避免梯度爆炸或消失问题。
- 早停法:根据验证集上的性能,在合适的时候停止训练,避免过拟合。
- 迁移学习:利用已有的预训练模型,在新的任务上进行微调,加快训练过程。
- 并行计算:使用多线程、多进程或分布式计算框架,加速模型的训练。
- 混合精度:在训练中使用低精度数据类型,如 FP16,减少内存消耗和计算时间。
未来发展趋势与挑战
AI 大模型学习的未来发展一些关键的趋势包括:
- 更大规模和更复杂的模型:随着计算能力的提高,我们将看到更大型、更复杂的模型出现,能够处理更庞大的数据和更复杂的任务。
- 多模态学习:结合多种数据形式,如图像、音频、文本等,进行综合学习,提高模型的理解能力。
- 可解释性和透明度:提高模型的可解释性,使人们能够更好地理解模型的决策过程。
- 分布式训练和边缘计算:利用分布式计算和边缘计算技术,加速模型训练和在边缘设备上的部署。
- 与人类的协同合作:AI 与人类将更加紧密地合作,共同解决问题。
然而,当前也面临一些挑战:
- 计算资源需求:训练大规模模型需要大量的计算资源,这可能限制其在一些场景中的应用。
- 数据隐私和安全:随着数据量的增加,数据隐私和安全问题将变得更加突出。
- 伦理和社会影响:需要关注 AI 技术对社会结构、就业等方面的影响。
- 技术瓶颈和限制:例如模型的泛化能力、对抗攻击的鲁棒性等方面仍存在挑战。
为了解决这些问题,可以探索以下研究方向:
- 高效的模型压缩和优化:减少模型的计算和存储需求,使其更易于部署。
- 联邦学习和隐私保护技术:在保护数据隐私的前提下进行模型训练。
- 人机协作的设计与研究:探索如何让 AI 与人类更好地协作。
- 可解释性方法的研究:提高模型的可解释性,增加人们对模型决策的信任。
- 对抗攻击和鲁棒性的研究:增强模型对恶意攻击的抵御能力。