LLM推理加速方案介绍和实验总结

一、推理加速背景知识

1.1 模型压缩

1.1.1 模型参数量化

量化(quantization),即将浮点数形式的模型参数和/或激活值转换为低比特的整型(int8、int4)或其它离散形式。量化后的模型,有着更小的内存容量与带宽占用、更低的功耗和更快的推理速度。(模型量化后是否一定提升推理速度,这一点是不确定的,如果部署平台的底层硬件并没有针对整型计算的优化,那么,由于量化/反量化等额外操作的加入,推理速度甚至会降低;不过,可以肯定的是,量化会降低内存需求,从而在推理阶段可以增加batch_size,提升Throughput)。

根据量化所应用的不同阶段,可以将量化方法分为三类:量化感知训练(QAT,Quantization-Aware Training)、量化感知微调(QAF,Quantization-Aware Fine-tuning)及训练后量化(PTQ,Post-Training Quantization)。QAT在模型的训练过程中采用量化(如LLM-QAT),QAF在预训练模型的微调阶段应用量化(如PEQA、QLORA),PTQ在模型完成训练后对其进行量化。

PTQ由于实现方式简单,不涉及对模型架构的改动也无需额外的训练,因此成为多数LLM首选的量化方式。PTQ大体可分为两类,一类只量化模型参数,如LLM.int8()、ZeroQuant、GPTQ等,另一类同时量化模型参数和激活值,如SmoothQuant、RPTQ、OliVe等。PTQ的缺点也很明显,若将模型量化至更低bit(如int4),会产生较明显的精度损失。

1.1.2 KV cache量化

在模型推理时,我们可以将中间结果key以及value的值量化后压缩存储,这样便可以在相同的卡上存储更多的key以及value,增加样本吞吐。

在config.json里提供了use_cache_quantization和use_cache_kernel两个参数来控制是否启用KV cache量化,具体使用方法如下:

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen-7B-Chat",
     device_map="auto",
     trust_remote_code=True,
     use_cache_quantization=True,
     use_cache_kernel=True,
     use_flash_attn=False
)

注意:当前该功能不支持与flash attention同时开启,如果你开了KV cache量化的同时又开了flash attention(use_flash_attn=True,use_cache_quantization=True, use_cache_kernel=True),程序默认将关闭use_flash_attn。

1.2 底层优化

底层优化,最常见的是算子融合——将多个OP(算子)合并成一个OP(算子),来减少kernel的调用。因为每一个基本OP都会对应一次GPU kernel的调用和多次显存读写,这些都会增加大量额外的开销。另外一种底层优化,是改用C++来实现模型推理(如llama.cpp),较之Python,C++运行速度更快。

分布式并行推理,主要包括张量并行(Tensor Parallelism,TP)、流水线并行(Pipeline Parallelism,PP),并行可以降低Latency。值得注意的是,多GPU并行度选择需要慎重,毕竟过多的GPU并行,会增加跨GPU通信开销和降低每个GPU的计算粒度,从而导致最终结果是增加而不是降低Latency。

1.2.1 Flash-Attention 2

FlashAttention主要应用了tiling技术来减少内存访问,将内存开销降低到线性级别,以此来提升速度,具体来说:

  1. 从HBM中加载输入数据(K,Q,V)的一部分到SRAM中
  2. 计算这部分数据的Attention结果
  3. 更新输出到HBM,但是无需存储中间数据S和P

FlashAttention 2在FlashAttention算法基础上进行了调整,减少了非矩阵乘法运算(non-matmul)的FLOPs。

1.3 解码方式优化

1.3.1 Medusa

在这里插入图片描述
主要思想是在正常的LLM的基础上,增加几个解码头,并且每个头预测的偏移量是不同的,比如原始的头预测第i个token,而新增的medusa heads分别为预测第i+1,i+2…个token。如上图,并且每个头可以指定topk个结果,这样可以将所有的topk组装成一个一个的候选结果,最后选择最优的结果。
在这里插入图片描述
该方案需要新增解码head,并冻结除新增head之外的其它部分参数,只训练新增的head。

