LLM 推理和应用 开源框架梳理
之前对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 模型,发掘更多可能。
官方介绍的主要功能:
模型推理,轻而易举:大语言模型,语音识别模型,多模态模型的部署流程被大大简化。一个命令即可完成模型的部署工作。
️ 前沿模型,应有尽有:框架内置众多中英文的前沿大语言模型,包括 baichuan,chatglm2 等,一键即可体验!内置模型列表还在快速更新中!
异构硬件,快如闪电:通过 ggml,同时使用你的 GPU 与 CPU 进行推理,降低延迟,提高吞吐!
⚙️ 接口调用,灵活多样:提供多种使用模型的接口,包括 OpenAI 兼容的 RESTful API(包括 Function Calling),RPC,命令行,web UI 等等。方便模型的管理与交互。
集群计算,分布协同: 支持分布式部署,通过内置的资源调度器,让不同大小的模型按需调度到不同机器,充分使用集群资源。
开放生态,无缝对接: 与流行的三方库无缝对接,包括 LangChain,LlamaIndex,Dify,以及 Chatbox。

dify
https://github.com/langgenius/dify
Dify.AI是一款开源的 LLM (大语言模型)应用开发平台,它融合了 BaaS(后端即服务)和 LLMOps的理念,涵盖了构建生成式 AI 原生应用所需的核心技术栈,包括一个内置 RAG 引擎。使用 Dify,可以基于一些开源模型自部署类似 Assistants API 和 GPTs 的能力。
dify的特点:
1. LLM支持:与 OpenAI 的 GPT 系列模型集成,或者与开源的 Llama2 系列模型集成。事实上,Dify支持主流的商业模型和开源模型(本地部署或基于 MaaS)。
2. Prompt IDE:和团队一起在 Dify 协作,通过可视化的 Prompt 和应用编排工具开发 AI 应用。 支持无缝切换多种大型语言模型。
3. RAG引擎:包括各种基于全文索引或向量数据库嵌入的 RAG 能力,允许直接上传 PDF、TXT 等各种文本格式。
4. AI Agent:基于 Function Calling 和 ReAct 的 Agent 推理框架,允许用户自定义工具,所见即所得。Dify 提供了十多种内置工具调用能力,如谷歌搜索、DELL·E、Stable Diffusion、WolframAlpha 等。
5. 持续运营:监控和分析应用日志和性能,使用生产数据持续改进 Prompt、数据集或模型。

参考
LLM 推理和应用 开源框架梳理的更多相关文章
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- Android开源框架:Universal-Image-Loader解析(一)
之前花了一些时间,好好看了下这个框架,于是决定再重新梳理一下,把整个处理方法和流程过一遍,俗话说:温故而知新嘛 关于Universal-Image-Loader此框架的各种优点,稍微介绍下,网上应该也 ...
- 2018年终总结之AI领域开源框架汇总
2018年终总结之AI领域开源框架汇总 [稍显活跃的第一季度] 2018.3.04——OpenAI公布 “后见之明经验复现(Hindsight Experience Reply, HER)”的开源算法 ...
- .NET数据挖掘与机器学习开源框架
1. 数据挖掘与机器学习开源框架 1.1 框架概述 1.1.1 AForge.NET AForge.NET是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经 ...
- 文字识别OCR开源框架的对比--Tesseract vs EasyOCR
前言: OCR文字识别在目前有着比较好的应用,也出现了很多的文字识别软件,但软件是面向用户的.对于我们技术人员来说,有时难免需要在计算机视觉任务中加入文字识别,如车牌号识别,票据识别等,因此软件对 ...
- ATC:一个能将主流开源框架模型转换为昇腾模型的神奇工具
摘要:本文介绍了昇腾CANN提供的模型转换工具ATC,介绍了其功能.架构,并以具体样例介绍了该工具的基本使用方法以及常用设置. 本文分享自华为云社区<使用ATC工具将主流开源框架模型转换为昇腾模 ...
- 10个.NetCore实用的开源框架项目
今天我们一起梳理下10个,比较受到大家欢迎的.NetCore开源框架项目.1.FytSoaCms 前后端分离CMS系统 项目简介 这是一个基于.Net 3构建的简单.跨平台.模块化建站系统.系统业务简 ...
- Android 开源框架Universal-Image-Loader学习
Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用 Android 开源框架Universal-Image-Loader完全解析(二)--- 图片 ...
- iOS常用第三方开源框架和优秀开发者博客等
博客收藏iOS开发过程好的开源框架.开源项目.Xcode工具插件.Mac软件.文章等,会不断更新维护,希望对你们有帮助.如果有推荐或者建议,请到此处提交推荐或者联系我. 该文档已提交GitHub,点击 ...
随机推荐
- PaddleNLP基于ERNIR3.0文本分类以中医疗搜索检索词意图分类(KUAKE-QIC)为例【多分类(单标签)】
相关项目链接: Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] Paddlenlp之UIE分类模型[以情感倾向分析新闻分类为例]含智能标注方案) 应用实践:分类模型大集成者[Pad ...
- 14.5 Socket 应用组播通信
组播通信是一种基于UDP协议的网络通信方式,它允许发送方将消息同时传递给多个接收方.在组播通信中,发送方和接收方都会加入一个共同的组播组,这个组播组对应一个特定的IP地址,所有加入该组播组的主机都能够 ...
- 定制你的清爽Mac版Edge浏览器
浏览器每次打开都有个烦人的提示要获取将来的 microsoft edge 更新,需要 macos 10.15 或更高版本,找了很久也没有解决办法,有 windows 端的解决方案,有禁止更新的解决方案 ...
- CF1886
A 分类讨论. B 二分. C 题意:给定一个字符串 \(s\).记 \(s_i\) 为将 \(s\) 删去 \(i\) 个字符,使得剩余字符串字典序最小得到的字符串.令 \(S=s_0+s_1+\d ...
- 跨界协作:借助gRPC实现Python数据分析能力的共享
gRPC是一个高性能.开源.通用的远程过程调用(RPC)框架,由Google推出.它基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言. 在gR ...
- python3发送需要双向认证的wss请求
python3发送需要双向认证的wss请求 websocket链接python有很多封装好的库:websocket-client.websockets.aiowebsocket 这里用的websoke ...
- golang微服务实践:分布式链路追踪系统-jaeger安装与简单使用
简介 jaeger是一个比较有名的分布式链路追踪系统,底层用golang实现,兼容opentracing标准. 文档地址:docs github地址:github 官网:website blog:bl ...
- Ansible的基本配置
目录 定义主机和组 主机的定义 主机组的定于 主机组的嵌套 选择主机和组 匹配主机 使用通配符匹配 配置文件优先级 配置文件详解 配置文件段 配置文件参数说明 配置案例 1. 在节点上创建一个普通用户 ...
- 【Android 逆向】【ARM汇编】 函数的栈帧
1. 函数的调用约定 ARM32 参数1-4 放入r0-r3 剩下的入栈,函数返回值放入r0 ARM64 参数1-8 放入X0-X7 剩下的入栈,函数返回值放入X0 (浮点数是放入 Dn 或 Sn) ...
- 通过 saltstack 批量更新 SSL 证书
哈喽大家好,我是咸鱼. 之前写过两篇关于 SSL 过期巡检脚本的文章: SSL 证书过期巡检脚本 SSL 证书过期巡检脚本(Python 版) 这两篇文章都是讲如何通过脚本去自动检测 SSL 过期时间 ...