当前位置: 首页 > news >正文

【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)

相关文章:

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

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

16.Word:石油化工设备技术❗【28】

目录 题目 NO1.2 NO3 NO4 题目 NO1.2 F12:另存为将“Word素材.docx”文件另存为“Word. docx”(“docx”为文件扩展名) 光标来到表格上方→插入→形状→新建画布→单击选中→格式→高度/宽度(格式→大小对话框→取消勾选✔锁定…...

《多阶段渐进式图像修复》学习笔记

paper:2102.02808 GitHub:swz30/MPRNet: [CVPR 2021] Multi-Stage Progressive Image Restoration. SOTA results for Image deblurring, deraining, and denoising. 目录 摘要 1、介绍 2、相关工作 2.1 单阶段方法 2.2 多阶段方法 2.3 注意力机…...

Oracle、PostgreSQL该学哪一个?

从事数据库运维一线工作的老鸟,经常会有人来问我:“Oracle 和 PostgreSQL,我该学哪个?哪个更有职业发展前景?” 今天就来和大家好好唠唠。 先说说 Oracle。它堪称数据库领域的 “老牌贵族”,功能极其强大。…...

SpringCloud系列教程:微服务的未来(十七)监听Nacos配置变更、更新路由、实现动态路由

前言 在微服务架构中,API 网关是各个服务之间的入口点,承担着路由、负载均衡、安全认证等重要功能。为了实现动态的路由配置管理,通常需要通过中心化的配置管理系统来实现灵活的路由更新,而无需重启网关服务。Nacos 作为一个开源…...

第十六届蓝桥杯大赛软件赛(编程类)知识点大纲

目录 大学 C 组 大学 B 组 研究生及大学 A 组 说明: 大学 C 组 1. 枚举:难度:[1-3] 2. 排序 冒泡排序:难度 2选择排序:难度 3插入排序:难度 3 3. 搜索 广度优先搜索(BFS)&a…...

商品信息管理自动化测试

目录 前言 一、思维导图 二、代码编写 1.在pom.xml文件中添加相关依赖 2.自动化代码编写 三、代码测试 小结 前言 1. 针对商品信息管理项目进行测试,商品信息管理项目主要有商品列表页、部门列表页、员工列表页,主要功能:对商品信息的…...

批量卸载fnm中已经安装的所有版本

直接上代码 fnm list | awk -F NR>1 {print line} {line$2} | xargs -n 1 -I {} fnm uninstall {}原理 fnm list 列出 fnm 中所有已经安装的 node 版本 awk -F NR>1 {print line} {line$2} 以空格分隔-F {line$2},取从左到右第 2 段(v22.11…...

有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

# 分析:兔子从第三个月起增加一对,前两个月1对,三月份2对,4月份3对,5月份5对,6月份8对,7月份13个,以此类推每个月的兔子总数是前两月的兔子数的和。 def fibonacci(n): # 定义了斐波…...

ReactNative react-devtools 夜神模拟器连调

目录 一、安装react-devtools 二、在package.json中配置启动项 三、联动 一、安装react-devtools yarn add react-devtools5.3.1 -D 这里选择5.3.1版本,因为高版本可能与夜神模拟器无法联动,导致部分功能无法正常使用。 二、在package.json中配置启…...

【Unity教程】零基础带你从小白到超神part3

粒子系统 在创建粒子系统之前,需要先添加一些粒子样式,这可以在资源商店中通过导入官方提供的StandardAssets资源包得到。完成资源的导入后,该资源包中的StandardAssets>ParticleSystems>Prefabs文件夹下包含多种成品粒子效果&#xf…...

[Java]快速入门

java是什么 Java是美国的sun 公司(Stanford University Network)在1995年推出的一门计算机高级编程语言 sun公司于2009年被Oracle(甲骨文)公司收购。 普遍认同lava的联合创始人之一: 詹姆斯高斯林(James Gosling)为Java之父。 Java是世界上最流行的编程语言之一,…...

慕课:若鱼1919的视频课程:Java秒杀系统方案优化 高性能高并发实战,启动文档

代码: Javahhhh/miaosha191: 运行成功了慕课若鱼1919的视频课程:Java秒杀系统方案优化 高性能高并发实战https://github.com/Javahhhh/miaosha191 https://github.com/Javahhhh/miaosha191 miaosha项目启动文档 需安装的配置环境: VMwar…...

stack 和 queue容器的介绍和使用

1.stack的介绍 1.1stack容器的介绍 stack容器的基本特征和功能我们在数据结构篇就已经详细介绍了,还不了解的uu, 可以移步去看这篇博客哟: 数据结构-栈数据结构-队列 简单回顾一下,重要的概念其实就是后进先出,栈在…...

Kafka的内部通信协议

引言 kafka内部用到的常见协议和优缺点可以看看原文 Kafka用到的协议 本文奖详细探究kafka核心通信协议和高性能的关键 网络层通信的实现 基于 Java NIO:Kafka 的网络通信层主要基于 Java NIO 来实现,这使得它能够高效地处理大量的连接和数据传输。…...

【论文投稿-第八届智能制造与自动化学术会议(IMA 2025)】HTML, CSS, JavaScript:三者的联系与区别

大会官网:www.icamima.org 目录 前言 一、HTML(超文本标记语言):网页的骨架 HTML 的作用: 例子: 总结: 二、CSS(层叠样式表):网页的外观设计 CSS 的…...

解锁豆瓣高清海报:深度爬虫与requests进阶之路

前瞻 PosterBandit 这个脚本能够根据用户指定的日期,爬取你看过的影视最高清的海报,并自动拼接成指定大小的长图。 你是否发现直接从豆瓣爬取下来的海报清晰度很低? 使用 .pic .nbg img CSS 选择器,在 我看过的影视 界面找到图片…...

大数据治理实战:架构、方法与最佳实践

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 大数据治理是确保数据质量、合规性和安全性的重要手段,尤其在数据驱动决策和人工智能应用日益普及的背景下&…...

03链表+栈+队列(D1_链表(D1_基础学习))

目录 一、什么是链表 二、基本操作 三、为什么要使用链表 四、为什么能够在常数时间访问数组元素 数组优点 数组缺点 五、动态数组诞生 链表优点 链表缺点 六、链表、数组和动态数组的对比 七、 链表种类 1. 单向链表 2. 双向链表 3. 循环链表 八、链表衍生 ...…...

芯片AI深度实战:进阶篇之vim内verilog实时自定义检视

本文基于Editor Integration | ast-grep,以及coc.nvim,并基于以下verilog parser(my-language.so,文末下载链接), 可以在vim中实时显示自定义的verilog 匹配。效果图如下: 需要的配置如下: 系列文章: 芯片…...

【计算机网络】host文件

host文件的主要功能: 域名解析 本地映射:host文件的主要功能是将**域名映射到相应的 IP 地址**。当计算机需要访问一个网站或服务时,它会首先在 host文件中查找该域名对应的 IP 地址。如果在 host文件中找到了匹配的域名和 IP 地址映射&…...

算法随笔_31:移动零

上一篇:算法随笔_30: 去除重复字母-CSDN博客 题目描述如下: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,…...

知识图谱的动态演化与进化策略

目录 前言1. 数据补充与更新策略1.1 数据源扩展1.2 实体与关系更新1.3 流数据处理 2. 数据质量保障与清洗2.1 数据清洗2.2 数据融合2.3 质量评估 3. 规则与模型优化3.1 规则学习与优化3.2 模型更新3.3 推理能力增强 4. 知识验证与反馈机制4.1 用户反馈机制4.2 知识验证机制 5. …...

C ++ 1

静态变量和全局变量、局部变量的区别、在内存上是怎么分布的 静态局部变量 ● 特点: ○ 作用域:仅限于声明它们的函数或代码块内部。 ○ 生命周期:静态局部变量在程序的整个运行期间都存在,只初始化一次(在第一次使用…...

mybatis(134/134)完结

一级缓存(默认情况下开启)同一个sqlsession中执行相同的查询语句走一级缓存 二级缓存 :同一个sqlsessionfactory,sqlsession关闭了才会将一级缓存提交到二级缓存中 外部编写的缓存 PageHelper插件:方便进行分页&#x…...

SQL注入漏洞之错误类型注入 爆破表 字段 列名称 以及mysql版本 以及Limit使用方式解释 以及靶场相关联系

目录 Msql函数常用函数 基本变量函数 报错注入 报错注入什么时候用? 报错注入函数 报错注入语句-这是重点 报错性注入实战 案例1 爆数据库中的表 案例2 表名称 案例3 表字段 Limit用法解释: Msql函数常用函数 基于msql的基本变量可以学习常用函数是为了…...

k均值聚类将数据分成多个簇

K-Means 聚类并将数据分成多个簇,可以使用以下方法: 实现思路 随机初始化 K 个聚类中心计算每个点到聚类中心的距离将点分配到最近的簇更新聚类中心重复上述过程直到收敛 完整代码: import torch import matplotlib.pyplot as pltdef kme…...

智能工厂能耗管理:Python助力节能增效

智能工厂能耗管理:Python助力节能增效 在工业4.0时代,工厂能耗管理已成为制造企业降本增效的重要一环。传统的能耗管理方式往往依赖人工统计和经验决策,导致能源浪费严重。而借助人工智能与Python的强大能力,我们可以实现智能化、数据驱动的能耗优化方案。今天,我们就来聊…...

【汽车电子架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子架构:AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风,从概念与定义入手,希望读者能对AutoSAR架构有一个整体的认识,然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…...

【go语言】指针

一、指针的定义和使用 在 Go 语言中,指针是一种变量,用来存储另一个变量的内存地址。通过指针,我们可以间接地操作其他变量的值。Go 语言中的指针与其他语言(如 C 或 C)的指针有所不同,它不支持指针算术&am…...

宝塔面板SSL加密访问设置教程

参考:https://www.bt.cn/bbs/thread-117246-1-1.html 如何快速使用证书加密访问面板 因早期默认未开启https访问所以没有相关的风险提醒,现面板默认已开启https加密访问、提升安全性 由于采用的是服务器内部本身签发证书,不被公网浏览器信任请参考以下步…...

spring中解决循环依赖的方法

为了避免这种循环依赖问题,Spring 引入了三级缓存的机制,分为: 一级缓存(singletonObjects):这是存放已经完全创建好的单例 Bean 的缓存。当 Bean 完全初始化并且可以被使用时,会存放在这里。 …...

新时代架构SpringBoot+Vue的理解(含axios/ajax)

文章目录 引言SpringBootThymeleafVueSpringBootSpringBootVue(前端)axios/ajaxVue作用响应式动态绑定单页面应用SPA前端路由 前端路由URL和后端API URL的区别前端路由的数据从哪里来的 Vue和只用三件套axios区别 引言 我是一个喜欢知其然又知其所以然的…...

Docker/K8S

文章目录 项目地址一、Docker1.1 创建一个Node服务image1.2 volume1.3 网络1.4 docker compose 二、K8S2.1 集群组成2.2 Pod1. 如何使用Pod(1) 运行一个pod(2) 运行多个pod 2.3 pod的生命周期2.4 pod中的容器1. 容器的生命周期2. 生命周期的回调3. 容器重启策略4. 自定义容器启…...

新年快乐!给大家带来了一份 python 烟花代码!

大家好,我是菲英。 今天带来一份 python 代码,是简易的烟花小程序。 安装包 pip install pygame进入正题 - 我们的烟花代码: import pygame import random import math# 初始化pygame pygame.init()# 设置屏幕大小和标题 screen pygame.…...

iperf 测 TCP 和 UDP 网络吞吐量

注:本文为 “iperf 测网络吞吐量” 相关文章合辑。 未整理去重。 使用 iperf3 监测网络吞吐量 Tom 王 2019-12-21 22:23:52 一 iperf3 介绍 (1.1) iperf3 是一个网络带宽测试工具,iperf3 可以擦拭 TCP 和 UDP 带宽质量。iperf3 可以测量最大 TCP 带宽…...

(1)Linux高级命令简介

Linux高级命令简介 在安装好linux环境以后第一件事情就是去学习一些linux的基本指令,我在这里用的是CentOS7作演示。 首先在VirtualBox上装好Linux以后,启动我们的linux,输入账号密码以后学习第一个指令 简介 Linux高级命令简介ip addrtou…...

LeetCode:96.不同的二叉搜索树

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:96.不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉…...

Linux学习笔记——用户管理

一、用户管理命令 useradd #用户增加命令 usermod #用户修改命令 passwd #密码修改命令 userdel #用户删除命令 su #用户提权命令 1、useradd命令(加用户): 创建并设置用户信息,使用us…...

Baklib揭示内容中台与人工智能技术的创新协同效应

内容概要 在当今信息爆炸的时代,内容的高效生产与分发已成为各行业竞争的关键。内容中台与人工智能技术的结合,为企业提供了一种新颖的解决方案,使得内容创造的流程更加智能化和高效化。 内容中台作为信息流动的核心,能够集中管…...

FreeRTOS从入门到精通 第十四章(队列集)

参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、队列集简介 1、队列集概述 (1)一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以…...

Python实现U盘数据自动拷贝

功能:当电脑上有U盘插入时,自动复制U盘内的所有内容 主要特点: 1、使用PyQt5创建图形界面,但默认隐藏 2、通过CtrlAltU组合键可以显示/隐藏界面 3、自动添加到Windows启动项 4、监控USB设备插入 5、按修改时间排序复制文件 6、静…...

Vue.js 什么是 Composition API?

Vue.js 什么是 Composition API? 今天我们来聊聊 Vue 3 引入的一个重要特性:组合式 API(Composition API)。如果你曾在开发复杂的 Vue 组件时感到代码难以维护,那么组合式 API 可能正是你需要的工具。 什么是组合式 …...

关于产品和技术架构的思索

技术架构或者设计应该和产品设计分离,但是又不应该和产品架构独立。 听起来非常的绕并且难以理解。 下面我们用一个例子来解读这两者的关系 产品(族谱图) 如果把人类当作产品,那设计师应该是按照上面设计的(当然是正常的伦理道德)…...

Python设计模式 - 组合模式

定义 组合模式(Composite Pattern) 是一种结构型设计模式,主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象,从而简化了客户端代码。 组合模式有透明组合…...

蓝桥杯模拟算法:蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组,这种问题就可以迎刃而解了 比如我们是4的话,我们从左向右开始存,1,2,3,4 到5的时候y就大于4了就是越界了&…...

24_游戏启动逻辑梳理总结

首先这个项目从游戏根入口GameRoot.cs的初始化开始 分为 服务层初始化Svc.cs 与 业务系统层初始化Sys.cs 而服务层 分为 资源加载服务层ResSvc.cs 与 音乐播放服务层AudioSvc.cs 而在 资源加载服务层ResSvc.cs中 初始化了 名字的 配置文件 而音乐播放服务层AudioSvc.cs 暂时没…...

TikTok 推出了一款 IDE,用于快速构建 AI 应用

字节跳动(TikTok 的母公司)刚刚推出了一款名为 Trae 的新集成开发环境(IDE)。 Trae 基于 Visual Studio Code(VS Code)构建,继承了这个熟悉的平台,并加入了 AI 工具,帮助开发者更快、更轻松地构建应用——有时甚至无需编写任何代码。 如果你之前使用过 Cursor AI,T…...

如何运用python爬虫爬取百度贴吧动态加载的图片?

动态加载的图片通常是在页面加载后通过JavaScript异步请求获取的,而requests和BeautifulSoup只能获取页面的初始HTML内容,无法执行JavaScript代码。 要处理动态加载的图片,可以使用以下方法: 1. 使用Selenium Selenium是一个用…...

在Rust应用中访问.ini格式的配置文件

在Rust应用中访问.ini格式的配置文件,你可以使用第三方库,比如 ini 或 config. 下面是一个使用 ini 库的示例,该库允许你读取和解析.ini文件。 使用 ini 库 添加依赖 首先,你需要在你的 Cargo.toml 文件中添加 ini 库的依赖&am…...