揭秘AI大模型:推理过程优化如何影响未来智能世界?

发布于:2024-04-15 ⋅ 阅读:(42) ⋅ 点赞:(0)

 AI大模型推理过程和优化技术

4f928d76a1e234f005e3310222882c9e.jpeg   

一 推理过程

主流大模型均根植于Transformer架构,其核心精髓在于注意力机制。简而言之,该机制通过计算softmax(qk^T)*v,精准捕捉数据间的关联,从而实现高效信息处理。

600db27fbf9fc406e19bda460d0f8dcf.jpeg

计算softmax(qk^T)*v

推理会分成 prefill 和 decoding 两个阶段。每一个请求发起后产生的推理过程都会先经历一个 Prefill 过程,prefill 过程会计算用户所有的输入,并生成对应的 KV 缓存,再经历若干个 decoding 过程,每一个 decoding 过程服务器都会生成一个字符,并将其放入到 KV 缓存当中,推理出来的预测结果又放入输入中,如此循环往复,直到推理出最终结果。

新的请求进来在进行完 prefill 之后会不断迭代进行 decoding,每一个 decoding 阶段结束之后都会将结果当场返回给客户。这样的生成过程称为流式传输。

65d1ab36572b748e76e8ed5a29af6ced.jpeg

LLM 推理过程

1.Prefill(输入理解与初始化)阶段

需要计算整个prompt的自注意力。Embedding 曾将用户提问构建 Word Embedding Matrix,之后会被分成 Q、K、V,其中 Q 在经过 Rotary Embedding 之后直接进入后续 Attention 计算,而 K 在经过 Rotary Embedding 之后会和先前的 V 一同进入 KV cache 之中,以待后续计算。随后进入 Attention 的计算,先前处理完成之后的 Q、K、V 会计算得出 self-attention。具体如下:

用户输入向量化是关键步骤,其中tokenize过程将文本转为向量,尽管仅占据整体prefill阶段的10%时间,但其重要性不容忽视,这一过程虽然有所代价,却是后续处理的基础与核心。

2.进行真正的 prefill 计算,这一过程会占掉大概 80% 的时间。

在Pytorch中,sampling环节常涉及sample、top p方法,而在大语言模型推理时则常用argmax。此过程旨在基于模型结果生成最终词汇,尽管仅占总体时间的10%,却至关重要,对模型输出的精准度具有决定性影响。

最后,我们迅速将refill的结果反馈给客户,此环节耗时极短,仅占整体流程2%至5%的时间,高效便捷。

2.Decoding(递归推理与解码输出)阶段

每生成一个token就要计算一次。模型理解了初始序列之后便会开始逐词预测后续文本,每次预测时模型都会基于已知的输入序列和上一步预测出来的词计算出下一个最可能的词汇的概率分布,输入过后,执行和 Prefill 前期一样的操作,随后计算 Attention,此时的 Q 就只是一行向量了(因为只有一个词作为输入),K,V 则依旧是矩阵(新输入的 Embedding 生成的 K,V 向量嵌入 KV cache 原本有的矩阵中,和隐状态融合),一样的计算过程可以得出下一步的输出。这个预测过程会一直持续到达到预设的终止条件,例如生成特定长度的文本、遇到终止符,或是满足某种逻辑条件为止。

在Decoding阶段,无需进行tokenize操作,每次解码均直接从计算起步。整个解码流程耗费了高达80%的时间,紧接着的采样生成词过程也占据了10%的时间。然而,还有一项关键步骤——detokenize,即在生成词向量后需将其解码为文本形式,此过程约占5%的时间。最终,将生成的词精准地呈现给用户,确保信息的完整性与准确性。这一优化流程不仅提升了效率,更确保了用户体验的流畅与舒适。

Decoder中的Multi-Head Self-Attention结构运算量庞大,模型宽度与Layer数量倍增后,参数量急剧增长,导致推理速度缓慢且资源消耗巨大。优化此结构,提升效率,成为当前研究的迫切需求。

二 推理性能的评价指标

在大模型推理中的四个指标

1.Throughput(吞吐量)

吞吐量是系统负载顶峰时,单位时间内所能执行的decoding数量,即字符生成量,是评估系统性能的关键指标。