1.3.2 SpecInfer

在这里插入图片描述
核心思想是通过计算代价远低于 LLM 的 “小模型” SSM(Small Speculative Model)替代 LLM 进行投机式地推理(Speculative Inference),每次会试探性地推理多步,将多个 SSM 的推理结果汇聚成一个 Speculated Token Tree,交由 LLM 进行验证,通过高效的树形解码算子实现并行化推理,验证通过的路径将会作为模型的推理结果序列,进行输出。
Speculator 的主要作用是利用 SSM 快速产生对 LLM 未来输出的推测结果,SSM 可以是(微调后)小版本的 LLM(如 LLaMA 7B),也可以是量化或蒸馏的小规模 LLM,还可以是可供检索的知识库(如参考文本)亦或是用户的自定义函数。总之,SSM 的输出结果越接近 LLM,验证时才会更容易通过,整体的推理效率才会更高。
由于SSM的参数规模通常会小2-3个数量级,能力有限,SpecInfer引入了“collective boost-tuning”技术,基于adaptive boosting的思想,对SSM进行微调,让SSM与原始LLM更好地对齐,提升预测准确率,降低Verification的成本
总体上来说,SpecInfer 利用了 SSM 的内在知识帮助 LLM 以更低廉的计算成本完成了主要的推理过程,而 LLM 则在一定程度上破除了逐 token 解码的计算依赖,通过并行计算确保最终输出的结果完全符合原始的推理语义。

1.3.3 Lookahead Decoding

这是一种并行解码算法,即前向解码,它主要利用雅可比(Jacobi)迭代法首次打破自回归解码中的顺序依赖性。作者观察到,尽管一步解码多个新token是不可行的,但LLM确实可以并行生成多个不相交的n-grams——它们可能适合生成序列的未来部分。

这可以通过将自回归解码视为求解非线性方程,并采用经典的Jacobi迭代法进行并行解码来实现。

在过程中,让生成的n-grams被捕获并随后进行验证,如果合适就将其集成到序列中,由此实现在不到m个步骤的时间内生成m个token的操作。

该方法无需训练,但只适用于LLama架构和greedy search。

1.3.4 EAGLE

EAGLE 利用原始 LLM 提取的上下文特征(即模型第二顶层输出的特征向量)。EAGLE 建立在以下第一性原理之上:

  • 特征向量序列是可压缩的,所以根据前面的特征向量预测后续特征向量比较容易。

EAGLE 具有以下特点:

  • 比普通自回归解码(13B)快 3 倍;
  • 比 Lookahead 解码(13B)快 2 倍;
  • 比 Medusa 解码(13B)快 1.6 倍;
  • 可以证明在生成文本的分布上与普通解码保持一致;
  • 可以在 RTX 3090 上进行训练(1-2 天内)和测试;
  • 可以与 vLLM、DeepSpeed、Mamba、FlashAttention、量化和硬件优化等其他平行技术结合使用。

EAGLE 训练了一个轻量级插件,称为自回归头(Auto-regression Head),与词嵌入层一起,基于当前特征序列从原始模型的第二顶层预测下一个特征。然后使用原始 LLM 的冻结分类头来预测下一个词。特征比词序列包含更多信息,使得回归特征的任务比预测词的任务简单得多。总之,EAGLE 在特征层面上进行外推,使用一个小型自回归头,然后利用冻结的分类头生成预测的词序列。与投机采样、Medusa 和 Lookahead 等类似的工作一致,EAGLE 关注的是每次提示推理的延迟,而不是整体系统吞吐量。
在这里插入图片描述
EAGLE 使用轻量级的自回归头来预测原始 LLM 的特征。为了确保生成文本分布的一致性,EAGLE 随后验证预测的树状结构。这个验证过程可以使用一次前向传播完成。通过这个预测和验证的循环,EAGLE 能够快速生成文本词。
训练自回归头代价很小。EAGLE 使用 ShareGPT 数据集进行训练,该数据集包含不到 70,000 轮对话。自回归头的可训练参数数量也很少。如上图中的蓝色部分所示,大多数组件都是冻结的。唯一要额外训练的是自回归头,这是一个单层 Transformer 结构,具有 0.24B-0.99B 参数。即使是 GPU 资源不足的情况下,也可以训练自回归头。例如,Vicuna 33B 的自回归头可以在 8 卡 RTX 3090 服务器上在 24 小时内完成训练。

