克服资源障碍:大模型量化技术与高效部署策略全解析

一、前言

在当前AGI领域蓬勃发展的大背景下,大语言模型(LLM)的参数规模和复杂性不断增长,这不仅带来了前所未有的计算能力,也带来了对硬件资源的巨大需求。为了解决这一挑战,大模型量化技术应运而生。量化是一种模型压缩技术,它通过减少模型中权重和激活的数值精度来降低模型的内存占用和加速推理过程,同时尽可能保持模型性能。随着深度学习在各行各业的广泛应用,量化技术逐渐成为实现高效部署的关键。本文将深入探讨大模型量化技术的原理、方法、适用场景以及最新的研究进展,为读者提供一个全面的视角。

二、大模型的量化方法汇总

1.大模型量化方法汇总

大模型量化方法主要分为3类,包括量化感知训练(QAT)、动态离线量化(PTQ Dynamic)和静态离线量化(PTQ static)。QAT需要再预训练好的模型基础上再次进行训练,会耗费额外的机时。根据是否有预训练的样本数据选择PTQ Dynamic和PTQ static,PTQ Dynamic操作简单,而PTQ static对模型的精度影响更小。Pytorch官方也提供了上述三种量化方法,详细信息参考https://pytorch.org/docs/stable/quantization.html#

图1. 三种量化方法的对比和选择

       目前为止,研究人员在上述的量化方法基础上也发明了一系列的算法并将其利用到模型的部署。这些量化方法降低了模型的尺寸、减小了模型的部署显存和内存占用、降低功耗、加快推理速度等。近2年主流的量化方法如下:

  1. SmoothQuant:2023年6月由Han团队发表,利用数学等效变换的方法将量化从难度更大的激活离线迁移到权重来平滑异常的激活值(实际上是将input的动态范围除上scale,并将该scale吸到下一层的weight内, 利用weight的细粒度量化来承担该量化困难),实现权重和激活的int8量化。
  2. AWQ:SmoothQuant的续作,2023年10月由Han团队发表,利用group 量化将权重分组为多个子矩阵,然后使用 activation-aware 的方法来量化每个子矩阵,最后使用无重新排序的在线反量化来提高量化性能。实现权重int3/4位的量化。
  3. GPTQ:2022年10月由Frantar团队发表,利用hessian信息作为准则判定每个权重量化后对输出loss(通常定义为MSE)造成的影响, 量化影响最大的权重(即最敏感)挑选出来先进行量化, 然后对其他权重进行更新来补偿该权重量化导致的影响, 如此往复, 直至全部量化结果。是目前int3/4量化的首选
  4. ZeroQuant系列v1/v2:2022年6月Yao团队发表,采用input token-wise quantization 和weight group-wise quantization并设计了LKD(Layerwise Knowledge Distillation),同时利用了kernel fused方法,实现权重和激活的int8量化。
  5. LLM-int8:2022年11月由Dettmers团队发表,利用了Vector-wise量化和混合精度分解这两种方法,将Linear拆分成两部分,一部分为int8, 一部分为fp16, 分别计算后相加。几乎不掉精度的int8量化。
  6. LLM-QAT:2023年5月Liu团队发表,是一种data-free 量化感知训练(QAT),它使用下一个Token 数据生成的方式来生成 QAT 数据;利用了采用 per-token 激活量化和 per-channel 权重量化以及知识蒸馏等技术。实现激活权重以及K-Vcache的int4/8量化。
  7. Q-Lora:2023年5月由Dettmers团队发表,该方法提出4-bit NormalFloat(NF4,一种新的数制,其最佳优化性可以被数学严格证明)和量化量化常数(Double Quantization)以及Paged optimizers等技术,实现4bit量化。(据说跑起来kernel速度慢,不通用,后续不过多讨论)
  8. Squeeze LLM:2023年10月由Kim团队发表,该方法通过求解loss的二阶hessian矩阵来确定原张量中对于量化最为敏感的权重, 将量化点安置在此权重附近, 其它点以MSE最小来安置. 该方法以少量的存储空间换来了目前最优的4-bit weight精度, 但其缺点是由于采用LUT来实现非均匀量化, 导致其kernel在batch > 1时Linear的执行速度急剧下滑。

