【llm对话系统】 LLM 大模型推理python实现:vLLM 框架

在 LLM 的应用中,推理 (Inference) 阶段至关重要。它指的是利用训练好的 LLM 模型,根据输入 (Prompt) 生成文本的过程。然而,LLM 的推理速度往往较慢,尤其是在处理长序列或高并发请求时,效率瓶颈尤为突出。

为了解决这个问题,vLLM 应运而生!vLLM 是一个专为 LLM 设计的高吞吐、低延迟的推理和服务引擎,它能够显著提升 LLM 的推理速度,让你的应用如虎添翼!

今天,我们就来一起探索 vLLM 的奥秘,看看它是如何实现高效推理的!

一、vLLM 是什么?

vLLM 是一个开源的 LLM 推理和服务引擎,由 UC Berkeley 的研究团队开发。它采用了 PagedAttention 算法,能够有效地管理注意力键和值的内存,从而显著提高推理速度和吞吐量。

vLLM 的主要特点:

  • 速度快: 比 HuggingFace Transformers 快 14x-24x,比 Text Generation Inference (TGI) 快 2.2x-2.5x
  • 高效的内存管理: 采用 PagedAttention 算法,有效减少内存碎片,提高显存利用率。
  • 支持多种模型: 支持各种 HuggingFace Transformers 模型,包括 LLaMA, Mistral, Falcon, MPT 等流行模型。
  • 易于使用: 提供简单易用的 API,可以轻松集成到你的应用中。
  • 灵活部署: 支持多种部署方式,包括单机、多卡、多节点等。

二、vLLM 的核心技术:PagedAttention

vLLM 之所以如此高效,关键在于它采用了 PagedAttention 算法。在介绍 PagedAttention 之前,我们先来回顾一下传统的注意力机制 (Attention)。

1. 传统 Attention 的内存瓶颈

在传统的 Attention 机制中,每个 token 的键 (Key) 和值 (Value) 向量都需要连续存储在显存中。随着序列长度的增加,KV 缓存 (Key-Value Cache) 的大小也会线性增长,最终可能导致显存不足 (OOM)。

问题所在:

  • 内存碎片: 由于请求的长度不同,KV 缓存中会产生大量的内存碎片,降低显存利用率。
  • 内存浪费: 即使是同一个请求,不同 token 的 KV 缓存大小也可能不同,例如 masked 的 token 只需要很少的内存,而传统 Attention 仍然会为它们分配与其他 token 相同大小的内存。

2. PagedAttention:分页机制,解决内存难题

PagedAttention 借鉴了操作系统中虚拟内存分页的思想,将每个请求的 KV 缓存分成多个块 (Block),每个块可以存储固定数量的 token 的键和值。这些块不需要在连续的内存空间中,可以像分页一样按需分配。

PagedAttention 的优势:

  • 减少内存碎片: 通过分页机制,可以有效减少内存碎片,提高显存利用率。
  • 动态分配内存: 根据实际需要分配内存,避免内存浪费。
  • 支持更长的序列: 由于减少了内存占用,PagedAttention 可以支持更长的序列推理。
  • 高效的内存共享: 类似于操作系统的 Copy-on-Write 机制,PagedAttention 可以在不同请求之间共享内存块,例如对于并行的采样请求,其共享相同的 Prompt 部分的 KV 缓存,那么就可以共享最前面 Prompt 部分的 Block。

通俗理解:

想象一下,你有一本书 (LLM),这本书有很多页 (Block)。传统的 Attention 机制要求你把这本书的所有页都平铺在一张桌子上 (连续的显存空间),这样会占用很大的空间,而且不方便查找。

PagedAttention 则允许你将这本书分成不同的章节 (Block),并将这些章节分别放到不同的抽屉里 (非连续的显存空间)。当你需要阅读某个章节时,只需要打开对应的抽屉即可。

三、vLLM 的安装和使用

1. 安装

pip install vllm

2. 使用 vLLM 进行离线推理 (Offline Inference)

离线推理指的是一次性处理一批输入,并生成所有输出。