1.3.5 Lookahead(蚂蚁开源版)

蚂蚁集团开源的一套新算法,可帮助大模型在推理时,提速2至6倍。能做到效果无损,即插即用,支持包括 Llama、OPT、Bloom、GPTJ、GPT2、Baichuan、ChatGLM、GLM 和 Qwen 在内的一系列模型。该算法已在蚂蚁大量场景进行了落地,大幅降低了推理耗时。
在这里插入图片描述

总结:

以下数据均为bs=1的情况下得到。

方法GPU Mem (GB)Speed (Tokens/s)适用模型使用成本
int8量化18.81 (来自qwen-14b官方)29.28所有模型无需训练,qwen需使用GPTQ离线量化,baichuan在线和离线均可
int4量化13.01 (来自qwen-14b官方)38.72所有模型无需训练,qwen需使用GPTQ离线量化,baichuan在线和离线均可
KV cache量化15.5 (来自qwen-14b官方)-qwen无需训练,在线量化
Flash attention 2理论上节约10倍5000左右的context length,提速有20%以上;50左右的context length,提速不到5%qwen,Llama, OPT,bigcode,falcon,GPT-NeoX,GPTJ无需训练,目前只支持A100和H100
medusa显存增大理论上推理加速比可以达到2xVicuna需要额外训练增加的head
spechinfer显存增大理论上推理加速比可达到2.6x~3.5x所有模型需要额外的小模型,并联合微调小模型。适合分布式部署
Lookahead decoding不变理论上推理加速比可达到1.5x~2.3xLLama架构无需训练,只能使用greedy search采样方法
EAGLE显存增大理论上比普通自回归解码(13B)快 3 倍LLama,Vicuna需要训练
Lookahead(蚂蚁开源版)不变2.66-6.26 倍的加速比Llama, OPT, Bloom, GPTJ, GPT2, Baichuan, ChatGLM, GLM, and Qwen无需训练
Heavy-Hitter Oracle在KV Cache开启下,降低KV Cache缓存,最多可减少20X理论上加速比可达到3xLLama,GPT-NeoX,OPT无需训练,需要改造attention部分
Flash-Decoding理论上节约10倍当context length增长到64k时(batch_size=1),理论上可达到8x加速比,越长加速越明显LLama无需训练,但没有开源代码。目前只有flashattention和xformer环境下使用
vllm-比HuggingFace Transformers(HF)高14x-24倍几乎所有模型,LLaMA系列、ChatGLM系列、GPT系列、Baichuan、BLOOM、OPT、Falcon,Qwen。但只支持cuda 11.8和12.1安装方便,需要将LLM和adapter合并后使用
FlexGen16 GB的T4卡+208G内存+1.5TB SSD,就可以完成一个175B规模大模型的serving与HuggingFace Transformers(HF)基本持平opt模型无需训练,具体如何但推理延迟巨大
TensorRT-LLM-6,818(LLama 7B,bs=112,input length=128,output length=2048)几乎所有模型,LLaMA系列、ChatGLM系列、GPT系列、Baichuan、BLOOM、OPT、Falcon,Qwen需要将hugging face格式模型转换为TensorRT-LLM Engine。只支持H100,A100,A30,L30s
Text Generation Inference--Llama, Falcon, StarCoder, BLOOM, GPT-NeoX, T5使用docker进行部署,只支持A100,A10G,T4
DeepSpeed-MII-比vLLM高2.3xLlama, Falcon, Opt,Mistral安装方便,需要将LLM和adapter合并后使用