尽管目前来说已有这么多的量化相关的算法已被发明,但这些方法在实际应用方面仍存在局限,例如ZeroQuant只能量化参数量为20B以下的模型、SmoothQuant目前在int8量化效果较好而在int4量化时精度损失严重等等。接下来我将对不同的量化算法所适用的模型以及他们优缺点进行比较,进而分析最适合our model的量化方法。

2.现有量化方法对比分析

       由于量化算法设计的针对性,不同量化算法的优势体现在某一方面;同样地,这种特性也导致在其他方面表现往往可能不尽人意。上述不同量化方法之间的主要差异主要包含以下几个方面:1)模型精度的维持程度 2)推理速度的提升程度 3)内存优化程度 4)适用的模型类型和模型参数大小 5)是否耗费额外计算(QAT还是PTQ)

       图2. 不同量化算法之间的比较

  1. 从模型精度维持程度进行比较,LLM-int8和 LLM.QAT的精度损失最低,其次是Squeeze LLM、AWQ、SmoothQuant、GPTQ,最后是ZeroQuant。其中SmoothQuant在8-bits的量化后精度和LLM-int8接近,在4-bits量化后精度严重下降;AWQ的出现弥补了SmoothQuant在低比特位量化精度损失上的不足,甚至优于GPTQ。
  2. 推理速度提升方面来讲,更低比特位量化的推理加速程度往往更高。所以AWQ、squeeze LLM、GPTQ推理加速最快,其次是LLM.QAT、SmoothQuant、LLM-int8和ZeroQuant。
  3. 内存的优化程度和量化的比特位数相关,结果基本同上。
  4. 从适用的模型参数大小来说,SmoothQuant、GPTQ、LLM-int8都适用100B以上的大模型,SqueezeLLM、LLM.QAT、AWQ适用10B-100B左右的模型,ZeroQuant适用20B以下甚至更小的模型。从适用的模型类型来说,SmoothQuant和GPTQ计算更加简单通用性更强,甚至都可以在FastTransformer和Pytorch上直接应用;LLM.QAT、AWQ、LLM-int8计算过程相对复杂,需要额外的训练或计算;
  5. 从功耗来看,LLM-QAT功耗最大,其次是AWQ,其他模型的功耗都相对较小。

总的来说,上述量化算法中LLM.QAT引入额外的计算量太大、ZeroQuant精度低且适用模型参数小、LLM-int8推理延时较长,这三者将不被考虑进我们模型的量化方式中。随后将根据情况在其余四种量化算法中做出选择。

三、大模型部署技术汇总

1. 当前国际主流大模型部署方法汇总

LLaMA:LangChain+Streamlit方法

I. 建立虚拟环境和项目结构

  • 首先,需要为项目创建一个虚拟环境,以隔离项目依赖并确保环境一致性。可以使用pipenvconda等工具来管理虚拟环境。
  • 接着,设置项目文件结构,包括存放模型的models文件夹和包含依赖项的requirements.txtPipfile

II. 本地安装LLaMA

  • LLaMA模型是Meta AI设计的大型语言模型,可以从Hugging Face模型库下载所需的GGML格式模型,例如LLaMA 7B,以便于在本地CPU上执行。

III. LangChain框架集成LLM

  • LangChain是一个开源库,专为与大型语言模型(LLM)集成而设计。它提供了一系列的接口和工具,使得开发者能够轻松地将LLM集成到应用程序中。
  • 通过LangChain,可以构建出能够处理文档检索、问答、摘要等功能的应用程序。

IV. 生成嵌入和向量库

  • 包括加载和转换文档,使用Embeddings生成文档的嵌入表示,以及创建用于存储和检索文档的向量库。
  • 可以使用LangChain提供的工具来简化这一过程,例如RecursiveCharacterTextSplitter用于文本分割,FAISS用于创建向量存储。

