优化 AI/ML 模型以提供服务:缩短推理时间的成熟技术

出版商
乌拉普团队
关于
2023 年 12 月 15 日 上午 7:32

要确保您的模型在生产环境中表现出色,需要的不仅仅是培训、准备和上菜。

您的模型和服务器需要优化。

想象一下:用户在智能手机上使用您的 LLM 时,需要等待数分钟才能得到模型的响应。 

您的 LLM 不仅会占用他们手机上的所有内存和计算能力,还会带来糟糕的用户体验,而这是您无法轻易摆脱的。

为了避免这种令人痛心的情况,您需要优化您的模型。

我们将深入探讨优化 LLM 或深度学习模型的两种方法。

模型优化入门

LLM 和深度学习模型的优化始于模型训练完成之后,但在提供模型之前。

要确保您的模型在生产环境中运行良好,您应该考虑两个因素:

模型尺寸

考虑模型大小很重要,因为服务器硬件可能不支持模型的内存和存储要求。

此外,在提供模型时,必须上传和下载模型。如果模型较大,服务时间就会增加--这是在有内存和计算能力限制的边缘设备(如智能手机、平板电脑或笔记本电脑)上服务模型时需要注意的问题。

,尤其要注意 LLM。它们的大小可达 10 GB。

资料来源语言模型内部(从 GPT-4 到 PaLM)--Alan D. Thompson 博士 - 生命架构师

推理延迟

您还需要关注推理延迟,因为现实世界的应用需要快速的推理时间。

减少延迟的一个简单方法就是使用 GPU。 然而,只有部分硬件部署了 GPU;在某些情况下,例如 LLM,延迟仍有待改进。 这不仅会给终端用户带来糟糕的体验,因为他们不得不等待推论(想象一下等待 ChatGPT 响应的时间),而且还会增加与提供模型相关的成本。  

模型优化技术

优化模型的目的是减少模型的内存和计算需求,从而提高模型的整体性能。

实现这些目标有两种常见的方法:

  • 缩小模型尺寸
  • 编译模型

让我们看看这两方面的情况。

缩小模型尺寸

缩小模型的尺寸对于优化生产环境至关重要,尤其是如果您的模型将在智能手机、平板电脑和笔记本电脑等空间有限的边缘设备上访问。

缩小模型尺寸有两种方法:

  • 模型量化
  • 模型修剪

模型量化

减少模型大小最常用的方法是量化。 

模型内存有数百万甚至数十亿个权重和偏差。这些参数通常存储为 32 位浮点数,因此模型需要大量内存。

量化的原理是降低权重的精度--实质上是将这些参数简化为更紧凑的形式,并截断数字的长度。这一过程大大减少了模型的内存占用和计算要求。

来源:《深度学习模型量化与量化感知训练终极指南深度学习模型量化和量化感知训练终极指南

量化的弊端

量化有一个缺点:降低模型精度。 

量化涉及降低模型中数值的精度,这会导致信息丢失,进而导致模型精度下降,尤其是在复杂任务中。

就法学硕士而言,这可能意味着你得到的答复是胡言乱语。

量化方法

量化模型有两种方法,具体取决于你在模型开发过程中所处的阶段:

训练后量化 (PTQ)

根据TensorFlow 的说法,训练后量化包括一些通用技术,可减少 CPU 和硬件加速器的延迟、处理时间、功耗和模型大小,而模型精度几乎不会下降。

这种量化方法是在训练模型后进行的(因此而得名),使用起来更方便。

量化感知训练(QAT)

根据TensorFlow 的说法,量化感知训练是通过创建一个模型来完成的,下游工具将使用该模型来生成量化模型。量化后的模型精度更低,因此在部署过程中更有优势。

这种量化方法在训练过程中使用,通常能更好地提高模型精度。

‍量化

我们推荐使用以下库进行量化:

  • Pytorch 用于 Pytorch 框架模型。
  • 用于 LLM 的Transformers 。Transformers 允许用户从两种算法中进行选择:
  • ONNX 用于 ONNX 框架模型。

模型修剪

模型剪枝是删除神经网络中不能提高模型性能的神经元的技术。

剪除这些不重要的参数可以减少权重的数量,从而有效地缩小模型的规模。

修剪方法

剪枝有两种方法,都是在模型训练完成后进行的。

无序修剪

无结构剪枝也称幅度剪枝,它将一些幅度较小的参数或权重转换为零。

它可以从模型中移除单个权重。 

结构化修剪

结构剪枝删除目标神经网络的结构(构件),例如

  • 整个神经元
  • 滤波器通道

删除网络中的特定结构会导致参数(权重)矩阵的缩小。

下图显示了修剪前后完全连接的网络。

来源深度学习模型中的剪枝

修剪注意事项

通过剪枝模型,可以减少推理时间和内存使用量,同时提高模型的准确性。 

但是,如果不谨慎使用,剪枝也会导致精度下降,尤其是在从模型中删除过多权重或连接的情况下。 

除了减小模型大小外,这还能减少推理延迟,因为模型需要执行的计算更少。缺点是可能会损失准确性。

修剪图书馆

可以使用以下库在训练后对模型进行剪枝:

‍ 模型汇编

编译模型是将模型转换为可在特定硬件上运行的可执行格式的过程。

一般的深度学习框架(如 PyTorch)都是用 Python 编写的,这种语言易于理解和开发,但速度慢是出了名的。代码是在运行时执行的,而不是像 C/C++ 程序那样编译,这样速度可以快 1-2 个数量级。  

模型编译在模型训练完成后进行。可以在量化和剪枝之前或之后进行,但建议在量化和剪枝之后进行。这样可以针对特定的硬件平台对模型进行优化,同时还能保持准确性。  

模型汇编的利与弊

在编译过程中,模型会针对特定硬件平台进行优化,从而提高性能、减少推理延迟并降低内存使用量。 

然而,模型编译可能是一个耗时的过程,而且可能需要专业知识和专门技能。 

此外,编译后的模型可能不支持某些功能,因此在使用这种技术时必须了解其局限性。

模型编译库

这一步是在训练模型之后进行的,可以使用多个库来完成,具体取决于您开始使用的框架,包括

  • PyTorch 该库使用即时(JIT)编译,即在运行时对模型进行编译。 这种编译方法将 PyTorch 代码编译成优化的内核,而不是像在 Jupyter 笔记本中运行模型那样使用解释器运行。  
  • ONNX 运行时
  • 阿帕奇 TVM

掌握模型优化

优化模型可以大大提高模型服务的有效性,同时在生产环境中保持性能和准确性。

利用我们讨论过的技术来缩小模型大小,并在将模型提供给云之前对其进行编译。 

您的最终用户将获得更好的体验,您也将节省计算能力,最终为您省钱。

另一种节省模型费用的方法?注册免费试用Ulap 推理引擎。