二、实验方法

2.1 实验模型

  1. 基于qwen-14b-chat的业务模型。
  2. 基于baichuan-13b-chat的业务模型。

2.2 实验数据

两份真实的业务评测数据。

2.3 评测方式

参考上述总结,在此次实验中,为了测试和以后使用方便。因此我只实验KV Cache量化、Lookahead(蚂蚁开源版)解码方法和vLLM。

  • 实验环境:V100,32G,单卡(最好能在A800/A100上实验)
  • 评测指标
    • GPU内存占用
    • batch size大小
    • 平均推理速度(Tokens/s)
    • 推理总耗时(s)
    • 准确率
  • 评测对象
    • fp16(V100只能使用fp16,A800和A100可以使用bf16)
    • KV Cache量化
    • vLLM
    • Lookahead(蚂蚁开源版)

三、实验结果

因为FP32精度,显卡无法加载模型,因此默认精度是fp16。

1. 基于qwen-14b-chat的业务模型

注意:lookahead目前不支持qwen batch推理

方法bs=1bs=2bs=3bs=4bs=5bs=6bs=7bs=8bs=9bs=10bs=11bs=12bs=13bs=14
fp16Speed (Tokens/s)5.3525.5432.28
qps0.271.311.76
时延(s)3.740.760.57
GPU Memory Usage27.4828.5029.51OOM
KV Cache 量化Speed (Tokens/s)2.854.554.414.514.965.015.015.075.07
qps0.140.220.230.230.220.220.230.230.23
时延(s)7.104.494.384.374.524.464.424.384.38
GPU Memory Usage26.8627.3027.7228.1328.5829.0129.4429.8730.30OOM
VLLMSpeed (Tokens/s)17.0930.6439.8847.7352.2157.4661.3066.5669.5672.4064.0165.7465.6267.01
qps0.951.752.342.632.773.023.273.523.663.873.453.573.573.68
时延(s)1.050.570.420.380.360.330.310.280.270.260.290.280.280.27
GPU Memory Usage29.8129.8529.929.9429.9929.9929.9929.9929.9929.9929.9929.9929.9929.99
LookaheadSpeed (Tokens/s)11.42
qps0.47
时延(s)2.08
GPU Memory Usage27.59

2. 基于baichuan-13b-chat的业务模型

注意:lookahead目前不支持baichuan-13b batch推理,只支持baichuan2-7b batch推理

方法bs=1bs=2bs=3bs=4bs=5bs=6bs=7bs=8bs=9bs=10bs=11bs=12bs=13bs=14
fp16Speed (Tokens/s)2.0435.0156.3671.7290.20107.99119.31134.15148.12162.22172.68190.4202.92203.84
qps0.183.185.126.528.209.8210.8512.2013.4714.7515.6917.3118.4518.53
时延(s)5.40.310.200.150.120.100.090.080.070.060.060.060.050.05
GPU Memory Usage26.0726.1426.2226.3026.3926.4726.5426.6226.7026.7826.8626.9627.0227.11
VLLMSpeed (Tokens/s)18.4334.5846.8460.4185.33102.59109.68124.96138.47150.37159.91132.24140.82148.29
qps1.672.883.704.837.629.059.4810.7511.8713.0813.9610.8711.7311.86
时延(s)0.600.340.270.210.130.110.110.090.080.080.070.090.090.08
GPU Memory Usage30.1830.1930.1830.2030.2130.2130.2130.2230.2230.2330.2330.2430.2430.25
LookaheadSpeed (Tokens/s)16.93
qps1.67
时延(s)0.59
GPU Memory Usage26.15

3. 使用VLLM在Bernard上部署基于qwen-14b-chat的业务模型