测试吞吐量的高效方法是模拟所有用户在同一时间提出相同问题,并同步启动和结束测试。确保每位用户生成与输入的文本长度一致,构建完整的测试批次。通过此种方式,能最大程度地激发系统潜能,实现吞吐量的最大化,从而精准评估系统性能。

如果用户输入的长度和生成的长度很长,那么系统吞吐量不会很高。

2.First Token Latency(首词元延迟)

用户进入推理系统后,完成Prefill阶段所需的时间即为系统响应生成首个字符的时长。精准测量这一过程,对优化用户体验至关重要。

希望用户在系统上输入问题后得到回答的时间小于 2~3 秒。

与首字延迟最相关的就是用户的输入长度,用户输入的长度越长,首字延迟也会越高

3.Latency(延迟)

Decoding时长是评估大模型性能的关键指标,它衡量着模型每生成一个字符所需的时间,直接反映生成过程的流畅度,是提升用户体验的重要参数。

通常情况下,我们期望生成的延迟低于50毫秒,即每秒生成20个字符,确保输出流畅自然,为用户提供优质体验。

推理延迟主要受到batch size的影响,随着batch size的增大,推理延迟也会相应增加,需合理设置以优化性能。

4.QPS(每秒请求数)

一秒钟能够处理多少个用户的请求。表示系统中每秒可以处理多少个请求。

不同用户生成内容时长差异大,导致GPU利用率不均,存在大量闲置。因此,尽管系统吞吐量看似可观,但实际的QPS处理能力却可能大打折扣。优化资源分配,提升处理效率,方能充分释放系统潜能。

二 推理优化技术

1.KVCache

在decoding阶段,计算当前token与先前所有生成token的attention时,需反复计算所有token的k和v向量。为避免对先前token的kv值进行冗余计算,我们可以巧妙地将它们存储为两个维度为[seq_len-1, inner_dim]的Tensor。

这样,每轮计算仅需针对当前token计算kv值,从而显著提升计算效率,优化解码过程。这一策略不仅减少了计算量,还确保了计算结果的准确性,为深度学习模型的优化提供了有效思路。

KVCache作为最直接有效的优化手段,已成为模型默认实现标配,无需额外配置,轻松提升性能,是您的理想之选。

17451a5e729902bb8b7a017cb1026822.jpeg

4614462e5ad8624bea06e61d65281e90.jpeg

b6b37b2b1763db20437c908183f4a2c4.jpeg

05da0c851dd56d55400a8d619479c17c.jpeg

KVCache

2.分布式推理

在大模型的训练和推理过程中有以下几种主流的分布式并行方式:

  • 数据并行(DataParallel)是一种高效的并行计算策略,它通过将模型部署在多个GPU上,实现数据集的分布式处理。每个GPU都承载完整的模型副本,并独立处理数据集的子集,从而大幅提升推理速度。无需像训练过程那样聚合结果更新参数,只需简单部署模型于多个GPU即可轻松实现并行推理。
  • 流水线并行(PipelineParallel)是一种优化策略,它通过将模型纵向拆分,使得每个GPU仅处理模型的部分层。数据在首个GPU完成计算后,无缝传递给下一个GPU继续处理。这通常是解决单一GPU内存无法容纳完整模型时的有效方法。然而,各层间的顺序执行并未加速模型计算,与之相比,其他两种并行方式则能显著提升模型的推理速度。
  • 张量并行,即TensorParallel,是模型优化的关键策略。它巧妙地将模型各层横向拆分,并分散至不同GPU,实现高效并行计算。这种协同作战的方式,大幅提升了处理速度。在业界,张量并行常借助NVIDIA的Megatron库实现,为深度学习带来强大动力。

3.流水线处理

流水线优化是尽可能让显卡利用率占满。推理过程中tokenize、fast sample 和 detokenize 这些过程都与模型的计算无关。在执行 prefill 的过程中,当拿到了 fast sample 的词向量之后就可以立刻开始下一个阶段 decoding不用等到结果返回,因为结果已经在 GPU 上了。而当完成了一次 decoding 后不用等待 detokenize 的完成,可以立刻开始下一次的 decoding。因为 detokenize 是个 CPU 过程,在执行完采样过程之后就已经知道下一个生成的词是什么了,可以立刻开始下一次运算。

