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

news/2024/11/25 2:53:08/

强烈推荐
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.ppmy.cn/news/1549703.html

相关文章

白蚁自动化监测系统的装置和优势

一、背景 在当今社会&#xff0c;随着科技的飞速发展&#xff0c;智能化、自动化技术在各个领域的应用日益广泛&#xff0c;白蚁自动化监测系统作为一种高效、精准的白蚁防控手段&#xff0c;正逐步成为行业内的主流趋势&#xff0c;既是文物古建水利堤坝等预防性保护的要求&a…

哈希表(极速学习版)

哈希表的定义与实现 概述 哈希表是一种高效的数据结构&#xff0c;它提供了快速的数据插入、删除和查找操作。 通过使用哈希函数&#xff0c;哈希表将输入的键映射到一个指定位置&#xff08;索引&#xff09;以快速访问存储在该位置的值。 哈希表通常用于实现字典、集合、…

SpringCloud框架学习(第五部分:SpringCloud Alibaba入门和 nacos)

目录 十二、SpringCloud Alibaba入门简介 1. 基本介绍 2.作用 3.版本选型 十三、 SpringCloud Alibaba Nacos服务注册和配置中心 1.简介 2.各种注册中心比较 3.下载安装 4.Nacos Discovery服务注册中心 &#xff08;1&#xff09; 基于 Nacos 的服务提供者 &#xf…

Django项目 | 实现登录注册验证电子邮箱

在实现登录验证电子邮箱时&#xff0c;需要确保模型中包含电子邮箱字段 自定义用户模型登录验证电子邮箱实现 1. 模型&#xff08;Model&#xff09; 确保自定义用户模型中包含电子邮箱字段。例如&#xff1a; from django.contrib.auth.models import AbstractUser from d…

数字赋能,气象引领 | 气象景观数字化服务平台重塑京城旅游生态

在数字化转型的浪潮中&#xff0c;旅游行业正以前所未有的速度重塑自身&#xff0c;人民群众对于高品质、个性化旅游服务需求的日益增长&#xff0c;迎着新时代的挑战与机遇&#xff0c;为开展北京地区特色气象景观预报&#xff0c;打造“生态气象旅游”新业态&#xff0c;助推…

Linux进阶:环境变量

环境变量是一组信息记录&#xff0c;类型是KeyValue型&#xff08;名值&#xff09;&#xff0c;用于操作系统运行的时候记录关键信息. env命令&#xff1a;查看系统全部的环境变量 语法&#xff1a;env $符号&#xff1a;取出指定的环境变量的值 语法&#xff1a;$变量名 …

unity3d——基础篇2刷(三角函数练习题)

1. 移动速度和变化速度 面朝向移动速度 (moveSpeed): 控制对象沿其当前朝向&#xff08;通常是摄像机方向&#xff09;的移动速度。左右曲线移动变化的速度 (changeSpeed): 控制对象左右移动速度的变化频率。 2. 移动距离控制 左右曲线移动距离控制 (changeSize): 控制对象左…

unity中:超低入门级显卡、集显(功耗30W以下)运行unity URP管线输出的webgl程序有那些地方可以大幅优化帧率

删除Global Volume&#xff1a; 删除Global Volume是一项简单且高效的优化措施。实测表明&#xff0c;这一改动可以显著提升帧率&#xff0c;甚至能够将原本无法流畅运行的场景变得可用。 更改前的效果&#xff1a; 更改后的效果&#xff1a; 优化阴影和材质&#xff1a; …