01 什么是框架?
开始介绍之前, 我们先了解一下什么是框架?xx框架-IT人经常听到的名词。但是又有多少人知道框架的意思?
框架(framework)是一个框子:指其约束性,也是一个架子------指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。在IT软件领域,软件框架(software framework)的标准定义:通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。
简而言之,框架其实就是某种应用的半成品,就是一组组件,开发可以基于框架已有的规范和标准,快速实现自己的需求,让开发者聚焦业务领域代码。
常见的Java后端框架:Mybatis、Spring、SpringMVC、SpringBoot。前端框架有:Bootstrap、jQuery、Vue、React。这些框架无一另外都是让开发者快速开发业务逻辑。按照框架规范,定义自己业务参数。
02 为什么需要大模型推理框架
之前介绍过《Transformer原理》 ,我们知道现在LLM都是基于深度学习模型开发,训练,深度学习开发、训练等常见框架有TensorFlow、Pytorch以及Mxnet等。这些框架提供了丰富的函数库和模块,可以帮助研究人员快速构建和训练复杂的深度学习模型。但是现在单卡资源难以满足大模型训练,我们需要分布式、多卡等方式训练和推理。
对于一个深度学习工程师而言,当你在pytorch或者tensorflow写好了一个大模型,要怎么样分布式训练起来?你要怎么才能把它实际部署到云端或具体的设备上给用户使用?当你面对不同的硬件,不同的平台环境,你要如何去让代码适配并成功高效运行?难道要针对每个平台都写一套单独的代码吗?会不会工作量太大了?等等问题摆在面前。
针对以上问题, 我们不得不请出我们大模型推理框架: 大模型推理框架是一种基于深度学习技术的推理框架,旨在支持大规模深度学习模型的训练和部署。它提供了一系列的工具和服务,使得开发者能够高效地在大规模数据集上训练和部署深度学习模型,并进行推理任务。这一框架通常包括模型训练框架、分布式推理引擎、数据存储与检索等功能模块,以满足不同场景下的需求。
03 大模型推理框架指标
模型推理框架最重要的2个指标:
(1) 吞吐量: 吞吐量告诉我们我们的系统可以有效处理多少用户。吞吐量代表推理服务器在用户的多个请求中每秒生成的token数, 关于token数的含义可以查看之前文章《常识| 大模型收费计量单位之Token概念》。
(2)延迟: 另一方面反映了服务器和模型在输出序列中生成完整输出所花费的时间, 简而言之, 延迟是用户的感受------从聊天机器人收到答案所需的时间。
04 大模型推理框架对比
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 框架特点说明 | 优点 | 缺点 |
| vLLM: 一个开源的大模型推理加速框架,通过PagedAttention高效地管理attention中缓存的张量,实现了比HuggingFace Transformers高14-24倍的吞吐量。它兼容OpenAI的接口服务,并与HuggingFace模型无缝集成。 | * 高效的服务吞吐量:vLLM可以快速处理大量的并发请求。 * 支持模型种类多。 * 内存高效:vLLM使用了一种名为PagedAttention的技术,可以高效地管理注意力键和值的内存 * 文本生成的速度:实验多次,发现vLLM的推理速度是最快的; * 高 吞吐量 服务:支持各种解码算法,比如parallel sampling, beam search等; * 与 OpenAI API 兼容:如果使用OpenAI API,只需要替换端点的URL即可; | * 你需要确保你的设备有GPU,CUDA或者RoCm. * 添加自定义模型:虽然可以合并自己的模型,但如果模型没有使用与vLLM中现有模型类似的架构,则过程会变得更加复杂。例如,增加Falcon的支持,这似乎很有挑战性; * 缺乏对适配器( LoRA 、QLoRA等)的支持:当针对特定任务进行微调时,开源LLM具有重要价值。然而,在当前的实现中,没有单独使用模型和适配器权重的选项,这限制了有效利用此类模型的灵活性。 * 缺少权重量化:有时,LLM可能不需要使用GPU内存,这对于减少GPU内存消耗至关重要。 |
| transformers: Hugging Face推出的库 | * 自动模型下载 * 提供代码片段 * 非常适合实验和学习 | * 需要对ML和NLP有深入了解 * 需要编码和配置技能 |
| HuggingFace TGI (Text Generation Inference): 作为支持HuggingFace Inference API的工具,旨在支持大型语言模型的优化推理。它支持多GPU多节点扩展,可推理万亿规模参数 | * 简单的启动LLM * 使用Flash Attention和Paged Attention进行推理的优化的transformers代码 * 使用bitsandbytes GPT-Q EETQ AWQ Safetensors进行量化 * 使用 Open Telemetry,Prometheus 指标进行分布式跟 Text Generation Inference(TGI)和Transformer模型的推理方式有一些区别,主要体现在以下几个方面: * 并行计算:TGI和Transformer都支持并行计算,但TGI更进一步,它使用了Rust和Python联用的方式,实现了服务效率和业务灵活性的平衡。这使得TGI在处理大型语言模型时,能够更有效地利用计算资源,提高推理效率。 * 优化技巧:TGI引入了一些优化技巧,如continuous batching、Flash Attention和Paged Attention等,这些技巧可以进一步提高推理的效率和性能1。而传统的Transformer模型可能没有这些优化技巧。 * 模型支持:TGI支持部署GPTQ模型服务,这使得我们可以在单卡上部署拥有continuous batching功能的,更大的模型。而传统的Transformer模型可能没有这样的支持。 | 需要处理的任务或数据与TGI的优化技巧不匹配时,使用传统的Transformer推理可能会更合适。目前测试效果TGI的推理速度不如vLLM。 * 缺乏对 适配器 的支持:需要注意的是,尽管可以使用适配器部署LLM但目前还没有官方支持或文档; * 从 源代码 ( Rust + CUDA 内核)编译:对于不熟悉Rust的人,将客户化代码纳入库中变得很有挑战性; * 文档不完整:所有信息都可以在项目的自述文件中找到。尽管它涵盖了基础知识,但必须在问题或源代码中搜索更多细节; |
| ##### DeepSpeed: ##### 微软出品的高性能推理框架,DeepSpeed-FastGen 利用分块 KV 缓存和动态分割融合连续批处理,提供了比vLLM更好的吞吐。 | * 支持不同的模型库:支持多个开源模型库,如Hugging Face、FairSeq、EluetherAI等; * 量化延迟和 降低成本:可以显著降低非常昂贵的语言模型的推理成本; * Native和 Azure 集成:微软开发的MII框架提供了与云系统的出色 | * 支持模型的数量有限:不支持Falcon、LLaMA2和其他语言模型; * 缺乏对 适配器 ( LoRA 、QLoRA等)的支持; |
| Llama.cpp: Llama.cpp是一个基于C++的推理引擎,专门为Apple Silicon优化,可以运行Meta的Llama2模型。它针对GPU和CPU都做了推理优化。 | * 性能高于基于Python的解决方案,支持在适度的硬件上运行大型模型,如Llama 7B,并提供绑定,可以用其他语言构建AI应用程序,同时通过Llama.cpp运行推理。 | 模型支持有限,需要构建工具。 |
| Llamafile: 由Mozilla开发,基于C++开发,它使用了llama.cpp,这是一个C++库,提供了运行自托管大型语言模型(LLMs)所需的各种功能。通过llama.cpp,开发人员可以轻松地创建、加载和运行LLM模型,而无需担心底层环境的复杂性。此外,Llamafile还提供了一个简洁的API接口,使得开发人员可以更加方便地与LLM进行交互,从而实现各种复杂的应用场景. | 与Llama.cpp相同的速度优势,你可以构建一个嵌入模型的单个可执行文件。 | 项目仍处于早期阶段,不是所有模型都支持,只支持Llama.cpp支持的模型。 |
| Ollama: 是Llama.cpp和Llamafile的一个更加用户友好的替代品。你下载一个可执行文件,它会在你的机器上安装一个服务。安装完成后,你打开一个终端并运行。 | 易于安装和使用,可以运行llama和vicuña模型,运行速度非常快。 | 提供有限的模型库,自己管理模型,你不能重用自己的模型,无法调整选项来运行LLM,暂时没有Windows版本。 |
| ### TensorRT-LLM: 英伟达新推出了TensorRT-LLM,相对来说更加易用,后续FasterTransformer将不再维护了。 | * 层融合(Layer fusion) * 自回归模型的推理优化(激活缓存) * Attention 机制按照演进顺序可以分为 MHA(Multi-head Attention)、MQA(Multi-query Attention)以及 GQA(Group-query Attention)机制 * Graph Rewriting,TensorRT-LLM提供了一组 Python API 用于定义 LLMs,并且使用最新的优化技术将 LLM 模型转换为 TensorRT Engines,在将 LLM 模型编译为 TensorRT Engines 时会对神经网络进行优化,推理时直接使用优化后的 TensorRT Engines。 | * TensorRT-LLM目前还不是完全开源的 * 需要支持基于RESTFul API的流式输出(例如,类似OpenAI的LLM推理API接口),还需要进一步配合FastAPI才能支持流式输出 |
| ##### 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. | * 可以部署到iOS 和 Android 设备上。 * 在浏览器上运行SD模型和LLM模型。 | * 使用 LLM 模型的功能有限:不支持适配器,无法更改精度等,该库主要用于编译不同设备的模型; * 只支持分组量化 : 这种方法表现良好,但是在社区中更受欢迎的其他量化方法(bitsandbytes和GPTQ)不支持; * 复杂的安装:安装需要花几个小时,不太适合初学者开发人员; |
| #### OpenLLM: OpenLLM是一个用于在生产中操作大型语言模型(LLM)的开放平台。 | * 良好的社区支持:不断开发和添加新功能; * 集成新模型:可以添加用户自定义模型; * 量化:OpenLLM支持使用bitsandbytes[12]和GPTQ[13]进行量化; * LangChain集成:可以使用LangChian与远程OpenLLM服务器进行交互; | * 缺乏 批处理 支持:对于大量查询,这很可能会成为应用程序性能的瓶颈; * 缺乏内置的 分布式 推理:如果你想在多个GPU设备上运行大型模型,你需要额外安装OpenLLM的服务组件Yatai; |
| #### CTranslate2: #### CTranslate2是一个C++和Python库,用于使用Transformer模型进行高效推理。 | * 并行 和异步执行:可以使用多个GPU或CPU核心并行和异步处理多个批处理; * Prompt缓存:在静态提示下运行一次模型,缓存模型状态,并在将来使用相同的静态提示进行调用时重用; * 磁盘上的轻量级:量化可以使模型在磁盘上缩小4倍,而精度损失最小; | * 没有内置的 REST 服务器:尽管仍然可以运行REST服务器,但没有具有日志记录和监控功能的现成服务 * 缺乏对 适配器 ( LoRA 、QLoRA等)的支持 |
| #### Ray Serve: #### Ray Serve是一个可扩展的模型服务库,用于构建在线推理API。Serve与框架无关,因此可以使用一个工具包来为深度学习模型的所有内容提供服务。 | * 文档支持:开发人员几乎为每个用例撰写了许多示例; * 支持生产环境部署:这是本列表中所有框架中最成熟的; * 本地LangChain集成:您可以使用LangChian与远程Ray Server进行交互; | * 缺乏内置的模型优化:Ray Serve不专注于LLM,它是一个用于部署任何ML模型的更广泛的框架,必须自己进行优化; * 入门门槛高:该库功能多,提高了初学者进入的门槛; |
05 推理框架适用场景
上面列出那么多推理框架,是不是被搞懵逼了,虽然从文字说明各个推理框架优缺点,但是依然显得有些干涩. 国外有些伙伴从不同维度对比了各个主流(不是上面的全部)推理框架, 方便大家快速理解,不同框架的优势和劣势, 其中vLLM在Tokens吞吐量优势明显。
上图说明各个推理框架某些特质各有千秋,不同推理引擎在不同平台,硬件和模式下分别具有各自的优势.我们可以从不同应用场景去推荐推理框架。
(1)De****epSpeed:如果你的任务需要高性能的推理,那么DeepSpeed可能是一个好选择。DeepSpeed提供了一系列优化技术,如ZeRO(零冗余优化器),3D并行(数据并行、模型并行和流水线并行的结合),1比特Adam等,这些技术可以显著提升大模型训练和推理的效率。
(2)oll****ama:如果你需要一个易于使用的工具,那么ollama可能更适合你。ollama的主要优点在于其易用性,用户可以通过简单的命令行界面运行模型。
(3)L****lamafile:如果你需要创建一个嵌入模型的单个可执行文件,那么Llamafile可能是一个好选择。Llamafile以其便携性和创建单文件可执行文件的能力而闻名。
(4)TG****I (Text Generation Inference):如果需要本机 HuggingFace 支持并且不打算为核心模型使用多个适配器,选择文本生成推理。如果你的任务需要在多种硬件环境下进行高效推理,那么TGI可能是一个好选择。TGI提供了一系列优化技术,如模型并行、张量并行和流水线并行等,这些技术可以显著提升大模型推理的效率。
(5)vLLM:当需要批处理和最大速度时,请使用vLLM, 如果你的任务需要处理大规模的自然语言处理任务,如文本分类、情感分析等,那么使用vLLM可能是一个好选择。vLLM是一个大规模的预训练模型,可以在各种自然语言处理任务上实现优秀的性能。
(6)llama.cpp : 如果CPU推理,llama.cpp 结合模型int4量化,会是一个比较好的选择。
(7)MLCM: 手机终端推理,MLC LLM是不错的选择, 可在客户端(边缘计算)(例如,在Android或iPhone平台上)本地部署LLM。
06 总结
LLM和LLM 推理的技术如雨后春笋发展, 现在业界尚不存在各方面都远超其同类产品的推理框架. 针对不同需求和应用场景,不同推理框架优势不一样. 有些推理不仅仅只提供引擎的功能(Engine)、也提供http/rpc api的接口,比如Text Generation Inference。
同时仅仅依靠推理引擎功能,离一个完整大模型应用开发平台还有一段距离, 大模型应用开发平台的工具除了支持基本的模型推理,还有标准化的api,以及配套管理工具,可以方便去开发和管理AI应用。
推理框架作为大模型应用开发平台的引擎, 其重要性不在赘述,毫不夸张的说,为自己应用场景选择一款适合的推理框架,是LLM应用场景开发平台成功的关键.所以对大模型推理框架要全面、客观、有效的评估。
推荐阅读:
更多合集文章请关注我的公众号,一起学习一起进步:
参考文章
https://blog.csdn.net/dfagag/article/details/137930387
https://betterprogramming.pub/frameworks-for-serving-llms-60b7f7b23407
https://www.e2enetworks.com/blog/a-comprehensive-guide-to-llms-inference-and-serving-2
https://www.run.ai/blog/serving-large-language-models
https://cloud.tencent.com/developer/article/2396136
https://qiankunli.github.io/2024/02/02/llm_inference_framework.html