4.动态批处理

在第二请求进入时,将其prefill阶段与第一请求的decoding阶段巧妙融合,创新地构建出Merge Step阶段。这一阶段独具匠心,不仅高效完成首请求的decoding,更同步推进次请求的Prefill,实现资源的最优配置与利用。Merge Step的引入,将大幅提升处理效率,为用户带来更为流畅、无缝的体验。

首个请求生成过程过半时,解码阶段拥有长度为1的输入;与此同时,新请求进入Prefill阶段,其输入长度为48。我们将这两个输入沿首个维度巧妙拼接,形成总长度为49的输入,且其hidden dimension维持在4096。在这49个词中,首个词源自首个请求,而紧随其后的48个词则全部来自新请求。这种拼接方式不仅高效,而且确保了信息的完整性与连贯性。

在执行self attention算子时,我们巧妙地采用数据分流策略。解码请求与预填充请求分别被精准地引导至不同流程,执行各自特定的运算。这种分流设计不仅提升了运算效率,还确保了数据处理的精确性。经过attention算子处理后,这些用户输入数据将被精准地重新组合,继续参与后续算子的计算,从而实现高效且准确的数据处理流程。

5.低比特量化

量化是一种高效技术,通过降低模型权重和中间层变量的表示精度,实现空间节省与推理加速。采用更少位数表示数值,显著减少内存消耗,同时加速硬件平台上的推理过程,为模型优化与性能提升提供有力支持。

从时机分类量化分为:

  1. 训练时量化(QAT)虽需模型重新训练,但其效果通常更佳。尽管成本较高,但因其卓越表现,QAT在微调(fintune)阶段应用广泛。通过精确调整模型参数,QAT确保量化后的模型性能损失最小化,满足高效部署需求。
  2. 训练后量化(PTQ)高效量化预训练模型,无需重新训练。该技术针对模型权重与激活值实施INT8/INT4量化,轻松提升模型部署效率,降低存储与计算成本,为AI应用加速提供强大支持。

大模型重训成本高昂,常选PTQ降低成本。而QLora独树一帜,其在Lora微调阶段便实施量化,实现高效优化。

从量化的范围上可以分为:

  1. 只量化权重(Weight Only):只量化模型权重,推理时是INT乘FLOAT
  2. 权重与激活同步量化,即同时量化网络中的权重W和激活X(即各层输入)。在矩阵乘法Y=WX中,通过同时量化W和X,实现推理阶段的整数乘法,大幅提升计算效率,降低存储需求。

INT4的Weight Only量化在大模型推理中展现出色性能。当batch较小时,矩阵乘法计算中,加载权重占据高达90%的时间。针对这一场景,INT4量化应运而生。其工作原理是在加载权重后迅速进行解量化,将INT4转换为FP16。这意味着后续计算与FP16无异,确保了计算的精准性。特别适用于访存密集型的矩阵乘法,而计算过程仍由高效的FP16运算器件完成。INT4量化,为提升大模型推理效率提供了有力支持。

当batch规模达到64或128时,INT4 Weight Only量化将不再提供性能优势。这是因为大batch导致计算时间显著增加,同时解量化过程的计算量也随batch增大而上升。一旦batch超过128,INT4矩阵量化的速度将不再优于FP16矩阵量化。因此,在选择量化方法时,需充分考虑batch大小对性能的影响。

INT8无需解量化,计算效率翻倍。在batch为128时,FP16量化至INT8,权重加载与计算时间均减半,实现百分之百的加速。这一优化将大幅提升运算效率,减少时间成本,为您的数据处理带来前所未有的速度提升。

一般情况下使用FP8精度推理比使用INT8精度推理可以获得更好的模型效果。

NVIDIA的Ampere架构引领创新,支持INT8和INT4的tensor core,而最新Hopper架构更进一步,支持FP8的tensor core,不断推动计算性能边界,为用户带来前所未有的体验。

权重精度格式,即定义权重数值的精确程度,是优化模型大小、内存效率及计算速度的关键步骤。精确量化权重,不仅有助于缩减模型体积,更能确保性能稳定。因此,选择合适的权重精度格式,对于保持模型效能与减小存储需求至关重要。

