【大模型推理】vLLM 源码学习

强烈推荐
https://zhuanlan.zhihu.com/p/680153425
在这里插入图片描述

sequnceGroup 存储了相同的prompt对应的不同的sequence, 所以用字典存储
同一个Sequence可能占据多个逻辑Block, 所以在Sequence 中用列表存储
同一个block 要维护tokens_id 列表, 需要添加操作。 还需要判断block 是否还有空位可以放置tokens.
在这里插入图片描述

# https://github.com/vllm-project/vllm/tree/v0.2.7/vllm/core/scheduler.py
class Scheduler:def _schedule(self) -> SchedulerOutputs:...if not self.swapped:...while self.waiting:...seq_group = self.waiting.pop(0)self._allocate(seq_group)self.running.append(seq_group)num_curr_seqs += num_new_seqsscheduled.append(seq_group)......return scheduler_outputsdef _allocate(self, seq_group: SequenceGroup) -> None:# 调用 block manager 的 allocate 方法分配 physical token blockself.block_manager.allocate(seq_group)# 将 sequence 的状态设置为 RUNNING,即将要被处理for seq in seq_group.get_seqs(status=SequenceStatus.WAITING):seq.status = SequenceStatus.RUNNING# https://github.com/vllm-project/vllm/tree/v0.2.7/vllm/core/block_manager.py
class BlockSpaceManager:def allocate(self, seq_group: SequenceGroup) -> None:# NOTE: Here we assume that all sequences in the group have the same# prompt.seq = seq_group.get_seqs(status=SequenceStatus.WAITING)[0]# 为请求的 prompt token 分配 physical token blockblock_table: BlockTable = []for logical_idx in range(len(seq.logical_token_blocks)):if (self.block_sliding_window is not Noneand logical_idx >= self.block_sliding_window):block = block_table[logical_idx % self.block_sliding_window]else:block = self.gpu_allocator.allocate()#  设置 block 的引用数,copy on write 机制会用到block.ref_count = seq_group.num_seqs()block_table.append(block)# Assign the block table for each sequence.for seq in seq_group.get_seqs(status=SequenceStatus.WAITING):self.block_tables[seq.seq_id] = block_table.copy()

结合上图代码, 对于seq_group 中所有的 seq 分配了相同的block_table( 逻辑块对应的物理块), 因此说明seq_group 中所有的seq 是相同的内容, 即 # NOTE: Here we assume that all sequences in the group have the same prompt.

上面函数只是分配好了逻辑空间与物理block空间,下面函数append_slot将新的token 加入到block 的一个slot 时,可能引发copy on write

scheduler 的_append_slot方法:
# https://github.com/vllm-project/vllm/tree/v0.2.7/vllm/core/scheduler.py
class Scheduler:def _append_slot(self,seq_group: SequenceGroup,blocks_to_copy: Dict[int, List[int]],) -> None:for seq in seq_group.get_seqs(status=SequenceStatus.RUNNING):ret = self.block_manager.append_slot(seq)if ret is not None:# copy on write 机制src_block, dst_block = retif src_block in blocks_to_copy:blocks_to_copy[src_block].append(dst_block)else:blocks_to_copy[src_block] = [dst_block]# https://github.com/vllm-project/vllm/tree/v0.2.7/vllm/core/block_manager.py
class BlockSpaceManager:def append_slot(self, seq: Sequence) -> Optional[Tuple[int, int]]:"""Allocate a physical slot for a new token."""logical_blocks = seq.logical_token_blocksblock_table = self.block_tables[seq.seq_id]if len(block_table) < len(logical_blocks):if (self.block_sliding_windowand len(block_table) >= self.block_sliding_window):# re-use a blockblock_table.append(block_table[len(block_table) %self.block_sliding_window])else:# sequence 有新的 logical token block# 所以这里也要分配一个新的 physical token blockblock = self.gpu_allocator.allocate()block_table.append(block)return None# We want to append the token to the last physical block.last_block = block_table[-1]assert last_block.device == Device.GPUif last_block.ref_count == 1:# Not shared with other sequences. Appendable.return Noneelse:# The last block is shared with other sequences.# Copy on Write: Allocate a new block and copy the tokens.new_block = self.gpu_allocator.allocate()block_table[-1] = new_blockself.gpu_allocator.free(last_block)return last_block.block_number, new_block.block_number

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

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

相关文章

核心速览12

研究背景 研究问题&#xff1a;这篇文章探讨了多模态人工智能&#xff08;Agent AI&#xff09;系统在理解和响应视觉和语言输入方面的潜力&#xff0c;特别是在物理和虚拟环境中的应用。Agent AI旨在通过感知和行动来增强人工智能系统的交互性和适应性。研究难点&#xff1a;…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…

笔记记录 k8s-install

master节点安装: yum upgrade -y 更新系统 yum update -y 升级内核 ifconfig ens33 关闭swap swapoff -a (临时) vim /etc/fstab (永久) #/dev/mapper/cl-swap swap swap defaults 0 0 vim /etc/sysctl.conf vm.swappin…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

若依springboot 删除一直转 问题处理

