大模型推理框架 vLLM 源码解析(一)

本文详细解读了vLLM的源码,介绍了核心模块如Sequence、SequenceGroup、SamplingParams等,展示了大模型推理如何通过多GPU并行处理和调度机制实现高效计算,适用于AutoML和机器学习任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大模型推理框架 vLLM 源码解析(一)

原创 marsggbo AutoML机器学习 2024-02-04 18:13

1. Quick Start

创建如下代码,命名为 run.py

from vllm import LLM, SamplingParams

prompts = [
 "Have you followed marsggbo in Zhihu?",
 "你一键三连了吗?"
] # 输入prompts
sampling_params = SamplingParams(temperature=0.8, top_k=50) # 采样策略
llm = LLM(model="facebook/opt-125m", tensor_parallel_size=2) # 初始化 LLM
outputs = llm.generate(prompts, sampling_params) # 完成推理
for output in outputs:
 prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

执行命令:python run.py。该脚本会自动将模型以张量并行的方式在两个 GPU 上进行推理计算

整个推理过程大大致流程如下图所示,即 1 给定一定数量的 prompts(字符串数组) 2. vllm 会使用 Scheduler 模块自动对需要推理句子进行调度

3. 根据调度的结果,使用 tokenizer 将字符串转换成 prompt id,然后喂给 model 进行计算得到 logits 预测结果 4. 根据 logits 预测结果和提前设置好的采样策略对结果进行采样得到新的 token id 5. 将采样结果保存到 output

inferencce pipeline

2. 整体核心模块

上图给出了 vLLM 核心模块之间的结构关系。接下来我们从简单的模块(即输入、采样和输出)开始介绍,最后详细介绍 LLM 模块。

3. Sequence

如上图我们可以看到 vLLM 为输入的句子设计了很多子模块,这些模块的用处各不相同,但是有彼此之间有关系,下面分别详细介绍一下。

3.1 SequenceStatus

首先看到 SequenceStatus,其源代码如下:

class SequenceStatus(enum.Enum):
    """Status of a sequence."""
    WAITING = enum.auto() # 等待中,句子还没开始推理,或者推理还未结束
    RUNNING = enum.auto() # 运行中
    SWAPPED = enum.auto() # 已交换
    FINISHED_STOPPED = enum.auto() # 已停止
    FINISHED_LENGTH_CAPPED = enum.auto() # 已长度限制
    FINISHED_ABORTED = enum.auto() # 已中止
    FINISHED_IGNORED = enum.auto() # 已忽略

    @staticmethod
    def is_finished(status: "SequenceStatus") -> bool:
        # 判断状态是否为已停止、已长度限制、已中止或已忽略
        return status in [
            SequenceStatus.FINISHED_STOPPED,
            SequenceStatus.FINISHED_LENGTH_CAPPED,
            SequenceStatus.FINISHED_ABORTED,
            SequenceStatus.FINISHED_IGNORED,
        ]

3.2 SequenceData

SequenceData 用于存储与序列相关的数据。这个类有三个属性:prompt_token_ids(提示词的标记ID)、output_token_ids(生成文本的标记ID)和cumulative_logprob(累计对数概率)。

class SequenceData:
    def __init__(
        self,
  
### Qwen2.5-VL 和 VLLM 技术概述 Qwen2.5-VL 是款专注于多模态(图像+视频)理解的大规模预训练模型[^1]。该模型具备强大的感知、解析推理能力,在多种设备上能够高效执行任务,包括但不限于智能手机、计算机以及各类网络平台上的应用。 VLLM(Very Large Language Model)通常指的是超大规模的语言模型架构设计和技术实现方法。虽然具体的 vllm 项目可能指代不同的具体实施案例,但在讨论中经常涉及的技术特性包括分布式训练框架的支持、高效的内存管理和优化过的Transformer层计算逻辑等。 对于希望深入了解这两个项目的开发者而言,以下是几个重要的资源链接: #### 官方文档与源码仓库 - **Qwen2.5-VL GitHub Repository**: 提供完整的代码库访问权限,允许研究者查看详细的实验设置、数据集准备指南及如何重现论文中的结果。 - **VLLM Project Page or Documentation Site**: 如果存在特定于某个版本或实现路径下的官方说明,则应优先参考这些资料来获取最权威的信息更新。 #### 社区支持与交流平台 - 论坛和支持群组:加入活跃的社区可以帮助解决遇到的问题并与其他使用者分享经验心得。 - 开发者博客文章系列:许多贡献者会在个人网站上发表关于最新进展和个人见解的文章,这也是了解前沿动态的好去处之。 ```python import requests def fetch_model_documentation(model_name): base_url = "https://api.github.com/repos/" repo_path = f"your-repo/{model_name}/contents/README.md" response = requests.get(base_url + repo_path) if response.status_code == 200: content = response.json()['content'] decoded_content = base64.b64decode(content).decode('utf8') return decoded_content else: raise Exception(f"Failed to retrieve documentation for {model_name}") print(fetch_model_documentation("Qwen2.5-VL")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强化学习曾小健

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值