激活精度格式,作为神经网络层间数据传递的关键,其选择对模型性能与效率至关重要。与权重精度相辅相成,精确控制激活值的格式,能够显著提升模型的运算效率和预测准确性,是深度学习优化不可或缺的一环。

具体到不同的批量推理场景,选择合适的量化方法有不同的考量:

  • 小批量推理(batch size ≤ 4)聚焦于内存带宽的优化。为降低模型内存占用并加速推理,推荐仅对权重进行量化。此方法不仅高效利用内存资源,更显著提升推理效率,是小批量推理场景下的理想选择。
  • 针对大批量推理,尤其在服务场景中(batch size ≥ 16),内存带宽与计算密度成为关键考量。为提升效率,推荐对权重与激活进行量化处理。对于此类大规模批量,量化策略需根据模型特性定制。初始推荐采用FP8格式,其通常能在性能与准确性间取得最佳平衡。若特定用例需求未达预期,可尝试Int8 SmoothQuant(Int8 SQ)、AWQ或GPTQ等策略,以寻找更契合的解决方案。精准量化,助力高效推理。

6.System Prompt

大模型推理一般都采用流式输出(streaming),LLM推理的首token时延就是用户感受到的LLM推理服务的响应时间,直接影响用户体验。在LLM推理过程中,生成首token是计算密集型任务。在通常应用中,对LLM的每一次请求都可能带着相同的System Prompt作为输入(作为Prompt的一部分)。这样就导致对于用户多次请求,LLM推理需要重复计算System Prompt,造成GPU资源浪费,特别是增加了不必要的首token时延。如果能省去对于System Prompt的重复计算,那将会显著提升首token生成速度。

当用户的每次请求都携带相同的System Prompt(Shared Prefix)时,我们可高效处理这一系统提示,预先计算其对应的Key和Value值,并将这些结果缓存至GPU显存中。对于后续用户请求中的相同System Prompt,我们无需重复计算,只需从显存中直接加载,从而大幅缩减Prefill计算时间,进而显著提升首token的生成速度。这一优化策略将为您带来更加流畅、高效的体验。

高级用法中,可对输入Prompt的Key和Value值进行全面Caching,不仅限于shared prefix。通过采用Prompt Cache模板,能够精准地对Prompt的不同部分实施KV Cache操作,显著提升数据处理效率,实现更灵活、高效的缓存管理,让您的应用体验更上一层楼。

7.预测生成长度

为每个请求精准预测所需生成长度,确保资源高效利用。请求一到,即为其分配连续空间,长度均基于精准预测。推荐采用专业模型进行训练,实现高效精准的生成长度预测。

Page Attention运行过程中,当前系统已承载四个请求,剩余6块显存待分配。面对潜在的新请求,尚难确定系统能否继续提供服务,因为当前请求尚未完成,未来可能还需追加显存。因此,精准预测每个用户的实际生成长度至关重要。只有如此,我们才能准确判断在特定时间点是否接纳新用户输入,确保系统稳定运行,高效服务。

8.Flash Attention

通常的计算任务主要有计算密集型任务和访存密集型任务。

  1. 计算密集型任务聚焦于计算本身,如矩阵乘法与大核卷积操作,其耗时直接受FLOPS影响,而显存读写并非关键。高效能计算力,方能驾驭此类任务。
  2. 访存密集型操作以访存为主,计算耗时较短,如ReLU、Dropout、求和、Softmax和BN等。其执行效率关键在于MAC操作。优化访存密集型操作,能显著提升整体计算性能,实现更高效的数据处理。

GPU配备了类似L1、L2的分级缓存机制,包括SRAM和HBM。Flash attention推理加速技术,凭借GPU独特的非均匀存储器结构,巧妙实现内存优化与推理提效。该技术致力于将Attention计算重心转移至SRAM,减少对HBM的频繁访存,从而显著提升整体性能,为您带来更快、更高效的计算体验。

ae22a76105636969b5e57d59f536b23d.jpeg

SRAM和HBM