from vllm import LLM, SamplingParams# 准备输入 prompts
prompts = ["Hello, my name is","The capital of France is","The future of AI is",
]# 定义采样参数
sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=64)# 初始化 LLM
llm = LLM(model="facebook/opt-125m")  # 可以替换成你想要使用的模型,支持大部分 HuggingFace 模型,比如 mistralai/Mistral-7B-v0.1,meta-llama/Llama-2-7b-hf 等# 生成文本
outputs = llm.generate(prompts, sampling_params)# 打印输出
for output in outputs:prompt = output.promptgenerated_text = output.outputs[0].textprint(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

代码解释:

  1. 我们使用 vllm 库来进行推理。
  2. prompts 变量存储了多个输入 prompt。
  3. sampling_params 变量定义了采样参数,例如 temperaturetop_p 用于控制生成文本的多样性,max_tokens 控制生成文本的最大长度。
  4. 我们使用 LLM 类初始化一个 LLM 对象,并指定要使用的模型。
  5. 我们调用 llm.generate() 方法生成文本。
  6. 最后,我们打印每个 prompt 和生成的文本。

3. 使用 vLLM 进行在线推理 (Online Inference / Serving)

在线推理指的是搭建一个服务,实时处理请求并生成输出。

启动 OpenAI 兼容的 API 服务:

python -m vllm.entrypoints.openai.api_server --model facebook/opt-125m # 指定模型

使用 curl 命令发送请求:

curl http://localhost:8000/v1/completions \-H "Content-Type: application/json" \-d '{"model": "facebook/opt-125m","prompt": "The capital of France is","max_tokens": 64,"temperature": 0.8}'

使用 Python 的 openai 库发送请求:

import openaiopenai.api_base = "http://localhost:8000/v1" # API 地址
openai.api_key = "EMPTY"  # 不需要 API 密钥response = openai.Completion.create(model="facebook/opt-125m",prompt="The capital of France is",max_tokens=64,temperature=0.8,
)print(response.choices[0].text)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/68445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ollama+DeepSeek本地大模型部署

1、Ollama 官网:https://ollama.com/ Ollama可以干什么? 可以快速在本地部署和管理各种大语言模型,操作命令和dokcer类似。 mac安装ollama: # 安装ollama brew install ollama# 启动ollama服务(默认11434端口&#xf…

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)

