什么是框架?
框架(framework)是一个框子,指其约束性,也是一个架子,指其支撑性。它是一个基本概念上的结构,用于去解决或者处理复杂的问题。在 IT 软件领域,软件框架的标准定义:通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。
简而言之,框架其实就是某种应用的半成品,就是一组组件。开发可以基于框架已有的规范和标准,快速实现自己的需求,让开发者聚焦业务领域代码。
常见的 Java 后端框架:Mybatis、Spring、SpringMVC、SpringBoot。前端框架有:Bootstrap、jQuery、Vue、React。这些框架无一例外都是让开发者快速开发业务逻辑。按照框架规范,定义自己业务参数。
为什么需要大模型推理框架
之前介绍过《Transformer 原理》,我们知道现在 LLM 都是基于深度学习模型开发、训练。深度学习开发、训练等常见框架有 TensorFlow、PyTorch 以及 Mxnet 等。这些框架提供了丰富的函数库和模块,可以帮助研究人员快速构建和训练复杂的深度学习模型。
但是现在单卡资源难以满足大模型训练,我们需要分布式、多卡等方式训练和推理。
对于一个深度学习工程师而言,当你在 PyTorch 或者 TensorFlow 写好了一个大模型,要怎么样分布式训练起来?你要怎么才能把它实际部署到云端或具体的设备上给用户使用?当你面对不同的硬件,不同的平台环境,你要如何去让代码适配并成功高效运行?难道要针对每个平台都写一套单独的代码吗?会不会工作量太大了?等等问题摆在面前。
针对以上问题,我们不得不请出我们大模型推理框架:大模型推理框架是一种基于深度学习技术的推理框架,旨在支持大规模深度学习模型的训练和部署。它提供了一系列的工具和服务,使得开发者能够高效地在大规模数据集上训练和部署深度学习模型,并进行推理任务。这一框架通常包括模型训练框架、分布式推理引擎、数据存储与检索等功能模块,以满足不同场景下的需求。
大模型推理框架指标
模型推理框架最重要的 2 个指标:
- 吞吐量:吞吐量告诉我们我们的系统可以有效处理多少用户。吞吐量代表推理服务器在用户的多个请求中每秒生成的 token 数。
- 延迟:另一方面反映了服务器和模型在输出序列中生成完整输出所花费的时间,简而言之,延迟是用户的感受——从聊天机器人收到答案所需的时间。
大模型推理框架对比
| 框架特点说明 | 优点 | 缺点 |
|---|---|---|
| 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 使用了 Rust 和 Python 联用的方式,实现了服务效率和业务灵活性的平衡。 - 优化技巧:TGI 引入了一些优化技巧,如 continuous batching、Flash Attention 和 Paged Attention 等。 - 模型支持:TGI 支持部署 GPTQ 模型服务,这使得我们可以在单卡上部署拥有 continuous batching 功能的更大的模型。 | - 需要处理的任务或数据与 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 和 GPTQ 进行量化; - LangChain 集成:可以使用 LangChain 与远程 OpenLLM 服务器进行交互; | - 缺乏批处理支持:对于大量查询,这很可能会成为应用程序性能的瓶颈; - 缺乏内置的分布式推理:如果你想在多个 GPU 设备上运行大型模型,你需要额外安装 OpenLLM 的服务组件 Yatai; |
| CTranslate2 CTranslate2 是一个 C++ 和 Python 库,用于使用 Transformer 模型进行高效推理。 | - 并行和异步执行:可以使用多个 GPU 或 CPU 核心并行和异步处理多个批处理; - Prompt 缓存:在静态提示下运行一次模型,缓存模型状态,并在将来使用相同的静态提示进行调用时重用; - 磁盘上的轻量级:量化可以使模型在磁盘上缩小 4 倍,而精度损失最小; | - 没有内置的 REST 服务器:尽管仍然可以运行 REST 服务器,但没有具有日志记录和监控功能的现成服务 - 缺乏对适配器(LoRA、QLoRA 等)的支持 |
| Ray Serve Ray Serve 是一个可扩展的模型服务库,用于构建在线推理 API。Serve 与框架无关,因此可以使用一个工具包来为深度学习模型的所有内容提供服务。 | - 文档支持:开发人员几乎为每个用例撰写了许多示例; - 支持生产环境部署:这是本列表中所有框架中最成熟的; - 本地 LangChain 集成:您可以使用 LangChain 与远程 Ray Server 进行交互; | - 缺乏内置的模型优化:Ray Serve 不专注于 LLM,它是一个用于部署任何 ML 模型的更广泛的框架,必须自己进行优化; - 入门门槛高:该库功能多,提高了初学者进入的门槛; |
推理框架适用场景
上面列出那么多推理框架,是不是被搞懵逼了,虽然从文字说明各个推理框架优缺点,但是依然显得有些干涩。国外有些伙伴从不同维度对比了各个主流(不是上面的全部)推理框架,方便大家快速理解,不同框架的优势和劣势,其中 vLLM 在 Tokens 吞吐量优势明显。
上图说明各个推理框架某些特质各有千秋,不同推理引擎在不同平台,硬件和模式下分别具有各自的优势。我们可以从不同应用场景去推荐推理框架。
- DeepSpeed:如果你的任务需要高性能的推理,那么 DeepSpeed 可能是一个好选择。DeepSpeed 提供了一系列优化技术,如 ZeRO(零冗余优化器),3D 并行(数据并行、模型并行和流水线并行的结合),1 比特 Adam 等,这些技术可以显著提升大模型训练和推理的效率。
- Ollama:如果你需要一个易于使用的工具,那么 Ollama 可能更适合你。Ollama 的主要优点在于其易用性,用户可以通过简单的命令行界面运行模型。
- Llamafile:如果你需要创建一个嵌入模型的单个可执行文件,那么 Llamafile 可能是一个好选择。Llamafile 以其便携性和创建单文件可执行文件的能力而闻名。
- TGI (Text Generation Inference):如果需要本机 HuggingFace 支持并且不打算为核心模型使用多个适配器,选择文本生成推理。如果你的任务需要在多种硬件环境下进行高效推理,那么 TGI 可能是一个好选择。TGI 提供了一系列优化技术,如模型并行、张量并行和流水线并行等,这些技术可以显著提升大模型推理的效率。
- vLLM:当需要批处理和最大速度时,请使用 vLLM。如果你的任务需要处理大规模的自然语言处理任务,如文本分类、情感分析等,那么使用 vLLM 可能是一个好选择。vLLM 是一个大规模的预训练模型,可以在各种自然语言处理任务上实现优秀的性能。
- llama.cpp:如果 CPU 推理,llama.cpp 结合模型 int4 量化,会是一个比较好的选择。
- MLC LLM:手机终端推理,MLC LLM 是不错的选择,可在客户端(边缘计算)(例如,在 Android 或 iPhone 平台上)本地部署 LLM。
总结
LLM 和 LLM 推理的技术如雨后春笋发展,现在业界尚不存在各方面都远超其同类产品的推理框架。针对不同需求和应用场景,不同推理框架优势不一样。有些推理不仅仅只提供引擎的功能 (Engine)、也提供 http/rpc api 的接口,比如 Text Generation Inference。
同时仅仅依靠推理引擎功能,离一个完整大模型应用开发平台还有一段距离,大模型应用开发平台的工具除了支持基本的模型推理,还有标准化的 api,以及配套管理工具,可以方便去开发和管理 AI 应用。
推理框架作为大模型应用开发平台的引擎,其重要性不在赘述,毫不夸张的说,为自己应用场景选择一款适合的推理框架,是 LLM 应用场景开发平台成功的关键。所以对大模型推理框架要全面、客观、有效的评估。