观察下图Attention计算分为三步:

  1. 从HBM读取QK,计算S = QK^T,将S写回HBM
  2. 从HBM读出S,计算P = softmax(S),将P写回HBM
  3. 从HBM读出P和V,计算O=PV,将O写回HBM

52e3a6a0590245f6673bb7bd664dd4ef.jpeg

在计算过程中,HBM需读写各三次,是否可优化至仅一次?FlashAttention打破常规,循环内即可完成分块计算,中间结果反复精炼。虽计算量增加,却避免了HBM读取,运算速度反得提升。此创新方法,不仅提升效率,更展现出技术的无限可能。

Flash Attention与RISC-V的设计理念异曲同工,均追求高效与快速。正如RISC-V通过增加寄存器量超越x86提升性能,Flash Attention亦通过大量运用存取迅捷的SRAM,显著增强整体运算速度。SRAM相较于HBM,其存取优势不言而喻,正如寄存器之于数据存取的速度优势。Flash Attention以此为核心设计,旨在实现运算性能的飞跃。

9.Paged Attention

我们的系统独具匠心地采用了显存动态追加机制,其原理类似于操作系统的页式存储管理。每当有新的请求,系统即会精准分配一小块显存,足以支持生成8个字符。随着字符的生成,系统会自动追加显存,确保结果得以顺利写入。整个过程中,系统精心维护着显存块间的链表,确保算子顺畅输出。随着生成内容的不断增长,显存块分配将灵活追加,既高效又稳定,为用户提供了卓越的使用体验。

灵感源自OS系统的虚拟内存与分页机制,我们创新地实现了在离散空间内连续存储kv键值。这一方法通过分页技术,巧妙地将连续的keys和values散列存储。我们巧妙地将KV cache序列拆分为固定长度的KV块,每块对应固定长度的tokens的k、v向量。运算时,query("forth")向量qi与块中Kj相乘,精准计算注意力分数Aij。随后,Aij与值向量Vj相乘,得出精准的注意力输出oi。这一创新技术,不仅优化了存储空间,更提升了数据处理效率。

键值均分布式存储,采用分页管理关联。序列的连续逻辑块经block table映射至非连续物理块,实现高效存储与访问,确保数据稳定可靠。

Paged Attention机制为vLLM带来了革命性的分块存储方式,实现更灵活的分页内存管理。现在,用户只需借助官方vLLM库,即可轻松运用Paged Attention,让内存管理变得高效便捷。

5ac5936ded2484e694dab64eab745a7f.jpeg

keys 和 values 散列存储

利用同一prompt生成多个输出序列时,可共享计算中的attention键值,实现高效的copy-on-write机制。这一机制仅在必要时复制数据,显著减少显存占用,提升计算效率,为深度学习应用带来巨大优势。

fa18ccca804f1a53db44a5678ba5e079.jpeg

同一个prompt生成多个输出序列

10.精简Attention的MHA\GQA\MQA技术

MQA实现头间共享机制,统一使用Key和Value矩阵,同时每个头仅独立保留Query参数,此举显著减少了Key和Value矩阵的参数量,提升了模型效率,为深度学习应用带来了革命性的优化。

GQA将查询头分成N组,每个组共享一个Key 和 Value 矩阵。

GQA与MQA均可实现Key value共享,有效缩减模型体积。其加速秘诀在于减少数据读取与推理时的KV Cache。务必注意,为利用这两项技术,需在模型训练时启用,并遵循特定模式生成模型。通过精准控制,GQA与MQA助力模型优化,实现更高效能的运算体验。

11.选择合适的硬件

采用先进的SOTA推理服务框架,我们深入评估了不同硬件与负载的性能。目前,我们批量供应的GPU卡包括高性能的Nvidia H20、L20、A10,以及国产领先AI芯片如昇腾910、邃思2.0、昆仑芯XPU 2代等。此外,我们还保有Nvidia A800、H800、L40S、A30等GPU卡库存,满足LLM推理服务的多样化需求。我们的服务框架能充分发挥各类硬件性能,为您的AI应用提供卓越推理能力。

142da61de69b41274c7fd8a11ad2b4ee.jpeg


 

-对此,您有什么看法见解?-

-欢迎在评论区留言探讨和分享。-


网站公告

今日签到

点亮在社区的每一天
去签到