src\main\resources\static\ruoyi\js\ry-ui.js submit方法1578行添加 $.operate.successCallback(result); 在线体验 admin/admin123陆陆续续收到一些打赏&#xff0c;为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 演示地址&#xff1a;http://ruoyi.vip 文档地址…

el-table最大高度无法滚动

解决el-table同时使用fixed和计算的最大高度时固定右边的列无法跟随滚动的问题 原因&#xff1a;el-table组件会根据传入的 max-height 计算表格内容部分 和 fixed部分的最大高度&#xff0c;以此来生成滚动条和产生滚动效果&#xff0c;当传入的 max-height 为一个计算的高度…

面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案

引言&#xff1a; 随着科技的飞速发展&#xff0c;智能视觉IoT已成为科技领域的热门话题&#xff0c;为智能家居、智慧城市等领域带来新机遇。然而&#xff0c;物联网市场的碎片化特性对智能视觉芯片设计构成挑战。同时&#xff0c;汽车行业正经历技术驱动的变革&#xff0c;软…

Multiple instance learning with graph neural networks文献笔记

基本信息 文章链接&#xff1a;[1906.04881] Multiple instance learning with graph neural networks 将每个包视为一个图&#xff0c;利用GNN学习包的嵌入&#xff0c;以探索包中实例之间有用的结构信息。最终的图表示被送入分类器进行标签预测。 具体方法 输入&#xff…

从0开始学习机器学习--Day32--推荐系统作业

题目&#xff1a;给用户推荐电影 代码&#xff1a; import numpy as np import matplotlib.pyplot as plt import scipy.io as sio from scipy.optimize import minimize def serialize(X, theta):# 序列化&#xff0c;因为后续优化方法对参数的要求为一维return np.append(X…

Elasticsearch是如何实现Master选举的?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch是如何实现Master选举的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch是如何实现Master选举的&#xff1f; Elasticsearch 使用 Zen Discovery 插件&#xff08;在较新的版本中是基于 Zen2&…

WEB-通用漏洞SQL注入CTF二次堆叠DNS带外

知识点&#xff1a; 1、数据库堆叠注入 根据数据库类型决定是否支持多条语句执行 数据库支持多条语句执行就是堆叠&#xff0c;如&#xff1a; 2、数据库二次注入 应用功能逻辑涉及上导致的先写入后组合的注入 3、数据库Dnslog注入 解决不回显&#xff08;反向连接&#…

上生产时连接mysql数据库总是被拒绝

背景&#xff1a; 本地项目连接数据正常 测试环境也正常 到生产上就一直报错 且生产上使用mysql连接工具可以正常连接 报错信息&#xff1a;Connections refused: connect 调查&#xff1a; 数据库版本&#xff1a; 本地 mysql5.7.24 测试 8.3 生产5.7.36 连接驱动&#xf…

20241121买深圳保障房还是租保租房小思考?

1. 我的买深圳保障房或租保租房的出发点&#xff1f; 我的需求&#xff1a;主要是小孩读书 如果买深圳保障房例如人才房和安居房&#xff0c;会有购房合同&#xff0c;则读书积分等同有红本积分&#xff0c;相当于可以选择一些不错的公办学校 如果租保租房&#xff0c;由于查…

Qt打开文件对话框选择文件之后弹出两次

项目场景&#xff1a; 在 Qt 中&#xff0c;使用 ui 自动生成的 UI 文件会为每个控件自动生成一些默认的槽函数。如果您手动创建的槽函数名称与这些自动生成的槽函数名称相同&#xff0c;就会导致信号被多次连接&#xff0c;从而引发多次弹出文件对话框的问题。 原因分析&…

4. SQL视图

MySQL中的视图&#xff08;View&#xff09;是一种虚拟表&#xff0c;本质是存储了一条SELECT语句。视图并不直接存储数据&#xff0c;而是动态生成结果集&#xff0c;帮助开发者简化查询逻辑和增强数据安全性。本文将从视图的基础概念到实际应用&#xff0c;逐步深入地探讨如何…

从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发

从繁琐到优雅&#xff1a;用 PyTorch Lightning 简化深度学习项目开发 在深度学习开发中&#xff0c;尤其是使用 PyTorch 时&#xff0c;我们常常需要编写大量样板代码来管理训练循环、验证流程和模型保存等任务。PyTorch Lightning 作为 PyTorch 的高级封装库&#xff0c;帮助…

鸿蒙生态崛起

1.鸿蒙生态&#xff1a;开发者的新蓝海 从开发者角度看&#xff0c;鸿蒙生态带来了巨大机遇。其分布式能力实现了不同设备间的无缝体验&#xff0c;如多屏协同&#xff0c;让应用能跨手机、平板、智能穿戴和车载设备流畅运行。开发工具也有显著提升&#xff0c;方舟编译器等极大…

使用Python3实现Gitee码云自动化发布

仓库信息 https://gitee.com/liumou_site/ip 实现代码 import osimport requests from loguru import loggerdef gitee(ver, message, prerelease: bool False):"""在 Gitee 上创建发布版本:param ver: 版本号:param message: 发布信息:param prerelease: 是…

找不同异或

给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t 由字符串 s 随机重排&#xff0c;然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 输入&#xff1a;s "abcd", t "abcde" 输出&#xff1a;"e" 解释&#xff…

第75期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…