V. Streamlit创建交互式应用程序

  • Streamlit是一个Python库,可以快速将数据脚本转化为可分享的Web应用。
  • 结合LangChain和Streamlit,可以创建出交互式的AI应用程序,允许用户通过Web界面与AI模型进行交互。

此外,对于LLaMA模型的量化,我们还可以参考以下的方法和技巧:

  • 使用llama.cpp工具进行模型的量化部署,支持多种量化方法,如q4_0、q8_0等。
  • 量化可以显著减少模型大小并提高推理速度,同时可能会有一定的精度损失。
  • 在量化过程中,可以选择不同的量化位数以平衡模型大小和推理速度。
  • 量化后的模型可以部署在CPU或GPU上,根据硬件配置选择合适的量化策略。



2. 国内大模型ChatGLM以及百川等模型部署方法

ChatGLM

从GLM1到GLM4的四代ChatGLM模型部署方法基本相似,其官方项目页面给出的方法包括网页版Demo(基于Gradio或者streamlit会生成一个Web Server并输出地址,打开浏览器即可使用);命令行的Demo(在终端上进行交互式对话);API部署(安装fastapi uvicorn,运行api.py文件,默认部署在本地8000端口,通过POST方法调用;低成本部署——量化模型部署,输入以下代码

model = AutoModel.from_pretrained ("THUDM/chatglm2-6b-int4",trust_remote_code=True).cuda()

Baichuan2-7B/13B-chat

Baichuan2系列模型除了原始的全精度模型外,还包含4bits量化的7B/13B版本,在做加速推理时使用了pytorch2.0支持的F.scaled_dot_product_attention;部署方法主要是基于streamlit网页版demo,模型量化支持可以通过以下代码实现int4/8类型量化:

int8量化

model = AutoModelForCausalLM,from pretrained("baichuan-inc/Baichuan-13B-Chat")
model.quantize(8).cuda()

int4量化

model = AutoModelForCausalLM,from_pretrained("baichuan-inc/Baichuan-13B-Chat")
model = model.quantize(4).cuda()

Yuan2.0

Yuan2.0系列大模型为开发者提供了适用于Yuan2.0大模型 的 llama.cpp(llama.cpp for Yuan2.0)项目,基于开源项目llama.cpp,提供模型转换、量化功能的完整代码与详细步骤。在该项目中,开发者可以通过以下命令一键实现模型量化功能:

# windows:
./quantize.exe yuan2b-moe-40b-24-f16-hf.gguf yuan2b-moe-40b-q4_0.gguf q4_0

# linux:
./quantize yuan2b-moe-40b-24-f16-hf.gguf yuan2b-moe-40b-q4_0.gguf q4_0

更详细的量化模型使用和部署步骤可以参考llama-cpp for Yuan2.0项目主页Yuan2.0 llama-cpp icon-default.png?t=N7T8https://github.com/IEIT-Yuan/3rd_party/tree/main/llama-cpp

四、其他加速推理、维持精度的方法调研汇总

FasterTransformer

FasterTransformer(FT)是一个基于 CUDA/C++ 编写的优化引擎,相对于 TensorRT 更加注重分布式方法,以加速 Transformer 大模型的推理。FT 提供了一系列优化技术,包括层融合、推理优化、内存优化、使用 MPI/NCCL 实现节点间和内部通信,同时支持 INT8 推理。FT 框架的使用流程如下:

  1. 配置基础环境:为了使用 FT,需要安装 NVIDIA Docker 和 NGC 容器,以及适配的 NVIDIA GPU(如 Pascal、Volta、Turing、Ampere 等)。还需要安装 cMake(3.13 及以上版本)、CUDA(11.0 及以上版本)、NCCL(2.0 及以上版本)、Python(3.9.13)、和 PyTorch(1.13.0)。
  2. 构建 FasterTransformer:构建 FT 的过程包括拉取镜像、创建 Docker 环境、下载 FT 代码、进入 build 文件夹,执行 cMake 命令生成 Makefile 文件,然后使用 make -j12 使用多个线程执行编译。
  3. 安装依赖包:为了进行模型推理,需要安装依赖包。通常,可以使用 pip 安装依赖包,如在 `requirement.txt` 中指定的。
  4. 数据与模型准备:准备模型(例如,以 bloomz-560m 为例)和数据集(如 LAMBADA)。
  5. 模型格式转换:为了避免在模型并行时需要拆分模型的额外工作,FT 提供了一个工具,用于将模型从不同格式拆分和转换为 FasterTransformer 二进制文件格式。然后,FT 可以直接以二进制格式加载模型。

FasterTransformer 提供了快速的模型推理,与 Hugging Face 的 transformer 框架相比,它通常能提高推理速度超过 10 倍。此外,FT 还支持推理过程的张量并行和流水并行,这可以进一步显著提高推理速度。

Faster Transformer 主要技术特点

  1. 层融合:FT 利用层融合技术,将多个神经网络层合并为一个单一的神经网络,以便使用单一的核进行计算,特别是在多头注意力块中的操作可以合并到一个核中。
  2. 自回归模型的推理优化:为避免在每个新 token 生成时重新计算先前的键和值,FT 分配一个缓冲区来存储它们,从而提高了计算效率。
  3. 内存优化:FT 重用激活和输出的内存缓冲,减少内存占用,并提高性能。
  4. 高并行度支持:FT 支持张量并行和流水线并行,通过拆分批处理请求和隐藏通信空泡,提高了并行性。最新的 4.0 版本引入了分布式推理,支持 GPT-3 模型的分布式推理,可以将张量分成多个块,实现张量并行和流水线并行。

Faster Transformer 主要应用于基于 Transformer 架构的神经网络模型,特别在大规模分布式推理场景下表现出色。它在模型参数量化方面支持 INT8 量化。FT 是用 C++/CUDA 编写的,依赖于高度优化的 cuBLAS、cuBLASLt 和 cuSPARSELt 库。与 TensorRT 加速方法相比,Faster Transformer 具备多 GPU 加载 Transformer 不同块的能力,更好地利用了 GPU 运算,从而提供更高的性能。我们可以使用以下代码来测试Faster Transformer

# Run FT benchmark
python examples/pytorch/gpt/bloom_lambada.py \
--checkpoint-path /workspace/model/bloomz-560m-convert/1-gpu \
--tokenizer-path /workspace/model/bloomz-560m \
--dataset-path /workspace/data/lambada test.jsonl \
--lib-path build/lib/libth transformer.so \
--show-progress

TensorRT

TensorRT 是一个深度学习框架层面的优化引擎,专注于优化和加速各种深度学习模型的推理。它引入了多种优化技术,包括层融合、权重量化、动态图优化等,同时也充分针对 NVIDIA GPU 进行硬件优化,以最大程度利用 GPU 性能,从而实现更高性能的模型推理。TensorRT 的关键技术特点包括:

  1. 优化技术:TensorRT 提供多种优化技术,如层融合,将多个层组合成一个层,权重量化,以减小模型尺寸,以及动态图优化等,这些技术旨在提高推理性能。
  2. 硬件优化:TensorRT 针对 NVIDIA GPU 进行硬件优化,以充分发挥 GPU 的性能,实现更高性能的模型推理。这使得 TensorRT 成为一个通用的深度学习模型推理引擎,适用于广泛的应用领域,包括 transformer 模型等。
  3. 参数量化:TensorRT 作为底层优化器,自带 int4 和 int8 的参数量化功能。其他性能优化也是基于 int4 和 int8 量化展开的。即使将默认的 int4 量化关闭,采用其他量化技术如 QLoRA 的 NF4 量化,也很有限提升效果。这表明 TensorRT 在参数量化方面已经具备强大的能力。
  4. 并行处理:Transformer 模型的编码器和解码器通常可以并行处理不同的输入序列或时间步,但在某些情况下,解码器的时间步依赖关系可能导致无法完全并行化。这是一个潜在的性能瓶颈,需要特别注意。

TensorRT 使用流程

TensorRT 由一些列 C++ 库实现,支持在 NVIDIA GPU 上实现低延迟、高吞吐量的部署。TensorRT 支持 FP16 和 INT8 的计算。下面是 TensorRT 框架的使用流程:

  1. 安装并测试 TensorRT:首先,需要安装并测试 TensorRT,通常使用特定版本的 TensorRT,如 TensorRT-6.0.1.5。
  2. 提供模型文件和权重文件:提供模型文件(*.prototxt)、权重文件(.caffemodel),以及标签文件(用于数据映射成名称字符串)。这个过程通常以 Caffe 模型为例。
  3. TensorRT 的 Build 阶段:在这一阶段,您需要完成模型从 Caffe/TensorFlow/ONNX 到 TensorRT 的转换。这包括创建一个构建器(builder),创建一个网络对象,使用 TensorRT 提供的高级 API(如 CaffeParser)来解析 Caffe 模型,标记输出张量,设置批处理大小和工作空间,然后创建推理引擎。
  4. TensorRT 的 Deployment 阶段:在这一阶段,您需要反序列化 Build 阶段生成的 plan 文件,创建运行时引擎,然后输入数据,获取输出分类向量或检测结果。这个过程涉及到 GPU 显存的申请、并行计算的管理、CUDA 核心的启动等,需要细致的处理。

TensorRT 提供了强大的功能,能够帮助优化和加速深度学习模型的部署,特别适用于 NVIDIA GPU 平台。整合 TensorRT 和了解其工作流程可以显著提高模型推理的性能。

vLLM

vLLM 是一种基于 PagedAttention 算法的高吞吐量大语言模型(LLM)服务系统,旨在提高 LLM 的推理加速性能。当前的 LLM 服务系统在内存管理方面面临一些挑战,尤其是在推理阶段,每个词的生成都需要进行 Attention 运算,涉及到 Key-Value(KV)缓存,通常以序列形式存储,也称为 KV Cache,这导致串行生成速度较慢。为提高整体模型的推理吞吐量,通常会将多个请求作为一个批次一起处理,但不同请求的输入和输出长度各不相同,因此需要按照最长的输入来分配内存,从而浪费了大量存储资源。

vLLM 采用了类似操作系统内存分页的思想来解决这一问题。它将需要用到的 KV Cache 拆分成多个 Block 进行存储,每个 Block 内包含多个 KV,无论批次中每个请求的输入输出序列有多长,都可以根据需要申请 Block 存储,减少了存储资源浪费。同时,vLLM 使用了 PagedAttention 算法,该算法基于新的存储结构,能够获得与传统 Attention 算法相同的结果。

PagedAttention 算法受到了操作系统中虚拟内存和分页技术的启发,允许在不连续的内存空间中存储连续的键和值。具体来说,PagedAttention 将每个序列的 KV 缓存划分为 KV 块,每个块包含一定数量的 Key 和 Value 向量。在注意计算中,PagedAttention 内核能够识别和获取不同的 KV 块,实现了高效的推理加速。

总的来说,vLLM 的内存管理方式类似于操作系统中的虚拟内存,通过 PagedAttention 将 KV 缓存组织为固定大小的 KV 块,动态分配内存,减少了内存浪费,并进一步提高了 LLM 服务的吞吐量。这种方法是框架层面的优化,适用于各种类型的模型结构,特别对于长序列的大模型推理任务有着显著的改进效果。

vLLM 的特性和性能使其成为支持 FastChat 等多模型聊天前端的强大后端,实现了比 Hugging Face Transformers 高 24 倍的吞吐量。它基于 PagedAttention 技术及其内存共享特性,有效管理 Attention 模块的 Key-Value 缓存。不需要改变模型架构,vLLM 在不同应用中具备广泛的应用前景。

FastLLM

Fastllm是纯c++实现,无第三方依赖的高性能大模型推理库. 其属于全平台加速框架,可以支持包括手机移动终端在内的多种设备,6~7B级模型在安卓端上也可以流畅的实时运行,例如在骁龙865上约4~5 token/s。全平台加速推理方案,单GPU批量推理每秒可达10000+token,手机端最低3G内存实时运行(骁龙865上约4~5 token/s)。除此之外,该框架还有许多通用性和可移植性方面的优点,具体列举如下:

  1. 纯c++实现,便于跨平台移植,可以在安卓上直接编译
  2. 多平台兼容,可以应用不同平台上的指令层优化方法,ARM平台支持NEON指令集加速,X86平台支持AVX指令集加速,NVIDIA平台支持CUDA加速
  3. 支持浮点模型(FP32), 半精度模型(FP16), 量化模型(INT8, INT4) 加速
  4. 支持多卡分布式部署,包括计算资源有限时的GPU + CPU混合部署
  5. 支持并发计算时动态构建Batch和minibacth,可以充分利用内存空间
  6. 支持流式输出,很方便实现打字机效果
  7. 支持python调用,便于敏捷开发和多端布署
  8. 前后端分离设计,便于支持不同形式的硬件设备
  9. 支持包括ChatGLM,各类LLAMA模型(ALPACA, VICUNA等),BAICHUAN,MOSS在内的等多种模型

NVIDIA Triton

NVIDIA Triton 推理引擎是 NVIDIA 推出的用于部署和管理深度学习模型的开源推理服务框架。它旨在帮助开发人员有效地将深度学习模型部署到生产环境中,提供了灵活、高性能的模型部署和推理解决方案。NVIDIA Triton 推理引擎的一些关键特点和功能总结如下:

  1. 多框架支持:Triton 支持多种深度学习框架,包括 TensorFlow、PyTorch、ONNX、TensorRT 等,使用户能够轻松地部署不同框架下的模型。
  2. 高性能:Triton 提供了高性能的推理能力,充分利用 NVIDIA GPU 的硬件加速来加速模型推理。这使得 Triton 特别适用于需要低延迟和高吞吐量的应用。
  3. 多版本部署:Triton 支持多版本模型的部署,允许用户在生产环境中并行部署和管理不同版本的模型。这对于模型更新和回滚非常有帮助。
  4. RESTful API:Triton 提供了 RESTful API,使用户可以通过 HTTP请求进行模型推理。这简化了与服务的交互和集成,允许开发人员使用各种编程语言来与Triton交互。
  5. 容器化:Triton 推理引擎采用容器化技术,模型部署通过 Docker 容器进行,这为模型的隔离和管理提供了便利。
  6. 灵活的模型配置:Triton 允许用户定义模型配置文件,以指定模型的输入、输出、批处理大小等信息。这使得用户可以自定义模型的行为和性能。

五.总结

本文综述了大模型量化的多种方法,包括量化感知训练(QAT)、动态离线量化和静态离线量化等,并分析了它们在不同模型架构和参数规模下的应用情况。通过对比不同量化算法的精度维持程度、推理速度提升、内存优化程度以及适用性,我们为特定规模的模型推荐了合适的量化策略。同时,本文还介绍了当前主流的大模型部署方法,如FasterTransformer、TensorRT、vLLM和FastLLM等,这些方法在提高模型推理速度和降低内存占用方面发挥了重要作用。

随着技术的不断进步,量化技术正朝着更高精度、更高性能的方向发展。未来,我们期待看到更多创新的量化算法和部署框架的出现,它们将进一步推动人工智能模型在边缘设备和大规模分布式系统中的广泛应用。此外,随着硬件的发展和算法的优化,量化技术有望在保持模型性能的同时,实现更高效的能源利用和成本效益,为人工智能的可持续发展做出贡献。

目前Yuan2.0 和Yuan2.0-M32等模型也实现了int4,int8量化以及使用vLLM框架加速推理部署,具体信息可以参考我们先前的文章vLLM部署Yuan2.0:高吞吐、更便捷icon-default.png?t=N7T8https://blog.csdn.net/2401_82700030/article/details/137817043?spm=1001.2014.3001.5501关于源大模型的更多信息,

更多信息,请访问以下页面

 YuanChat Github 项目主页:GitHub - IEIT-Yuan/YuanChat

Yuan 2.0 Github 项目主页:GitHub - IEIT-Yuan/Yuan-2.0: Yuan 2.0 Large Language Model

Yuan 2.0 系列模型Hugging Face 主页:https://huggingface.co/IEITYuan

Yuan 2.0 系列模型Modelscope 主页:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值