首页 > 其他分享 >LLM 推理和应用 开源框架梳理

LLM 推理和应用 开源框架梳理

时间:2024-03-12 11:00:47浏览次数:34  
标签:GPTQ 模型 开源 LLM GGML 量化 推理 梳理

之前对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上去查看模型时,会看到一些带有fp16int8int4 后缀的模型,比如Llama-2-7B-fp16chatglm-6b-int8chatglm2-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字样外,还带有q4q4_0q5等,比如Chinese-Llama-2-7b-ggml-q4,这里面的q4其实指的是 GGML 的量化方法,从q4_0开始往后扩展,有q4_0q4_1q5_0q5_1q8_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-6BChatGLM2-6BChatGLM3-6BCodeGeeX2Baichuan-13BBaichuan-7BBaichuan-13BBaichuan2InternLM 这些国产开源模型。

vLLM

https://github.com/vllm-project/vllm

vLLM 是来自加州大学伯克利分校的,面向GPU的大模型推理框架。

vLLm 运行大模型非常快主要使用以下方法实现的:

  1. 通过PageAttention 对attention key & value 内存进行有效的管理
  2. 连续批处理
  3. 优化的CUDA kernels

当前支持NVIDIA GPUs 和 AMD GPUs,量化方面支持GPTQAWQSqueezeLLM, 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

相关文章

  • 开源好用的所见即所得(WYSIWYG)编辑器:Editor.js
    @目录特点基于区块干净的数据界面与交互插件标题和文本图片列表Todo表格使用安装创建编辑器实例配置工具本地化自定义样式今天介绍一个开源好用的Web所见即所得(WYSIWYG)编辑器:Editor.jsEditor.js是一个基于Web的所见即所得富文本编辑器,它由CodeX团队开发。源代码托管于Githu......
  • DependencyCheck开源的软件组件漏洞检测工具
    DependencyCheck是一个开源的软件组件漏洞检测工具,用于帮助开发人员和安全团队发现项目中使用的第三方库中的已知漏洞。它扫描应用程序的依赖关系,包括第三方库、框架和其他组件,然后与漏洞数据库进行比较,以识别是否存在已公开披露的安全漏洞。1.主要特点包括:1.**自动化扫描:**De......
  • 开源无代码 / 低代码平台 NocoBase 0.20:支持多数据源
    NocoBase是一个极易扩展的开源无代码开发平台。完全掌控,无限扩展,助力你的开发团队快速响应变化,显著降低成本,不必投入几年时间和数百万资金研发,只需要花几分钟部署NocoBase。NocoBase中文官网官方文档新特性支持多数据源新增「数据源管理」插件,用于管理所有数据源的数据表......
  • 毕业半年多了,回顾从大学到现在搞过的很有意思的开源项目
    毕业半年多了,回顾从大学到现在搞过的很有意思的开源项目回想当年,在高考结束后我的分数并不高,然后被调剂到了工业设计,再到后来感觉对计算机更感兴趣,于是对了很久的线努力转专业到了计算机,之后废了九牛二虎之力在大二一年修完了计算机专业大一大二两年的课程,到了大三开始搞事就开始......
  • 视野修炼-技术周刊第76期 | Rolldown 开源
    欢迎来到第76期的【视野修炼-技术周刊】,下面是本期的精选内容简介......
  • 有限制的 bellman_ford 算法
    题目链接1.有限制的\(Bellman\_Ford\)时间复杂度:\(O(N*M)\)在传统的\(Bellman\_Ford\)中,可以处理边数不大于\(K\)条边的最短距离但我们只要加一条限制(实际上只多了两行代码)就可以实现求恰好等于\(K\)条边的最短距离具体的就在于其核心代码中:for(inti=0;i......
  • .NET开源的两款第三方登录整合库
    前言我相信做开发的同学应该都对接过各种各样的第三方平台的登录授权,来获取用户信息(如:微信登录、支付宝登录、QQ登录、GitHub登录等等)。今天大姚分享两款.NET开源的第三方登录整合库。MrHuo.OAuthMrHuo.OAuth是.NET项目集成OAuth2登录最全面的、最方便的框架,集成了国内外大部分......
  • Nomic Embed:能够复现的SOTA开源嵌入模型
    Nomic-embed-text是2月份刚发布的,并且是一个完全开源的英文文本嵌入模型,上下文长度为8192。它在处理短文和长文本任务方面都超越了现有的模型,如OpenAI的Ada-002和text-embedding-3-small。该模型有137M个参数在现在可以算是非常小的模型了。模型、训练代码以及一个包含2.35亿文本......
  • llm构建数据标注助手
    为什么要用LLM构建数据标注工具在LLM出现之前,传统的深度学习模型(包括CV和NLP)就已经需要大量的数据进行训练和微调。没有足够的数据,或者数据需要进行二次加工(比如标签标注),这些问题都成为限制深度学习模型泛化的关键。对于第一个问题,一般就是从网络上爬虫或者花大价钱从数据供应商......
  • 近年来文本检测相关工作梳理
    引言场景文本检测任务,一直以来是OCR整个任务中最为重要的一环。虽然有一些相关工作是端对端OCR工作的,但是从工业界来看,相关落地应用较为困难。因此,两阶段的OCR方案一直是优先考虑的。在两阶段中(文本检测+文本识别),文本检测是极为重要的一环。自从DBNet提出后,工业界似乎找到了法宝......