之前对LLM 推理和应用了解不多,因此抽时间梳理了一下,我们从模型量化,模型推理,以及开发平台等三个层面来梳理分析。
模型量化
模型训练时为了进度,采用的32位浮点数,因此占用的空间较大,一些大的模型需要很大的显存才能加载,且计算推理过程较慢。为了减少内存占用,提升推理速度,可以将高精度的参数转为低精度的参数,例如从 32 位的浮点数转换为 8 位整数,这个技术就叫做模型量化。
模型量化是一种将浮点计算转成低比特定点计算的技术,可以有效的降低模型计算强度、参数大小和内存消耗,但往往带来巨大的精度损失。尤其是在极低比特(<4bit)、二值网络(1bit)、甚至将梯度进行量化时,带来的精度挑战更大。
量化带来的好处
- 保持精度:量化会损失精度,这相当于给网络引入了噪声,但是神经网络一般对噪声是不太敏 感的,只要控制好量化的程度,对高级任务精度影响可以做到很小。
- 加速计算:传统的卷积操作都是使用FP32浮点,低比特的位数减少少计算性能也更高,INT8 相 对比 FP32 的加速比可达到3倍甚至更高
- 节省内存:与 FP32 类型相比,FP16、INT8、INT4 低精度类型所占用空间更小,对应存储空间 和传输时间都可以大幅下降。
- 节能和减少芯片面积:每个数使用了更少的位数,做运算时需要搬运的数据量少了,减少了访 存开销(节能),同时所需的乘法器数目也减少(减少芯片面积)
量化的方法与原理
主要有三种量化方法:
- 量化训练 (Quant Aware Training, QAT)
- 量化训练让模型感知量化运算对模型精度带来的影响,通过 finetune 训练降低量化误差。
- 动态离线量化 (Post Training Quantization Dynamic, PTQ Dynamic)
- 动态离线量化仅将模型中特定算子的权重从FP32类型映射成 INT8/16 类型。
- 静态离线量化 (Post Training Quantization Static, PTQ Static)
- 静态离线量化使用少量无标签校准数据,采用 KL 散度等方法计算量化比例因子
模型量化的原理是,实现浮点数与定点数据转换。
如上图所示,将一个更大范围的浮点数,转换为范围更小的数。
FP16/INT8/INT4
在huggingface上去查看模型时,会看到一些带有fp16
、int8
、int4
后缀的模型,比如Llama-2-7B-fp16
、chatglm-6b-int8
、chatglm2-6b-int4
,其实这些模型就是量化后的模型,fp16
表示模型的量化精度。
- FP32(单精度浮点数):使用32位二进制表示,其中1位用于sign,8位用于exponent,23位用于fraction。其数值范围大约是1.18e-38到3.40e38,精度大约是6到9位有效数字
- FP16(半精度浮点数):使用16位二进制表示,其中1位用于sign,5位用于exponent,10位用于fraction。其数值范围为
[5.96×10^-8, 65504]
,但实际能表示的最大正值为65504,最小正值约为0.0000000596(非规格表示下),符号位为0时代表正数 - INT8,八位整型占用1个字节,INT8是一种定点计算方式,代表整数运算,一般是由浮点运算量化而来。在二进制中一个“0”或者“1”为一bit,INT8则意味着用8bit来表示一个数字
- int4占用4个字节(32位)
量化精度从高到低排列顺序是:fp16
>int8
>int4
,量化的精度越低,模型的大小和推理所需的显存就越小,但模型的能力也会越差。
业界有一些开源的量化模型格式,下面来介绍。
GGML
https://github.com/ggerganov/ggml
GGML全称是Georgi Gerganov Machine Learning,是由Georgi Gerganov开发的一个张量库(tensor library),Georgi Gerganov开源项目llama.cpp
的创始人。
GGML是一个C写的库,可以将LLM转为为GGML格式,通过量化等技术让LLM方便进行加载和推理
- 采用量化技术,将原有大模型预训练结果量化(即将原有大模型FP16精度压缩成INT8、INT6精度
- 二进制文件编码,将量化后的预训练结果通过一种指定的格式变成一个二进制文件
特性:
- 用 C 语言编写
- 支持 16 位浮点数
- 支持整数量化(4 位、5 位、8 位等)
- 自动微分
- ADAM 和 L-BFGS 优化器
- 针对 Apple 芯片进行了优化
- 在 x86 架构上利用 AVX/AVX2 内在函数
- 在 ppc64 架构上利用 VSX 内在函数
- 无第三方依赖项
- 运行时不进行内存分配
在 HuggingFace 上,如果看到模型名称带有GGML
字样的,比如Llama-2-13B-chat-GGML
,说明这些模型是经过 GGML 量化的。有些 GGML 模型的名字除了带有GGML
字样外,还带有q4
、q4_0
、q5
等,比如Chinese-Llama-2-7b-ggml-q4
,这里面的q4
其实指的是 GGML 的量化方法,从q4_0
开始往后扩展,有q4_0
、q4_1
、q5_0
、q5_1
和q8_0
,在这里可以看到各种方法量化后的数据。
GGUF
GGML是基础的文件格式,没有版本控制或数据对齐,适用于不需要考虑文件版本兼容性或内存对齐优化的场景。2023年8月份,Georgi Gerganov创建一个新的大模型文件格式GGUF,全称GPT-Generated Unified Format,用以取代GGML格式。GGUF 与 GGML 相比,GGUF 可以在模型中添加额外的信息,而原来的 GGML 模型是不可以的,同时 GGUF 被设计成可扩展,这样以后有新功能就可以添加到模型中,而不会破坏与旧模型的兼容性。
但这个功能是Breaking Change
,也就是说 GGML 新版本以后量化出来的模型都是 GGUF 格式的,这意味着旧的 GGML 格式以后会慢慢被 GGUF 格式取代,而且也不能将老的 GGML 格式直接转成 GGUF 格式。
GPTQ
GPTQ 是一种模型量化的方法,可以将语言模型量化成 INT8、INT4、INT3 甚至 INT2 的精度而不会出现较大的性能损失,在 HuggingFace 上如果看到模型名称带有GPTQ
字样的,比如Llama-2-13B-chat-GPTQ
,说明这些模型是经过 GPTQ 量化的。以Llama-2-13B-chat
为例,该模型全精度版本的大小为 26G,使用 GPTQ 进行量化成 INT4 精度后的模型大小为 7.26G。
现在更流行的一个 GPTQ 量化工具是AutoGPTQ,它可以量化任何 Transformer 模型而不仅仅是Llama
,现在 Huggingface 已经将 AutoGPTQ 集成到了 Transformers 中。
GPTQ vs GGML
GPTQ 和 GGML 是现在模型量化的两种主要方式,在实际运用中如何选择呢?
两者有以下几点异同:
- GPTQ 在 GPU 上运行较快,而 GGML 在 CPU 上运行较快
- 同等精度的量化模型,GGML 的模型要比 GPTQ 的稍微大一些,但是两者的推理性能基本一致
- 两者都可以量化 HuggingFace 上的 Transformer 模型
因此,如果目标模型是在 GPU 上运行,那么优先使用GPTQ 进行量化,如果你的模型是在 CPU 上运行,那么建议使用 GGML 进行量化
模型推理框架
llama.cpp
llama.cpp 是GGML作者创始开发的一款纯C/C++的模型推理引擎,支持量化推理,支持多种设备、操作系统,最早是为了支持llama的推理,现在已经支持主流的开源模型。
llama.cpp 的一个显著特点是其对硬件的高效利用。无论是Windows/Linux用户还是macOS用户,都可以通过编译优化来提高模型推理的速度。对于Windows/Linux用户,推荐与BLAS(或cuBLAS如果有GPU)一起编译,可以显著提升prompt处理速度。而macOS用户则无需额外操作,因为llama.cpp 已对ARM NEON做优化,并且已自动启用BLAS。M系列芯片推荐使用Metal启用GPU推理,以显著提升速度。
llama.cpp 支持在本地CPU上部署量化后的模型,也就是结合上面提到的GGML,这样在超低配的硬件也能运行LLM。
chatglm_cpp
https://github.com/li-plus/chatglm.cpp
国产的chatglm模型开源后,有作者参考llama.cpp,开发了支持chatglm推理的chatglm_cpp,底层依然是基于GGML,当前支持ChatGLM-6B, ChatGLM2-6B, ChatGLM3-6B, CodeGeeX2, Baichuan-13B, Baichuan-7B, Baichuan-13B, Baichuan2, InternLM 这些国产开源模型。
vLLM
https://github.com/vllm-project/vllm
vLLM 是来自加州大学伯克利分校的,面向GPU的大模型推理框架。
vLLm 运行大模型非常快主要使用以下方法实现的:
- 通过PageAttention 对attention key & value 内存进行有效的管理
- 连续批处理
- 优化的CUDA kernels
当前支持NVIDIA GPUs 和 AMD GPUs,量化方面支持GPTQ, AWQ, SqueezeLLM, FP8 KV Cache
MLC LLM
https://github.com/mlc-ai/mlc-llm
Machine Learning Compilation for Large Language Models (MLC LLM) 是一个高性能的通用部署解决方案,支持任何大语言模型的原生部署。 MLC LLM支持以下平台和硬件: AMD GPU、 NVIDIA GPU、 Apple GPU、 Intel GPU、 Linux / Win、 macOS、 Web 浏览器、 iOS / iPadOS、 Android。
这个框架是陈天奇(tvm发起者)团队开发的,最大的特性是可以部署到iOS 和 Android 设备上,还能在浏览器上运行SD模型和LLM模型。
DeepSpeed
微软出品的高性能推理框架,DeepSpeed-FastGen 利用分块 KV 缓存和动态分割融合连续批处理,提供了比vLLM更好的吞吐。
DeepSpeed-FastGen 支持的模型:
DeepSpeed 沿用了业界主流的 分块 KV 缓存, 连续批处理技术,同时引入了 动态 SplitFuse 技术,这是一种新颖的提示和生成组合策略,利用动态提示和生成分解, 统一来进一步改善连续批处理和系统吞吐量。详情可参见 https://github.com/microsoft/DeepSpeed/blob/master/blogs/deepspeed-fastgen/chinese/README.md
推理框架小结
- 如果CPU推理,llama.cpp 结合模型int4量化,最佳的选择
- GPU推理,微软的
DeepSpeed-FastGen
是一个好的选择 - 手机终端推理,MLC LLM可以作为候选
大模型应用开发平台
之所以称之为开发平台,是这些工具除了支持基本的模型推理,还有标准化的api,以及配套管理工具,可以方便去开发和管理AI应用。
Xorbits Inference
https://github.com/xorbitsai/inference/blob/main/README_zh_CN.md
Xorbits Inference(Xinference)是一个性能强大且功能全面的分布式推理框架。可用于大语言模型(LLM),语音识别模型,多模态模型等各种模型的推理。通过 Xorbits Inference,你可以轻松地一键部署你自己的模型或内置的前沿开源模型。无论你是研究者,开发者,或是数据科学家,都可以通过 Xorbits Inference 与最前沿的 AI 模型,发掘更多可能。
官方介绍的主要功能:
标签:GPTQ,模型,开源,LLM,GGML,量化,推理,梳理 From: https://www.cnblogs.com/xiaoqi/p/18067838/llm-infer