Understanding Diffusion Models: A Unified Perspective(三) 文章概括 文章概括 引用: article{luo2022understanding,title{Understanding diffusion models: A unified perspective},author{Luo, Calvin},journal{arXiv preprint arXiv:…

mybatis(104/134)

动态sql标签,用于选择查询 if标签 where标签 :自动生成where,取决于后面有没有条件,会自动去除条件前面的and和or,不会去除语句后面的 trim标签:自动生成where,在语句后自动去除后缀and和or for…

【数据结构】动态内存管理函数

动态内存管理 为什么存在动态内存管理动态内存函数的介绍🎊malloc补充:perror函数🎊free🎊calloc🎊realloc 常见动态内存错误对空指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一…

在FreeBSD下安装Ollama并体验DeepSeek r1大模型

在FreeBSD下安装Ollama并体验DeepSeek r1大模型 在FreeBSD下安装Ollama 直接使用pkg安装即可: sudo pkg install ollama 安装完成后,提示: You installed ollama: the AI model runner. To run ollama, plese open 2 terminals. 1. In t…

C++类和对象下详细指南

C类和对象下详细指南 1. 初始化列表与构造函数 1.1 初始化列表概述 初始化列表在C中用于初始化对象的成员变量,特别是当你需要在对象构造时就明确成员变量的值时。通过初始化列表,成员变量的初始化可以在进入构造函数体之前完成。这不仅可以提升性能&…

文档智能扫描,提升无纸化办公效率

随着无纸化办公的推广和移动设备的普及,用户迫切需要将纸质文档快速、准确地转换成电子格式,以提高工作效率和信息管理的便捷性。同时,用户将文档扫描成电子版后,可以自行通过加密和访问控制提高电子文档的安全性,以满…

汇编的使用总结

一、汇编的组成 1、汇编指令(指令集) 数据处理指令: 数据搬移指令 数据移位指令 位运算指令 算术运算指令 比较指令 跳转指令 内存读写指令 状态寄存器传送指令 异常产生指令等 2、伪指令 不是汇编指令,但是可以起到指令的作用,伪…

【玩转全栈】----Django模板的继承

先赞后看,养成习惯!!! 目录 模板继承的好处 模板继承的语法规则 更新代码 上文中的部门管理页面: 【玩转全栈】----Django制作部门管理页面-CSDN博客 大家会发现,由于定义了多个html文件,多个ht…

nosql mysql的区别

NoSQL 和 MySQL 是两种不同类型的数据库管理系统,它们在设计理念、数据模型、可扩展性和应用场景等方面有着本质的区别。 NoSQL 数据库 特点: 灵活的数据模型: NoSQL 数据库通常没有固定的表结构,可以很容易地存储不同结构的文档或键值对。水平扩展: …

python实现dbscan

python实现dbscan 原理 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形…

Lustre Core 语法 - 比较表达式

概述 Lustre v6 中的 Lustre Core 部分支持的表达式种类中&#xff0c;支持比较表达式。相关的表达式包括 , <>, <, >, <, >。 相应的文法定义为 Expression :: Expression Expression | Expression <> Expression | Expression < Expression |…

gesp(C++六级)(4)洛谷:B3874:[GESP202309 六级] 小杨的握手问题

gesp(C六级)&#xff08;4&#xff09;洛谷&#xff1a;B3874&#xff1a;[GESP202309 六级] 小杨的握手问题 题目描述 小杨的班级里共有 N N N 名同学&#xff0c;学号从 0 0 0 至 N − 1 N-1 N−1。 某节课上&#xff0c;老师安排全班同学进行一次握手游戏&#xff0c;具…

【自然语言处理(NLP)】机器翻译之数据处理(数据收集、数据清洗、数据分词、数据标注、数据划分)

文章目录 介绍机器翻译之数据处理数据收集数据清洗数据分词数据标注数据划分代码实现导包数据查看处理函数数据预处理词元化统计每句话的长度的分布情况截断或者填充文本序列将机器翻译的文本序列转换成小批量tensor加载数据试用一下 个人主页&#xff1a;道友老李 欢迎加入社区…

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR、流水线及伪指令

文章目录 指令格式&#xff08;重点&#xff09;1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…

过年之无用知识研究:std::is_assignable到底怎么个事?

下面是gcc的std::is_assignable相关源码&#xff1a;template<typename _Tp, typename _Up>class __is_assignable_helper{template< typename _Tp1, typename _Up1,typename decltype(declval<_Tp1>() declval<_Up1>()) //注意这行 >static true_ty…

单链表算法实战:解锁数据结构核心谜题——链表的回文结构

题目如下&#xff1a; 解题过程如下&#xff1a; 回文结构举例&#xff1a; 回文数字&#xff1a;12521、12321、1221…… 回文字符串&#xff1a;“abcba”、“abba”…… 并不是所有的循环嵌套的时间复杂度都是O(n^2) 可以用C写C程序&#xff1a; C里可以直接使用ListNode…

C++ 包装器与绑定器的应用之回调函数的实现

回调函数的实现 在消息队列和网络库的框架中&#xff0c;当接收到消息&#xff08;报文&#xff09;时&#xff0c;回调用户自定义的函数对象&#xff0c;把消息&#xff08;报文&#xff09;参数传给它&#xff0c;由它决定如何处理。 queue参考文章:C queue(STL queue&…

除了layui.js还有什么比较好的纯JS组件WEB UI?在谷歌浏览上显示

以下是一些比较好的纯JS组件WEB UI&#xff0c;可以在谷歌浏览器上良好显示&#xff1a; 1. Sencha 特点&#xff1a;提供超过140个高性能UI组件&#xff0c;用于构建现代应用程序。支持与Angular和React集成&#xff0c;提供企业级网格解决方案。 适用场景&#xff1a;适用于…

计算机网络 (58)无线局域网WLAN

前言 无线局域网WLAN&#xff08;Wireless Local Area Network&#xff09;是一种利用无线通信技术将计算机设备互联起来&#xff0c;构成可以互相通信和实现资源共享的网络体系。 一、定义与特点 定义&#xff1a; WLAN通过无线信道代替有线传输介质连接两个或多个设备形成一个…