模型训练高频面试题
1.模型压缩的必要性与可行性?
模型压缩是指对算法模型进行精简,进而得到一个轻量且性能相当的小模型,压缩后的模型具有更小的结构和更少的参数,可以有效降低计算和存储开销,便于部署在端侧设备中。
随着AI技术的飞速发展,不管是移动端产品还是线上产品,进行AI赋能都成为了趋势。这种情况下,AI算法的实时性与减少内存占用都显得极为重要。AI模型的参数在一定程度上能够表达其复杂性,但并不是所有的参数都在模型中发挥作用,部分参数作用有限,表达冗余,甚至会降低模型的性能。
2.X86和ARM架构在深度学习侧的区别?
AI服务器与PC端一般都是使用X86架构,因为其高性能;AI端侧设备(手机/端侧盒子等)一般使用ARM架构,因为需要低功耗。
X86指令集中的指令是复杂的,一条很长指令就可以很多功能;而ARM指令集的指令是很精简的,需要几条精简的短指令完成很多功能。
X86的方向是高性能方向,因为它追求一条指令完成很多功能;而ARM的方向是面向低功耗,要求指令尽可能精简。
3.FP32,FP16以及Int8的区别?
常规精度一般使用FP32(32位浮点,单精度)占用4个字节,共32位;低精度则使用FP16(半精度浮点)占用2个字节,共16位,INT8(8位的定点整数)八位整型,占用1个字节等。
混合精度(Mixed precision)指使用FP32和FP16。 使用FP16 可以减少模型一半内存,但有些参数必须采用FP32才能保持模型性能。
虽然INT8精度低,但是数据量小、能耗低,计算速度相对更快,更符合端侧运算的特点。
不同精度进行量化的归程中,量化误差不可避免。
在模型训练阶段,梯度的更新往往是很微小的,需要相对较高的精度,一般要用到FP32以上。在inference的阶段,精度要求没有那么高,一般F16或者INT8就足够了,精度影响不会很大。同时低精度的模型占用空间更小了,有利于部署在端侧设备中。
4.GPU显存占用和GPU利用率的定义
GPU在训练时有两个重要指标可以查看,即显存占用和GPU利用率。
显存指的是GPU的空间,即内存大小。显存可以用来放模型,数据等。
GPU 利用率主要的统计方式为:在采样周期内,GPU 上有 kernel 执行的时间百分比。可以简单理解为GPU计算单元的使用率。
5.神经网络的显存占用分析
Float32 是在深度学习中最常用的数值类型,称为单精度浮点数,每一个单精度浮点数占用4Byte的显存。
在整个神经网络训练周期中,在GPU上的显存占用主要包括:数据,模型参数,模型输出等。
数据侧:举个🌰,一个323128128的四维矩阵,其占用的显存 = 323128128*4 /1000 / 1000 = 6.3M
模型侧:占用显存的层包括卷积层,全连接层,BN层,梯度,优化器的参数等。
输出侧:占用的显存包括网络每一层计算出来的feature map以及对应的梯度等。
7.影响模型inference速度的因素?
FLOPs(模型总的加乘运算)
MAC(内存访问成本)
并行度(模型inference时操作的并行度越高,速度越快)
计算平台(GPU,AI协处理器,CPU等)
8.为何在AI端侧设备一般不使用传统图像算法?
AI端侧设备多聚焦于深度学习算法模型的加速与赋能,而传统图像算法在没有加速算子赋能的情况下,在AI端侧设备无法发挥最优的性能。
9.减小模型内存占用有哪些办法?
模型剪枝
模型蒸馏
模型量化
模型结构调整
10.有哪些经典的轻量化网络?
SqueezeNet
MobileNet
ShuffleNet
Xception
GhostNet
11.模型参数计算?
首先,假设卷积核的尺寸是$K \times K$,有$C$个特征图作为输入,每个输出的特征图大小为$H \times W$,输出为个特征图。
由于模型参数量主要由卷积,全连接层,BatchNorm层等部分组成,我们以卷积的参数量为例进行参数量的计算分析:
卷积核参数量:
偏置参数量:
总体参数量:
12.模型FLOPs怎么算?
同样,我们假设卷积核的尺寸是,有个特征图作为输入,每个输出的特征图大小为,输出为个特征图。
由于在模型中卷积一般占计算量的比重是最高的,我们依旧以卷积的计算量为例进行分析:
FLOPS(全大写):是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
FLOPs(s小写):是floating point operations的缩写(s表示复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
针对模型的计算量应该指的是FLOPs。
在上述情况下,卷积神经网络一次前向传播需要的乘法运算次数为:
同时,所要进行的加法计算次数分为考虑偏置和不考虑偏置:
(1)考虑偏置的情况:
为了得到输出的特征图的一个未知的像素,我们需要进行
次加法操作,其中大小的卷积操作需要次加法,由于有C个通道,所以需要将结果乘以C,每个通道间的数要相加,所以需要C - 1次加法,最后再加上偏置的1次加法。
所以总的加法计算量如下:
所以总的卷积运算计算量(乘法+加法):
(2)不考虑偏置的情况:
总的卷积计算量:
13.什么是异构计算?
首先,异构现象是指不同计算平台之间,由于硬件结构(包括计算核心和内存),指令集和底层软件实现等方面的不同而有着不同的特性。
异构计算是指联合使用两个或者多个不同的计算平台,并进行协同运算。比如CPU和GPU的异构计算,TPU和GPU的异构计算以及TPU/GPU/CPU的异构计算等等。
14.端侧部署时整个解决方案的核心指标?
精度
耗时
内存占用
功耗
15.什么是模型量化?
通常的深度学习模型参数是FP32浮点型的,而模型量化主要是使用FP16,INT8以及INT4等低精度类型来保存模型参数,从而有效的降低模型计算量和内存占用,并将精度损失限制在一个可接受的范围内。
模型量化主要分在线量化和离线量化。在线量化在模型训练阶段采用量化方法进行量化。离线量化主要在模型离线工具(模型转换阶段)中采用量化方法进行量化。
工业界中主要使用离线量化作为通用模型量化的解决方案。
16.什么是模型剪枝?
模型剪枝按照剪枝粒度可分为突触剪枝、神经元剪枝、权重矩阵剪枝等,主要是将权重矩阵中不重要的参数设置为0,结合稀疏矩阵来进行存储和计算。通常为了保证性能,需要逐步进行迭代剪枝,让精度损失限制在一个可接受的范围。
突触剪枝剪掉神经元之间的不重要的连接。对应到权重矩阵中,相当于将某个参数设置为0。
神经元剪枝则直接将某个节点直接裁剪。对应到权重矩阵中,相当于某一行和某一列置零。
除此之外,也可以将整个权重矩阵裁剪,每一层中只保留最重要的部分,这就是权重矩阵剪枝。相比突触剪枝和神经元剪枝,权重矩阵剪枝压缩率要大很多。
17.主流AI端侧硬件平台有哪些?
英伟达
海思
寒武纪
比特大陆
昇腾
登临
联咏
安霸
耐能
爱芯
瑞芯
18.主流AI端侧硬件平台一般包含哪些模块?
视频编解码模块
CPU核心处理模块
AI协处理器模块
GPU模块
DSP模块
DDR内存模块
数字图像处理模块
19.算法工程师该如何看待硬件侧知识?
GPU乃至硬件侧的整体逻辑,是CV算法工作中必不可少的组成部分,也是算法模型所依赖的重要物理载体。
GPU的相关知识
现在AI行业有个共识,认为是数据的爆发和算力的突破开启了深度学习在计算机视觉领域的“乘风破浪”,而其中的算力,主要就是指以GPU为首的计算平台。
GPU(Graphical Processing Unit)从最初用来进行图形处理和渲染(玩游戏),到通过CUDA/OpenCL库以及相应的工程开发之后,成为深度学习模型在学术界和工业界的底层计算工具,其有以下的一些特征:
异构计算:GPU能作为CPU的协处理器与CPU协同运算。
单指令流多数据流(SIMD)架构:使得同一个指令(比如对图像数据的一些操作),可以同时在多个像素点上并行计算,从而得到比较大的吞吐量,深度学习中大量的矩阵操作,让GPU成为一个非常适合的计算平台。
多计算核心。比如Nvidia的GTX980GPU中,在和i7-5960CPU差不多的芯片面积上,有其128倍的运算速度。GTX980中有16个流处理单元,每个流处理单元中包含着128个CUDA计算核心,共有2048个GPU运算单元,与此同时i7-5960CPU只有16个类似的计算单元。
CUDA模块。作为GPU架构中的最小单元,它的设计和CPU有着非常类似的结构,其中包括了一个浮点运算单元,整型运算单元以及控制单元。一个流处理单元中的CUDA模块将执行同一个指令,但是会作用在不同的数据上。多CUDA模块意味着GPU有更加高的计算性能,但更重要的是在算法侧有没有高效地调度和使用。
计算核心频率。即时钟频率,代表每一秒内能进行同步脉冲次数。就核心频率而言,CPU要高于GPU。由于GPU采用了多核逻辑,即使提高一些频率,其实对于总体性能影响不会特别大。
内存架构。GPU的多层内存架构包括全局内存,2级缓存,和芯片上的存储(包括寄存器,和1级缓存共用的共享内存,只读/纹理缓存和常量缓存)。
NVIDIA GTX 980
在使用GPU时,在命令行输入nvidia-smi命令时会打印出一张表格,其中包含了GPU当时状态的所有参数信息。
CUDA/cuDNN/OpenCL科普小知识:
CUDA是NVIDIA推出的用于GPU的并行计算框架。
cuDNN是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。
OpenCL是由苹果(Apple)公司发起,业界众多著名厂商共同制作的面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境。
深度学习的端侧设备
深度学习的端侧设备,又可以叫做边缘计算设备,深度学习特别是CV领域中,模型+端侧设备的组合能够加快业务的即时计算,决策和反馈能力,极大释放AI可能性。
深度学习的端侧设备主要由ARM架构的CPU+ GPU/TPU/NPU等协处理器 + 整体功耗 + 外围接口 + 工具链等部分组成,也是算法侧对端侧设备进行选型要考虑的维度。
在实际业务中,根据公司的不同,算法工程师涉及到的硬件侧范围也会不一样。如果公司里硬件和算法由两个部门分别负责,那么算法工程师最多接触到的硬件侧知识就是硬件性能评估,模型转换与模型硬件侧验证,一些硬件高层API接口的开发与使用;如果公司里没有这么细分的部门,那么算法工程师可能就会接触到端侧的视频编解码,模型推理加速,Opencv,FFmpeg,Tensor RT,工具链开发等角度的知识。
算法工程师该如何看待硬件侧
首先,整体上还是要将硬件侧工具化,把端侧设备当做算法模型的一个下游载体,会熟练的选型与性能评估更加重要。
端侧设备是算法产品整体解决方案中一个非常重要的模块,算法+硬件的范式将在未来的边缘计算与万物智能场景中持续发力。
在日常业务中,算法模型与端侧设备的适配性与兼容性是必须要考虑的问题,端侧设备是否兼容一些特殊的网络结构?算法模型转化并部署后,精度是否下降?功耗与耗时能否达标?等等都让算法工程师的模型设计逻辑有更多的抓手。
20.现有的一些移动端开源框架?
NCNN
Paddle Lite
MACE( Mobile AI Compute Engine)
TensorFlow Lite
PocketFlow
21.端侧静态多Batch和动态多Batch的区别
当设置静态多Batch后,如Batch=6,那么之后不管是输入2Batch还是4Batch,都会按照6Batch的预设开始申请资源。
而动态多Batch不用预设Batch数,会根据实际场景中的真实输入Batch数来优化资源的申请,提高端侧实际效率。
由于动态多Batch的高性能,通常Inference耗时和内存占用会比静态多Batch时要大。
22.优化模型端侧性能的一些方法
设计能最大限度挖掘AI协处理器性能的模型结构。
多模型共享计算内存。
减少模型分支结构,减少模型元素级操作。
卷积层的输入和输出特征通道数相等时MAC最小,以提升模型Inference速度。
23.ONNX的相关知识
ONNX是一种神经网络模型的框架,其最经典的作用是作为不同框架之间的中间件,成为模型表达的一个通用架构,来增加不同框架之间的交互性。
ONNX的优势:
ONNX的模型格式有极佳的细粒度。
ONNX是模型表达的一个通用架构,主流框架都可以兼容。
ONNX可以实现不同框架之间的互相转化。
24.TensorRT的相关知识
TensorRT是一个高性能的深度学习前向Inference的优化器和运行的引擎。
TensorRT的核心:将现有的模型编译成一个engine,类似于C++的编译过程。在编译engine过程中,会为每一层的计算操作找寻最优的算子方法,将模型结构和参数以及相应kernel计算方法都编译成一个二进制engine,因此在部署之后大大加快了推理速度。
我们需要给TensorRT填充模型结构和参数,也就是解析我们自己的模型结构和参数文件,获取数据放到其中。官方给了三种主流框架模型格式的解析器(parser),分别是:ONNX,Caffe以及TensorFlow。
TensorRT的优势:
把一些网络层进行了合并。具体🌰如下图所示。
取消一些不必要的操作。比如不用专门做concat的操作等。
TensorRT会针对不同的硬件都相应的优化,得到优化后的engine。
TensorRT支持INT8和FP16的计算,通过在减少计算量和保持精度之间达到一个理想的trade-off。
25.什么是模型蒸馏?
模型蒸馏(Model Distillation)是一种模型压缩技术,旨在将一个**大型复杂模型(通常称为“教师模型”)的知识转移到一个小型简单模型(称为“学生模型”)**中。
模型蒸馏技术最开始由Hinton等人于2015年提出,主要用于改进小型模型的性能,使其在保持较低计算成本的同时,能够逼近大型模型的性能。
模型蒸馏的基本原理
模型蒸馏的基本思想是使用大型模型的输出(软标签)来训练小型模型。
大型模型的输出通常包含了关于类别概率的更多信息,这些信息比硬标签(即实际的类别标签)更能表达不同类别之间的相对关系。通过训练小型模型去学习逼近这些软标签,小型模型可以学习到更细致的决策边界。
模型蒸馏的步骤
训练教师模型: 教师模型通常是一个大型深度网络,能够在AI细分任务上达到SOTA精度。
生成软标签: 使用教师模型对训练数据集进行预测,记录输出的类别概率(软标签)。这些概率不仅表示最可能的类别,还提供了对其他类别的预测概率,包含了更丰富的信息。
训练学生模型: 学生模型的结构比教师模型简单,其训练过程不仅使用真实的标签(硬标签),还使用教师模型生成的软标签。通常,训练过程中会使用一个**温度参数(T)**来调整软标签的"软化"程度。损失函数是硬标签的损失和软标签的损失的加权和。
评估学生模型: 在独立的测试数据上评估学生模型的性能,验证其是否成功学习到了教师模型的知识。
温度调整(Temperature Scaling)
在蒸馏过程中,温度参数T用于控制软标签的平滑程度。较高的温度会使得概率分布更加平滑,使得学生模型能够从教师模型的预测中学到更细微的差别。损失函数通常是交叉熵损失,计算学生模型预测和软标签之间的差异。
模型蒸馏的优势
•
效率提升:学生模型通常比教师模型更小、更快,适合部署在资源受限的环境中。
•
泛化能力:学生模型通过学习教师模型的软标签,通常可以获得比直接训练更好的泛化能力。
实际应用
模型蒸馏已被广泛应用于多种任务,如AI绘画、图像分类、图像分割、目标检测、语音识别和自然语言处理等,特别是在需要模型部署到移动设备或需要实时处理的场景中。
总之,模型蒸馏是提高模型部署效率的有效技术,特别适合于需要在保持模型性能的同时减小模型大小和提升计算速度的应用场景。
26.bfloat16精度和float16精度的区别?
BFLOAT16
定义与结构: BFLOAT16是一种16位宽的浮点数格式,由Google针对Tensor Processing Units (TPUs)开发,特别适用于AI算法应用。它的结构如下:
•
1位符号位
•
8位指数
•
7位尾数
这种格式与标准的32位浮点数(FP32)共享相同的指数范围,但尾数精度较低。这意味着BFLOAT16在表示大范围数值时与FP32相近,但在表示精度上有所折衷。
优点:
•
较大的动态范围:与Float16相比,BFLOAT16能够表示更大范围的数值,这归功于它更大的指数范围。这对于深度学习中的梯度和归一化运算非常重要,因为这些操作可能涉及广泛的数值范围。
•
与FP32兼容性好:由于指数位与FP32相同,BFLOAT16可以无损地转换为FP32,这简化了混合精度训练的实现,同时减少了转换过程中的精度损失。
缺点:
•
较低的数值精度:因为尾数位只有7位,相比于Float16的10位尾数,BFLOAT16在表示精确数值时的能力较弱。
Float16(FP16)
定义与结构: Float16是IEEE定义的16位浮点数标准,结构如下:
•
1位符号位
•
5位指数
•
10位尾数
Float16提供了较FP32更低的精度和较小的数值范围,但在存储和计算效率上具有优势。
优点:
•
较高的数值精度:Float16的10位尾数提供了比BFLOAT16更高的精度,适合需要高精度计算的应用。
•
计算加速:在支持Float16运算的硬件上(如GPU),使用Float16可以显著加速计算过程,尤其是在AI模型训练和推理中。
缺点:
•
较小的动态范围:Float16的5位指数提供的动态范围较小,可能导致在一些AI训练场景中出现梯度消失或爆炸问题。
•
兼容性问题:Float16到FP32的转换可能会涉及更复杂的数值调整,可能导致精度损失。
应用场景
•
BFLOAT16:由于其较大的动态范围和与FP32的良好兼容性,非常适合用于AI模型的训练和推理,尤其是在Google的TPU上。
•
Float16:适用于对计算精度要求较高的场景,并且在NVIDIA及其他厂商的GPU上得到了广泛支持,尤其适合于需要加速的AI算法任务。
27.AI推理系统介绍
推理系统简述
推理系统是用于部署人工智能模型,执行推理预测任务的人工智能系统,类似传统 Web 服务或移动端应用系统的作用。通过推理系统,可以将深度学习模型部署到云端或者边缘端,并服务和处理用户的请求。模型训练过程好比是传统软件工程中的代码开发的过程,而开发完的代码势必要打包,部署给用户使用,那么推理系统就负责应对模型部署和服务生命周期中遇到的挑战和问题。
当推理系统将完成训练的模型进行部署和服务时,需要考虑设计和提供模型压缩(轻量化,剪枝、量化、蒸馏),负载均衡,请求调度,加速优化,多副本和生命周期管理等支持。相比深度学习框架等为训练而设计的系统,推理系统不仅关注低延迟,高吞吐,可靠性等设计目标,同时受到资源,服务等级协议,功耗等约束。 推理阶段不同于训练阶段,只需要执行前向传播过程,将输入样本计算为输出标签。
推理系统的特点
模型被部署为长期运行的服务 服务有明确对请求的低延迟(Low Latency)和高吞吐(High Throughput)需求。例如,互联网服务一般都有明确的响应时间延迟约束,保证用户体验,同时需要应对爆发增长的用户产生的高吞吐请求的响应需求。
推理有更苛刻的资源约束 更小的内存,更低的功耗等。例如,手机的资源要远小于数据中心的商用服务器。
推理不需要反向传播梯度下降 可以牺牲一定的数据精度。例如,模型本身不再被更新,可以通过量化,稀疏性等手段牺牲一定精度换取一定的性能提升。
部署的设备型号更加多样 需要多样的定制化的优化。例如,相比服务器端可以通过 Docker 等手段解决环境问题。移动端显得更为棘手,手机有多种多样的平台与操作系统,IOT 设备有不同的芯片和上层软件栈,需要工具与系统提供编译以减少用户适配代价。
28.Nvidia相关容器镜像使用
通过拉取镜像创建容器,可以免去繁琐的繁琐的环境安装步骤,只需要宿主机上安装Nvidia驱动即可,拉取的镜像中已经配置好cuda,tensorrt,tritonserver等相关需要的环境。以tritonserver为例介绍如何使用镜像,以及介绍triton框架的使用
环境搭建
镜像拉取
代码块
Python
docker pull nvcr.io/nvidia/tritonserver:23.01-py3
启动镜像
代码块
Python
docker run -dt --gpus=all -p 1237:22 --name triton -v /home/xxiao/code:/workspace/code nvcr.io/nvidia/tritonserver:23.01-py3
--gpus该参数在下文config中详细讲解 报错解决:
运行docker的时候添加参数:
代码块
Python
--cap-add=SYS_ADMIN --security-opt seccomp=unconfined
进去docker镜像后,执行
代码块
Python
tritonserver --model-repository=./model_repository
--model-repository:该参数指定模型路径,必须要有 --help:查看其他参数 日志相关:--log-verbose=1 --log-info=true 目录结构如下:
triton server会加载该目录下的所有模型,在资源足够的情况下,可以通过一个triton server启动所有的推理服务 config.pbtxt内容如下
代码块
Python
各个字段含义
代码块
Python
name:model-repository目录下的模型名称,需要保持一致
platform:推理框架选择,实例选择的是onnx模型,对应的为onnxruntime_onnx
常见平台有以下:
1、tensorflow_savedmodel: TensorFlow SavedModel 格式。
2、tensorflow_graphdef: TensorFlow GraphDef 格式。
3、tensorflow_cc: TensorFlow C++ 库。
4、pytorch_libtorch: PyTorch 的 LibTorch C++ 库。
启动triton server服务成功后,会开启三个端口供访问,
8000:HTTPService 8001:GRPCInferenceService 8002:Metrics Service
客户端访问实例:
代码块
Python
import numpy as np
import tritonclient.http as httpclient
triton_client = httpclient.InferenceServerClient(url="localhost:8000", verbose=False)
model_name = "sam_embedding_onnx"
inputs = []
inputs.append(httpclient.InferInput('images',[1, 3, 1024, 1024], "FP32"))
inputs[0].set_data_from_numpy(np.random.randn(1, 3, 1024, 1024).astype(np.float32),binary_data=False)
outputs = []
outputs.append(httpclient.InferRequestedOutput('image_embeddings'))
29.常见推理框架介绍
onnxruntime
onnxruntime是微软推出的一款推理框架,用户可以非常便利的用其运行一个onnx模型。onnxruntime支持多种运行后端,包括CPU、GPU、TensorRT、DML等。
TensorRT
TensorRT是一个高性能的深度学习推理优化器,可以为深度学习应用提供低延迟、高吞吐率的模型部署。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现在已经能支持TensorFlow、caffe、mxnet、pytorch等几乎所有的深度学习框架,将TensorRT和Nvidia的GPU结合起来,能在几乎所有的框架中进行快速和高效的部署推理。
OpenVino
OpenVino是英特尔针对自家硬件平台开发的一套深度学习工具库,包含推理库、模型优化等一些列与深度学习模型部署相关的功能。OpenVino是一个比较成熟且仍在快速发展的推理库,提供的demo和sample都很充足,上手比较容易,可以用来快速部署开发,尤其是Intel的硬件平台上性能超过了大部分的开源库。
Tengine
Tengine是OPEN AI LAB(开放智能)推理的AI推理框架,致力于解决AIoT应用场景下多厂家多种类的边缘AI芯片与多样的训练框架、算法模型之间的相互兼容适配,同时提升算法在芯片上的运行性能,将从云端完成训练后的算法高效迁移到异构的边缘智能芯片上执行,缩短AI应用开发与部署周期,助力加速AI产业化落地。
NCNN
NCNN是一个为手机端极致优化的高性能神经网络前向计算框架。NCNN从设计之初深刻考虑手机端的部署和应用。无第三方依赖、跨平台,手机端cpu的速度快于目前所有已知的开源框架。目前已在腾讯多款应用中使用,如QQ、Qzone、微信等。
MNN
MNN是一个高效、轻量的深度学习框架。它支持深度模型推理与训练,尤其在端侧的推理与训练性能在业界处于领先地位。目前MNN已经在阿里巴巴的手机淘宝、天猫、优酷、钉钉、闲鱼等20多个app中使用,覆盖直播、短视频、搜多推荐、商品图像搜索、互动营销、券已发放、安全风控等70多个场景。
TFLite
TensorFlowLite是Google在2017年5月推出的轻量级机器学习解决方案,主要针对移动端设备和嵌入式设备。针对移动端设备特点,TensorFlow Lite是用来诸多技术对内核进行了定制优化,预熔激活,量子化内核。
30.大模型推理框架介绍
vLLM
vLLM全称Virtual Large Language Model,由Nvidia开源,旨在降低大模型推理的显存占用。其核心思想是将模型的一部分保存在CPU内存或硬盘上,只将当前计算所需的部分加载到GPU显存中,从而打破GPU显存限制。
vLLM支持PyTorch和FasterTransformer后端,可无缝适配现有模型。使用vLLM,在配备96GB内存+440GB A100的服务器上可运行1750亿参数模型,在配备1.5TB内存+880GB A100的服务器上可运行6万亿参数模型。
TensorRT-LLM
Tensorrt-LLM是Nvidia在TensorRT推理引擎基础上,针对Transformer类大模型推理优化的框架。主要特性包括:
支持多种优化技术,如kernel融合、矩阵乘优化、量化感知训练等,可提升推理性能
支持多GPU多节点部署,可扩展到万亿规模参数
提供Python和C++ API,易于集成和部署 在Nvidia测试中,基于OPT-30B在A100上的推理,Tensorrt-LLM可实现最高32倍加速。
DeepSpeed
DeepSpeed是微软开源的大模型训练加速库,最新的DeepSpeed-Inference也提供了推理加速能力,主要特点包括:
通过内存优化、计算优化、通信优化,降低推理延迟和提升吞吐
支持多GPU横向扩展,单卡可推理数百亿参数模型
提供Transformer、GPT、BERT等模型的推理示例
集成Hugging Face transformers库,使用简单 在GPT-NeoX测试中,基于DeepSpeed的推理相比原生PyTorch可实现7.7倍加速。
Text Generation Inference
Text Generation Inference(简称TextGen)是Hugging Face主导的开源推理框架,旨在为自然语言生成模型如GPT、OPT等提供高性能推理。主要特点包括:
高度优化的核心代码,支持FP16、int8等多种精度
支持多GPU多节点扩展,可推理万亿规模参数
良好的用户体验,提供Python高层API,简化开发
支持Hugging Face生态中的模型,如GPT2、GPT-Neo、BLOOM等
在OPT-175B基准测试中,TextGen可实现最高17倍推理加速。
41.介绍一下模型性能优化与模型部署之间的关系
在AI行业中,模型性能优化与模型部署密切相关,两者相辅相成。性能优化旨在提高模型的训练效率、推理速度和整体性能,而成功的模型部署需要确保模型在实际应用环境中的高效运行。下面详细讨论一下模型性能优化和模型部署之间的关系。
模型性能优化
训练阶段的性能优化
•
数据并行和模型并行:使用多个GPU或分布式计算来加速训练过程。
•
混合精度训练:使用16位浮点数(FP16)和32位浮点数(FP32)混合进行训练,减少显存占用并加速计算。
•
高效的优化算法:使用优化算法如Adam、LAMB等,加速模型的收敛速度。
•
自动化超参数调优:使用自动化工具(如Optuna、Hyperopt)调优超参数,提高模型性能。
推理阶段的性能优化
•
模型剪枝:移除不重要的神经元或权重,减少模型的计算量。
•
量化:将模型权重和激活函数从浮点数转换为整数,减少计算和存储需求。
•
蒸馏:通过一个大模型(教师模型)指导一个小模型(学生模型)进行训练,从而在保持性能的前提下减少模型复杂度。
•
编译优化:使用深度学习编译器(如TensorRT、TVM)对模型进行底层优化,提高推理速度。
模型部署
部署环境
•
云端部署:适用于需要大规模计算资源的应用,能够利用云计算的弹性和高性能。
•
边缘部署:适用于资源受限的设备,如移动设备、物联网设备等,需要特别的优化以确保高效运行。
•
本地部署:适用于隐私敏感或需要低延迟的应用,模型需要在本地设备上高效运行。
部署过程中的挑战
•
计算资源受限:边缘设备和嵌入式设备的计算能力和存储资源有限,需要对模型进行优化。
•
实时性要求:许多应用要求低延迟和高吞吐量,模型必须能够快速响应。
•
能耗限制:移动设备和物联网设备对能耗有严格要求,模型需要在节能模式下高效运行。
•
兼容性:模型需要兼容不同的硬件和软件平台,如不同的操作系统、硬件加速器等。
模型性能优化与部署的关系
模型性能优化助力部署:模型性能优化直接影响部署效果。通过剪枝、量化、蒸馏和编译优化等方法,可以大幅减少模型的计算量和存储需求,从而确保模型在边缘设备或嵌入式设备上的高效运行。
部署驱动模型性能优化:部署需求驱动性能优化。在决定部署环境和硬件平台时,需要根据实际应用场景进行针对性的性能优化。例如,在移动设备上部署模型时,需要重点考虑量化和低功耗优化;在云端部署时,则可以更多地利用分布式计算和高性能硬件。
互相迭代改进:性能优化和部署是一个迭代过程。在实际部署过程中,可能会遇到未预见的问题,如延迟高、内存不足等。这需要不断调整优化策略,重新训练和微调模型,确保部署效果满足应用需求。
硬件加速器的利用:优化策略应与部署硬件特性相匹配。对于GPU、TPU、FPGA等不同硬件加速器,需要采用相应的编译优化和模型调整策略,以充分利用硬件性能,提高推理效率。
自动化工具的使用:自动化工具在优化和部署中起到重要作用。自动化超参数调优、自动化编译和部署工具(如TensorFlow Serving、ONNX Runtime)可以显著简化工作流程,提高效率和部署效果。
结论
不管是在AIGC、传统深度学习还是自动驾驶领域,模型性能优化和模型部署之间存在紧密的联系,优化不仅提高了模型在训练和推理阶段的效率,还直接影响模型在实际应用中的部署效果。通过合理的优化策略和部署方法,可以确保AI模型在各种环境中高效、可靠地运行。随着技术的不断进步,模型性能优化和部署将变得更加智能化和自动化,为广泛应用AI技术提供更强有力的支持。