译者 | 布加迪
审校 | 重楼
近年来,我们见证了两个反复出现的趋势:发布的GPU功能越来越强大,以及拥有数十亿、乃至数万亿个参数和加长型上下文窗口的大语言模型(LLM)层出不穷。许多企业正在利用这些LLM,或进行微调,或使用RAG构建具有特定领域知识的应用程序,并将其部署在专用GPU服务器上。现在说到在GPU上部署这些模型,需要注意的一点是模型大小,即相比GPU上的可用内存,将模型加载到GPU内存中所需的空间(用于存储参数和上下文token)实在太大了。
模型大小 vs. GPU内存
有一些方法可以通过使用量化、修剪、蒸馏和压缩等优化技术来缩减模型大小。但是如果你注意到下面70B模型(FP16量化)的最新GPU内存和空间需求的比较表,几乎不可能同时处理多个请求,或者在一些GPU中,模型甚至无法装入到内存中。
GPU | FP16(TFLOPS) 带稀疏性 | GPU内存(GB) |
B200 | 4500 | 192 |
B100 | 3500 | 192 |
H200 | 1979 | 141 |
H100 | 1979 | 80 |
L4 | 242 | 24 |
L40S | 733 | 48 |
L40 | 362 | 48 |
A100 | 624 | 80 |
这都是已经运用的FP16量化,导致一些精度损失(这在许多普通的用例中通常是可以接受的)。
模型 | 参数所需的KV缓存(FP16) |
Llama3-8B | 16GB |
Llama3-70B | 140GB |
Llama-2-13B | 26GB |
Llama2-70B | 140GB |
Mistral-7B | 14GB |
这就引出了这篇博文的背景,即企业如何在这些现代数据中心GPU上运行数十亿或万亿个参数的大型LLM模型。是否有办法将这些模型分割成更小的部分,只运行眼下所需的部分?或者我们是否可以将模型的部分分配到不同的GPU上?在这篇博文中,我将尝试用当前可用于执行推理并行的一系列方法来回答这些问题,并尝试重点介绍一些支持这些并行方法的工具/库。
推理并行
推理并行(Inference Parallelism)旨在将AI模型(特别是深度学习模型)的计算工作负载分配到多个处理单元(如GPU)上。这种分配可以加快处理、缩短延迟以及能够处理超出单个设备内存容量的模型。
现已开发出了四种主要的方法来实现推理并行,每种方法都有其优势和应用:
- 数据并行
- 张量并行
- 管道并行
- 专家并行
数据并行
在数据并行方面,我们在不同的GPU或GPU集群上部署模型的多个副本。模型的每个副本都独立处理用户请求。打个简单的比方,这好比拥有一个微服务的多个副本。
现在,一个常见的问题可能是它如何解决模型大小装入到GPU内存中的问题,简短的回答是装不了。该方法仅推荐给可以装入到GPU内存中的较小模型。在这种情况下,我们可以使用部署在不同GPU实例上的模型的多个副本,并将请求分配到不同的实例,从而为每个请求提供足够的GPU资源,还增加服务的可用性。这还将为系统提升总体请求吞吐量,因为现在有更多的实例来处理流量。
张量并行
在张量并行方面,我们将模型的每一层分割到不同的GPU上。单个用户请求将跨多个GPU共享,每个请求的GPU计算的结果则通过GPU到GPU的网络重新组合。
为了更好地理解张量并行,顾名思义,我们沿着特定的维度将张量分割成几块,这样每个设备只容纳张量的1/N块。使用这个部分块执行计算以获得部分输出。这些部分输出从所有设备收集而来,然后组合。
你可能已经注意到了,张量并行性能上的瓶颈是GPU到GPU之间的网络速度。由于每个请求将在不同的GPU上进行计算然后组合,因此我们需要高性能网络来确保低延迟。
管道并行
在管道并行方面,我们将一组模型层分配到不同的GPU上。基于层的划分是管道并行中的基本方法。模型的层被分组成连续的块,形成阶段(Stage)。这种划分通常通过网络的架构纵向进行。计算平衡是一个关键的考虑因素。理想情况下,每个阶段都应该有大致相等的计算负载,以防止瓶颈。这通常需要对不同复杂性的层进行分组以达到平衡。内存使用优化是另一个关键因素。阶段旨在符合单个设备的内存限制,同时最大限度地提高利用率。尽量降低通信开销也很重要。划分的目的是减少各阶段之间传输的数据量,因为设备间通信可能是一个严重的性能瓶颈。
所以比如说,如果你在4个GPU的实例上部署有32层的LLaMA3-8B模型,可以在每个GPU上分割和分配模型的8层。请求的处理按顺序进行,计算从一个GPU开始,并通过点对点通信继续到下一个GPU。
同样,由于涉及多个GPU实例,如果我们在GPU之间没有高速网络通信,网络可能成为一大瓶颈。这种并行可以增加GPU的吞吐量,因为每个请求将需要来自每个GPU的更少资源,应该很容易获得,但它最终会增加总体延迟,因为请求按顺序处理,任何GPU计算或网络部件方面的延迟都会导致延迟总体激增。
专家并行
专家并行常常作为专家混合(MoE)来实现,这种技术允许在推理过程中高效使用大模型。它没有解决将模型装入到GPU内存中的问题,但提供了一个基于请求上下文处理请求的广泛功能模型的选项。在该技术中,模型被划分为多个专家子网。每个专家通常都是经过训练的神经网络,用于处理更广泛的问题领域内特定类型的输入或子任务。门控网络决定对每个输入使用哪个专家。对于任何给定的输入,只有一部分专家被激活。不同的专家可以分配到不同的GPU上。路由器/门控网络和活跃的专家可以并行运行。不活跃的专家不消耗计算资源。这大大减少了每个请求必须与之交互的参数数量,因为一些专家被跳过。但与张量并行和管道并行一样,总体请求延迟严重依赖GPU到GPU的通信网络。在专家处理后,请求必须重新构造回到其原始GPU,通过GPU到GPU互连结构构成高网络通信。
与张量并行相比,这种方法可以更好地利用硬件,因为你不必将操作分割成更小的块。
下面总结和比较了我们讨论的几种方法。当你计划为自己的用例选择一种方法时,可以使用它作为参考。
方面 | 数据并行 | 张量并行 | 管道并行 | 专家并行 |
基础概念 | 在多个设备上分割输入数据 | 在设备上分割单个张量/层 | 在设备上将模型分割成多个顺序阶段 | 将模型分割成多个专家子网络 |
工作原理 | 同一模型复制到每个设备上,处理不同数据块 | 单个层/操作分配到多个设备上 | 模型管道的不同部分在不同设备上 | 路由器为每个输入选择特定的专家 |
并行单位 | 输入批量 | 单个张量/层 | 模型阶段 | 专家(子网络) |
可扩展性 | 相对批量大小而言,扩展性良好 | 对超大模型而言,扩展性良好 | 对深度模型而言,扩展性良好 | 对宽模型而言,扩展性良好 |
内存效率 | 低(每个设备上 有标准模型) | 高(每个设备上 只有每个层的 一部分) | 高(每个设备上 只有模型的一部 分) | 中到高(专家分配在设备上) |
通信开销 | 低 | 中到高 | 低(只有邻近Stages 之间) | 中(路由器通信 和专家选择) |
负载均衡 | 如果数据均匀分配,通常均衡 | 操作内均衡 | 具有挑战性,需要 认真设计阶段 | 可能很困难,需要有效的路由 |
延迟 | 对大批量而言,低 | 对小批量而言,可能会增加 | 由于管道深度,较高 | 如果路由高效,可能很低 |
吞吐量 | 对大批量而言,高 | 对大模型而言,高 | 高,尤其对深度模型而言 | 对不同的输入而言,可能很高 |
典型用例 | 大批量推理,并行任务 | 无法装入到单个设备上的超大模型 | 有顺序依赖项的 深度模型 | 有不同子任务或 专门化的模型 |
挑战 | 受批量大小限制,内存使用量大 | 实施复杂,潜在的通信瓶颈 | 管道气泡,阶段划分难以实现最佳 | 负载均衡、路由 开销以及训练不稳定 |
输入大小 的适应性 | 适应性强 | 适应性较差, 固定的张量划分 | 适应性差,固定管道 | 适应性强,不同的 输入有不同的专家 |
合适的模型类型 | 大多数类型的模型 | 基于Transformer 的模型,超大神经网络 | 深度顺序模型 | 多任务模型,拥有 不同知识的语言模型 |
支持的推理后端 | TensorRT-LLM、 vLLM和TGI | TensorRT-LLM、 vLLM和TGI | TensorRT-LLM、 vLLM和TGI | TensorRT-LLM、 vLLM和TGI |
并行技术的组合
现在你可能已经在想,如果使用上述并行方法意味着可以减少GPU的总体消耗或利用率,那么我们何不组合或复制这些方法来增加GPU的总体吞吐量?组合推理并行方法可以获得更高效、更易于扩展的系统,特别是对于庞大而复杂的模型。
在下表中,你可以看到四种可能的选项,但在基于你拥有的GPU数量的实际场景中,这种组合可能会增加到非常大的数量。
数据并行 + 管道并行 | 张量并行 + 管道并行 | 专家并行 + 数据并行 | 张量并行 + 专家并行 |
将模型分割成 阶段(管道并行) | 将模型分割成 阶段(管道并行) | 将专家分配到设备 上(专家并行) | 在设备上分割大型 专家模型(张量并行) |
在多个设备上复制 每个阶段(数据 并行) | 在设备上分割每个 阶段内的大张量 (张量并行) | 并行处理多个输入 (数据并行) | 在设备上分割大型 专家模型(张量并行) |
比如说,假设你有64个可用的GPU,计划在上面部署llama3-8b或Mistral 8*7B模型。下面是并行方法的一些可能的组合。这些只是理解并行组合策略的示例;针对实际用例,你还需要考虑并横向比较其他选项。
LLaMA 3-8B(64个GPU)
策略 | GPU分配 | 优点 | 缺点 |
PP8TP8 | 64=8(管道)x8 (张量) | 平衡分配 减少通信 | 管道气泡 延迟增加 |
PP4TP4DP4 | 64=4(管道)x4 (张量)x 4(数据) | 更高吞吐量 对批量大小而言,很灵活 | 复杂的集成 需要大批量 |
DP8TP8 | 64=8(数据)x8 (张量) | 更高吞吐量 没有管道气泡 | 需要大批量 每个GPU高内存 |
Mistral 8*7B (64 GPU)
策略 | GPU分配 | 优点 | 缺点 |
EP8TP8 | 64=8(专家)x8(张量 /专家) | 平衡的内存分配 高效的内存使用 | 复杂的负载均衡 计算利用率可能低 |
EP8TP4DP2 | 64=8(专家)x4 (张量)x 2(数据) | 更高吞吐量 平衡的利用率 | 需要认真的负载均衡 需要大批量 |
EP8PP2TP4 | 64=8(专家)x2 (管道)x 4(张量) | 支持更深的专家 灵活扩展 | 延迟增加 复杂的同步 |
如何选择一种?
现在我们已经探讨了推理并行的四种方法,还有这些方法的多种组合,所以你可能会提到的一个常见问题是如何选择或确定使用哪种方法。因此,推理并行方法的选择大体上依赖以下因素:
- 模型架构
- 用例需求(延迟vs吞吐量)
- 硬件配置
模型架构
模型架构在确定最有效的推理并行策略方面起着至关重要的作用。你需要确定你的模型架构,然后选择适合的并行方法或组合。不同的模型结构适用于不同的并行技术:
1. 大型深度模型(如GPT-4、PaLM 2):
- 受益于管道并行
- 可以跨多个GPU分割阶段
- 适用于有许多顺序层的模型
2. 拥有大层尺寸的宽模型(LLaMA 2和BLOOM):
- 很适合张量并行
- 允许在GPU上分割单个层
- 对矩阵操作非常大的模型很有效
3. 集成模型或专家混合(Mixtral 8*7B和转换Transformers):
- 非常适合专家并行
- 不同的专家可以分配在不同的GPU上
- 对于使用不同子网络来完成不同任务的模型很有用
4. 小型计算图的模型(GPT-3.5 turbo和Falcon-7B):
- 常常与简单的数据并行很兼容
- 可以跨GPU复制整个模型
- 当模型完全加载到GPU内存中时,很有效
5. 基于注意力的模型(比如Transformers):
- 能受益于注意力切片或多头并行
- 允许跨GPU分配注意力计算
用例需求(延迟与吞吐量的权衡)
你需要熟悉你的业务需求或用例,即对业务更重要的是什么、用户请求的延迟或GPU的利用率。或者你可以确定应用程序的模式,即它是一个实时应用程序(对用户请求的响应时间是影响用户体验的主要因素),还是一个离线系统(对用户请求的响应时间不是关注的主要因素)。
我们需要意识到这一点的原因是延迟和GPU吞吐量之间的权衡。如果你想缩短用户请求的延迟,就需要为每个请求分配更多的GPU资源,所选择的并行方法将依此判断。你可以进行优化批量,以便请求并不难以获得GPU资源、从而增加总体延迟。
然而,如果延迟不是考虑因素,那么你的目标应该是选择合适的并行方法和适当的批量大小,以便在确保最大吞吐量的情况下利用GPU资源,从而获得GPU上的最大吞吐量。
用例 | 优先的并行 | 延迟vs吞吐量考量 |
实时聊天机器人 | 数据并行或张量并行 | 低延迟优先级,适当的吞吐量 |
批量文本处理 | 管道并行 | 高吞吐量优先级,延迟不太重要 |
内容推荐 | 专家并行 | 为不同输入确保高吞吐量,适当 的延迟 |
语义分析 | 数据并行 | 高吞吐量;延迟对批量处理不太重要 |
语音助理 | 张量并行或管道并行 | 超低延迟优先级,适当的吞吐量 |
硬件配置
硬件配置常常决定了切实可行的并行策略,应针对特定的推理工作负载和模型架构优化这一选择。以下是一些硬件部件选择,影响整体的并行选择。
硬件部件 | 对并行选择的影响 | 例子 |
GPU内存容量 | 决定了数据并行的可行性,影响了模型切片的程度 | 英伟达A100(80GB)允许比 A100(40GB)更大的模型分块 |
GPU数量 | 影响可能适用所有策略的 并行程度 | 8个GPU支持比4个GPU更高的并行 |
GPU互连带宽 | 影响张量和管道并行的效率 | NVLink提供了比PCIe更高的 带宽,有利于张量并行 |
CPU功能 | 影响并行策略中的数据预处理和后处理 | 多核CPU可以更好地处理数据并行开销 |
系统内存 | 影响为数据并行存储庞大 数据库的能力 | 1TB系统内存允许大于256GB的批量大小 |
存储速度 | 影响数据并行中的数据加载速度 | NVMe SSD提供了比SATA SSD更快的数据加载速度 |
网络带宽 | 对多个节点上的分布式推理很重要 | 基于Infiniband和RoCE的网络比面向GPU结构的传统网络速度更快 |
专门化硬件 | 支持特定的优化 | 谷歌TPU针对张量操作进行了优化 |
结论
AI推理并行对高效运行大型AI模型而言意义重大。我们研究了不同的方法来划分工作负载,比如数据并行、张量并行、管道并行和专家并行。每种方法都有其优缺点,选择正确的方法取决于你的具体要求和环境。看到TensorRT-LLM、vLLM和Hugging Face的文本生成推理等工具使这些高级技术更容易被更多的人使用,这确实令人兴奋。随着AI模型变得越来越大、越来越复杂,知道如何使用这些并行技术将非常重要。它们不仅仅旨在处理更大的模型,还旨在更智能化、更高效地运行AI。如果合理运用这些方法,我们可以用AI实现壮举,使它对于各种应用而言更快速、更便宜、更强大。
AI的未来不仅仅是更大的模型,而是找到在现实世界中使用它们的巧妙方法。借助这些并行技术,我们为曾经认为不可能的AI应用打开了大门。
原文标题:What is Inference Parallelism and how it works,作者:Aman Juneja