结果就是VLLM框架成功提升了推理速度,8卡部署,bs=60,qps(query/s)从23->60(+160.86%)。当然效果也有一些下降,与未加速版本相比,diff率=2.5%,gsb=27:59:14,还在可接受范围内。

四、结论

  1. 从推理加速性能上比较,VLLM的加速更明显,速度更快,显存占用稳定,支持更大的batch size。
  2. 测试的所有的推理加速方法都会导致推理效果的下降,越是对结果要求严格的任务(结果只有唯一答案),效果下降越明显。
### LLM时间到准确率(TTA)综述 #### 定义与背景 时间到准确率(Time to Accuracy, TTA)是指在特定任务上达到目标性能水平所需的时间。对于大语言模型(LLM),这一指标不仅衡量了模型收敛的速度,还反映了其优化效率以及硬件资源利用率。随着LLM规模的增长,训练时间成本显著增加,因此TTA成为评估模型设计部署的重要标准之一。 研究表明,LLM的TTA受到多种因素的影响,包括但不限于模型架构的选择、参数量大小、数据集质量及其分布特性、计算基础设施的能力等[^1]。此外,在实际应用场景中,微调阶段对TTA也有重要影响,尤其是在跨模态任务中的表现更为突出。 #### 影响TTA的关键要素分析 以下是几个主要影响LLM TTA的因素: 1. **模型结构** 更高效的模型结构可以加速训练过程并降低能耗。例如,Transformer-XL相比传统Transformer具有更少的重复计算开销,从而提升了TTA的表现。同时,稀疏化技术混合精度训练也被证明能够有效缩短训练周期而不牺牲最终准确性。 2. **预训练策略** 预训练的质量直接影响后续微调阶段所需的迭代次数。采用对比学习或自监督学习方式获取高质量初始权重有助于减少整体TTA。正如某些研究指出,通过多模态联合表示学习(如视觉-语言对齐),可以在不额外标注的情况下提升泛化能力零样本预测效果。 3. **硬件支持与分布式训练方案** 当前最先进的超大规模LLMs依赖于高性能GPU集群完成快速原型验证及生产环境下的持续改进工作流。Kodai Kamiya等人提出的基于未裁剪视频序列读取的方法利用联邦学习框架实现了不同节点间的信息共享机制,这同样适用于自然语言处理领域的大规模分布式训练场景下降低通信延迟带来的瓶颈效应[^2]。 4. **算法创新** 新型优化器的设计也是改善TTA不可或缺的一部分。AdamW因其良好的通用性易于调整的学习率调度而广泛应用于各类NLP项目之中;然而针对具体问题定制化的二阶方法可能带来更快收敛速度的同时也增加了单步更新复杂度。因此如何平衡两者关系仍需深入探讨。 #### 最新研究成果概览 近年来围绕提高LLM TTA展开了一系列探索活动,部分代表性成果如下: - 提出了轻量化版本的基础骨干网络用于替代原有臃肿组件; - 开发专门面向低功耗设备端推理需求的小尺寸变体; - 结合知识蒸馏技术迁移大型教师模型的知识至学生模型内部以实现紧凑表达形式; - 推动自动化机器学习工具链建设以便开发者可以根据自身业务特点灵活配置最佳实践组合等等。 以上进展共同促进了整个行业向着更高性价比方向迈进的步伐。 ```python import torch.nn as nn from transformers import AdamW class CustomModel(nn.Module): def __init__(self): super(CustomModel, self).__init__() # Define model layers here def train_model(model, dataloader, device='cuda'): optimizer = AdamW(model.parameters(), lr=5e-5) for epoch in range(epochs): total_loss = 0 for batch in dataloader: inputs = {key: val.to(device) for key, val in batch.items()} outputs = model(**inputs) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() total_loss += loss.item() avg_epoch_loss = total_loss / len(dataloader) ``` 上述代码片段展示了如何定义一个简单的PyTorch模型并通过`AdamW`优化器对其进行训练的过程。此设置通常会作为实验基线用来比较不同的TTA优化措施的效果差异。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值