以下内容由Trae生成。我只管问和排版。

Nano-vLLM 是一个从零构建的轻量级vLLM实现项目,具备快速离线推理、代码可读性高和优化功能丰富等特点,性能表现和原版vLLM相媲美。以下是该项目各目录和文件的功能说明:

1. 根目录

  • bench.py:用于存放基准测试代码,可查看模型性能测试结果。
  • example.py:提供项目使用示例,展示API调用方法。
  • pyproject.toml:Python项目配置文件,管理项目依赖和元数据。

2. nanovllm目录

  • __init__.py:标识该目录为Python包。
  • config.py:定义配置类 Config,用于管理模型运行的各种参数。
  • engine 子目录:存放推理引擎相关代码,包含 block_manager.pyllm_engine.pymodel_runner.pyscheduler.pysequence.py
  • layers 子目录:存放模型各层的实现代码,如激活层、注意力层等。
  • llm.py:可能实现LLM核心功能。
  • models 子目录:存放特定模型的实现,如 qwen3.py
  • sampling_params.py:可能用于定义采样参数。
  • utils 子目录:存放工具函数,如 context.pyloader.py

一、engine 目录

engine目录负责推理引擎的实现,管理模型推理的整个流程,协调各组件工作。
Nano-vLLM engine推理引擎以模块化设计,主要由 LLMEngineModelRunnerSchedulerBlockManagerSequence 几个核心组件构成,各组件分工协作完成推理任务。

核心组件及实现原理

  1. Sequence(序列管理)

    • 用于管理单个推理序列的状态和数据,包括 token ID、状态(等待、运行、完成)、缓存信息等。
    • 提供了获取块数据、追加 token 等方法,方便对序列进行操作。
  2. BlockManager(块管理)

    • 负责管理缓存块的分配和释放,使用哈希算法来实现块的缓存,提高推理效率。
    • 通过 hash_to_block_id 字典记录哈希值和块 ID 的映射关系,减少重复计算。
    • 提供了分配、释放和追加块的方法,确保块资源的有效利用。
  3. Scheduler(调度器)

    • 负责管理待处理和正在运行的序列,根据资源限制和块管理状态进行序列调度。
    • 分为预填充(prefill)和解码(decode)两个阶段调度序列,在资源不足时会抢占序列。
    • 对推理结果进行后处理,更新序列状态并释放完成序列的资源。
  4. ModelRunner(模型运行器)

    • 负责初始化模型、预热模型、分配 KV 缓存等操作。
    • 支持张量并行,使用共享内存进行进程间通信。
    • 提供了准备输入数据、运行模型和采样等方法,支持 CUDA Graph 优化推理性能。
  5. LLMEngine(推理引擎)

    • 作为推理引擎的入口,负责初始化模型运行器、调度器和分词器。
    • 提供添加请求、单步推理和生成结果等方法,支持进度显示和吞吐量统计。
    • 使用多进程实现张量并行,提高推理速度。

推理流程

  1. 用户通过 LLMEngine.generate 方法添加推理请求。
  2. Scheduler 将请求加入等待队列,并在资源充足时进行调度。
  3. ModelRunner 准备输入数据,调用模型进行推理,并使用 Sampler 进行采样。
  4. BlockManager 管理缓存块,提高重复计算的效率。
  5. Scheduler 对推理结果进行后处理,更新序列状态,直到所有序列完成。

二、layers目录

layers 目录存放模型各基础层的实现代码,为模型提供基础的计算单元,保证模型能完成复杂的计算任务。从已有代码可知,该目录主要有以下功能:

1、激活层( activation.py )

激活层的作用是向神经网络中引入非线性因素,使得神经网络可以拟合复杂的非线性函数。
项目中实现了 SiluAndMul 激活层,对输入张量进行 SiLU 激活和元素乘法操作,引入非线性因素。代码如下:

class SiluAndMul(nn.Module):def __init__(self):super().__init__()@torch.compiledef forward(self, x: torch.Tensor) -> torch.Tensor:x, y = x.chunk(2, -1)return F.silu(x) * y

SiluAndMul 类继承自 nn.Module ,在 forward 方法中,先将输入张量 x 沿最后一个维度分成两部分,对第一部分应用 SiLU(Sigmoid Linear Unit)激活函数,再与第二部分进行元素乘法运算。

2、注意力层( attention.py ) :

注意力层是Transformer架构的核心组件,它允许模型在处理序列数据时,动态地关注序列中不同位置的信息。
项目中的 Attention 类实现了注意力机制,支持多头注意力机制,利用 Triton 优化 KV 缓存存储,结合 Flash Attention 提高计算效率。代码如下:

class Attention(nn.Module):def __init__(self,num_heads,head_dim,scale,num_kv_heads,):super().__init__()# ...已有代码...def forward(self, q: torch.Tensor, k: torch.Tensor, v: torch.Tensor):# ...已有代码...

Attention 类支持多头注意力机制,在 forward 方法中,根据上下文 context 的状态选择不同的注意力计算方式:

  • prefill 阶段 :使用 flash_attn_varlen_func 计算注意力,支持前缀缓存(prefix cache)。
  • decode 阶段 :使用 flash_attn_with_kvcache 结合KV缓存计算注意力。
    此外,项目还使用 Triton 实现了 store_kvcache_kernel 核函数,用于将键(key)和值(value)存储到缓存中,提高计算效率。

3、采样(sampler.py)

项目里, Sampler 类是一个继承自 torch.nn.Module 的模块,用于实现采样操作。采样是从模型输出的概率分布中选取下一个 token 的过程,在自然语言处理里常用于生成文本。

从 sampler.py 文件可知, Sampler 类的 forward 方法接收 logits (模型未经过 softmax 的原始输出)和 temperatures 作为输入,实现了两种采样方式:

  • 贪心采样(Greedy Sampling) :当 temperatures 为 0 时,直接选取 logits 中概率最大的 token。
  • 基于温度调整的采样 :当 temperatures 不为 0 时,先对 logits 除以温度值,再通过 torch.softmax 转换为概率分布,最后结合指数分布对概率进行调整,选取调整后概率最大的 token。
    这种采样机制可以在确定性输出(贪心采样)和随机性输出(基于温度调整的采样)之间进行平衡,从而控制生成文本的多样性。

4、嵌入层与语言模型头(embed_head.py)

  • VocabParallelEmbedding 类 :实现了词表并行的嵌入层,支持在分布式环境下对词表进行分片处理,不同进程处理词表的不同部分,最后通过 all_reduce 操作汇总结果。
  • ParallelLMHead 类 :继承自 VocabParallelEmbedding ,实现了并行的语言模型头。在 prefill 阶段会提取最后一个时间步的特征,然后进行线性变换得到对数几率(logits)。

5、归一化层(layernorm.py)

  • RMSNorm 类 :实现了 Root Mean Square (RMS) 归一化。支持两种前向传播方式:一种是普通的 RMS 归一化,另一种是带有残差连接的 RMS 归一化。

6、线性层(linear.py)

  • LinearBase 类 :线性层的基类,定义了线性层的基本属性和方法。
  • ReplicatedLinear 类 :实现了普通的线性层,权重在所有进程中保持一致。
  • ColumnParallelLinear 类 :实现了列并行的线性层,输出维度在不同进程间进行分片。
  • MergedColumnParallelLinear 类 :继承自 ColumnParallelLinear ,支持将多个输出维度合并处理。
  • QKVParallelLinear 类 :继承自 ColumnParallelLinear ,专门用于处理查询(Q)、键(K)、值(V)的并行线性变换。
  • RowParallelLinear 类 :实现了行并行的线性层,输入维度在不同进程间进行分片,计算结果通过 all_reduce 操作汇总。

7、旋转位置编码层(rotary_embedding.py)

  • RotaryEmbedding 类 :实现了旋转位置编码(Rotary Position Embedding, RoPE),通过正弦和余弦函数为查询(query)和键(key)添加位置信息。
  • get_rope 函数 :用于获取 RotaryEmbedding 实例,使用 lru_cache 缓存实例,避免重复创建。

layers构建语言模型推理链路流程

  1. 输入处理阶段
  • 嵌入层( embed_head.py ) :将输入token转换为连续向量表示(词嵌入),是模型处理的起点。
  • 位置编码( rotary_embedding.py ) :通过旋转位置编码(RoPE)为嵌入向量添加位置信息,使模型能感知序列顺序(如 apply_rotary_emb 函数实现)。
  1. 特征提取与变换阶段
  • 注意力层( attention.py ) :利用带位置信息的嵌入向量,通过多头注意力机制计算上下文依赖(如 flash_attn_varlen_func 处理前缀缓存, flash_attn_with_kvcache 结合KV缓存优化推理)。
  • 激活层( activation.py ) :在注意力输出或前馈网络中应用SiLU激活函数(如 SiluAndMul 层将输入分块后执行 F.silu(x) * y ),增强模型非线性表达能力。
  • 线性变换层( linear.py ) :通过 ColumnParallelLinear / RowParallelLinear 等并行线性层,完成向量空间的线性变换(如QKV投影、前馈网络映射)。
  • 归一化层( layernorm.py ) :使用 RMSNorm 对各层输出进行归一化(如 rms_forward 方法),稳定训练过程。
  1. 输出生成阶段
  • 采样器( sampler.py ) :基于模型最终输出的logits,通过贪心采样或温度调整采样选择下一个token(如 temperatures=0 时选最大概率token,非0时缩放logits后softmax)。
协作核心机制

各层通过 engine 模块的 ModelRunner 和 LLMEngine 协调:

  • ModelRunner 初始化时为注意力层分配共享KV缓存( k_cache / v_cache 属性),并通过 context 对象传递 slot_mapping 等元数据(如 attention.py 中 context = get_context() 获取状态)。
  • LLMEngine 调度请求,根据 context.is_prefill 标志切换注意力层计算模式(前缀填充/单步解码),确保各层在正确上下文(如内存管理、并行策略)中执行。
综上, layers 的基础层通过“输入处理→特征变换→输出生成”的流水线协作,配合 engine 的资源管理,共同实现高效的大语言模型推理。

三、models目录

models 目录实现具体的模型架构,会调用 layers 目录中的基础层来构建完整模型。以 qwen3.py 为例,实现了 Qwen3ForCausalLM 模型,其功能如下:

  • 模型组件封装 :将 Attention 、 SiluAndMul 等基础层封装到 Qwen3Attention 、 Qwen3MLP 等模块中。
  • 模型架构搭建 :通过 Qwen3DecoderLayer 和 Qwen3Model 类构建完整的 Qwen3 模型架构。

四、各目录关联工作方式

layers 、 models 和 engine 目录的组件通过以下流程协同工作:

  1. 初始化阶段 :
    • LLMEngine 初始化时创建 ModelRunner 实例, ModelRunner 初始化 Qwen3ForCausalLM 模型。
    • Qwen3ForCausalLM 模型在构建过程中调用 layers 目录下的基础层,如 Attention 、 SiluAndMul 等。
    • ModelRunner 分配 KV 缓存,并将缓存张量绑定到模型各层的 k_cache 和 v_cache 属性上。
  2. 推理阶段 :
    • 用户请求通过 LLMEngine 的 add_request 方法添加到调度队列。
    • Scheduler 调度请求, LLMEngine 调用 ModelRunner 的 run 方法执行推理。
    • ModelRunner 准备输入数据,设置上下文信息,调用 Qwen3ForCausalLM 模型进行前向传播。
    • Qwen3ForCausalLM 模型在计算过程中调用 layers 目录下的基础层完成具体计算。
    • ModelRunner 使用 Sampler 进行采样,生成最终结果。
  3. 结果处理阶段 :
    • LLMEngine 收集推理结果,通过 tokenizer 解码生成文本返回给用户。

最后感谢DeepSeek nano-vllm作者俞星凯,感谢字节trae,让我有幸了解到了推理引擎的工作原理。
另附一个深度学习的学习笔记 https://github.com/AccumulateMore/CV

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

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

相关文章

MySQL 8.4 备份与恢复完全指南

本文全面解析MySQL 8.4的备份与恢复机制,涵盖备份类型、方法、策略及实际操作示例。 一、备份类型解析 1. 物理(原始)备份 vs 逻辑备份 特性物理备份逻辑备份原理直接复制数据库目录/文件(如数据文件、日志)导出逻辑结构(CREATE…

Mac 部署Latex OCR并优化体验(打包成App并支持全局快捷键)

🍁 前言 最近阅读论文,在做笔记的时候总是要手动输入一些latex公式,非常耗时。我使用Hapigo的Latex 公式识别,感觉还挺好用,但是缺陷是只有30次免费额度,于是在网上搜索了一下,发现可以通过本地…

128K 长文本处理实战:腾讯混元 + 云函数 SCF 构建 PDF 摘要生成器

一、背景 在数字化办公时代,PDF 文档因其格式稳定、兼容性强等特点,成为知识分享与文档存储的主要载体之一。但随着文档规模的增长,如何快速提取关键信息成为亟待解决的问题。尤其对于 128K 字符及以上的长文本 PDF,传统处理方法…

Elasticsearch 排序性能提升高达 900 倍

作者:来自 Elastic Benjamin Trent, Mayya Sharipova, Chenhui Wang 及 Libby Lin 了解我们如何通过更快的 float / half_float 排序和 integer 排序的延迟优化来加快 Elasticsearch 排序速度。 Elasticsearch 引入了大量新功能,帮助你为你的使用场景构建…

Nginx重定向协议冲突解决方案:The plain HTTP request was sent to HTTPS port

问题原因 ​​服务器运行在 HTTPS 模式,但代码却发出了 HTTP 重定向指令,两套协议对不上,浏览器直接报错。​​ 在Java中,常见于response.sendRedirect()方法的使用。该方法默认生成基于HTTP的绝对URL,即便原始请求是…

机器学习如何让智能推荐“更懂你”,助力转化率飞跃?

机器学习如何让智能推荐“更懂你”,助力转化率飞跃? 今天咱聊聊一个电商、内容平台、社交App都离不开的“秘密武器”——智能推荐系统,以及机器学习到底如何帮它提升转化率的。 说白了,转化率就是“点进去买单”的概率。智能推荐做得好,转化率能蹭蹭上涨;做不好,用户滑…

Ruby CGI Session

Ruby CGI Session 引言 CGI(Common Gateway Interface)是一种网络服务器与外部应用程序(如脚本或程序)进行通信的协议。在Ruby语言中,CGI被广泛用于创建动态网页。本文将深入探讨Ruby CGI Session的相关知识&#xf…

从零开始的云计算生活——第二十四天,重起航帆,初见MySQL数据库

一.故事剧情 接下来要进入到一条比较长的路——mysql数据库,之后会用一段时间来学习mySQL数据库的内容,今天先从基础开始介绍mysql数据库。 二.MySQL数据库概述 1.数据库概念 数据库(Database) 简称DB,按照一定格式存储数据的一些文件的…

ES文件管理器v4.4.3(ES文件浏览器)

前言 ES文件管理器(也叫ES文件浏览器)是一款手机上用来看和管理文件的工具。你可以用它像在电脑上一样,把文件整理进不同的文件夹,查找照片、文档、视频都很方便。它还能看到平时看不到的隐藏文件,帮你清理一些没用的…

leetcode:693. 交替位二进制数(数学相关算法题,python3解法)

难度:简单 给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。 示例 1: 输入:n 5 输出:true 解释:5 的二进制表示是&am…

GRU与LSTM之间的联系和区别

前面我们谈到RNN与LSTM之间的关系,而GRU也是循环神经网络中的一种模型,那么它与LSTM有什么区别呢? 接下来我来对GRU(Gated Recurrent Unit)模型进行一次深度解析,重点关注其内部结构、参数以及与LSTM的对比…

2025年数字信号、计算机通信与软件工程国际会议(DSCCSE 2025)

2025年数字信号、计算机通信与软件工程国际会议(DSCCSE 2025) 2025 International Conference on Digital Signal, Computer Communication, and Software Engineering 一、大会信息 会议简称:DSCCSE 2025 大会地点:中国北京 审稿…

北峰智能SDC混合组网通信方案,助力无网络场景高效作业

在自然灾害、公共安全事件或大规模活动应急响应中,专用无线对讲通信因其不受外部网络限制、免去通话费用、无需拨号便可实现即时语音调度的特点,展现出其不可替代的价值。尤其在许多无基础设施的地区,对智能化调度管理的需求并不亚于城市地区…

HarmonyOS应用开发高级认证知识点梳理 (二) 组件交互

以下是 HarmonyOS 应用开发中 ‌组件交互‌ 的核心知识点梳理(高级认证备考重点),涵盖事件传递、状态管理、通信机制及生命周期协同: 一、事件处理机制 基础交互类型‌ (1)点击事件(onClick) 核心要点‌…

【SQL优化案例】索引创建不合理导致SQL消耗大量CPU资源

#隐式转换 第一章 适用环境 oracle 11glinux 6.9 第二章 Top SQL概况 下面列出我们发现的特定模块中Top SQL的相关情况: SQL_ID 模块 SQL类型 主要问题 fnc58puaqkd1n 无 select 索引创建不合理,导致全索引扫描,产生了大量逻辑读 …

autoas/as 工程的RTE静态消息总线实现与端口数据交换机制详解

0. 概述 autoas/as 工程的RTE(Runtime Environment)通过自动生成C代码,将各SWC(软件组件)之间的数据通信全部静态化、结构化,实现了类似“静态消息总线”的通信模型。所有端口的数据交换都必须经过RTE接口…

【机器学习第四期(Python)】LightGBM 方法原理详解

LightGBM 概述 一、LightGBM 简介二、LightGBM 原理详解⚙️ 核心原理🧠 LightGBM 的主要特点 三、LightGBM 实现步骤(Python)🧪 可调参数推荐完整案例代码(回归任务 可视化) 参考 LightGBM 是由微软开源的…

时序数据库IoTDB监控指标采集与可视化指南

一、概述 本文以时序数据库IoTDB V1.0.1版本为例,介绍如何通过Prometheus采集Apache IoTDB的监控指标,并使用Grafana进行可视化。 二、Prometheus聚合运算符 Prometheus支持多种聚合运算符,用于在时间序列数据上进行聚合操作。以下是一些常…

React安装使用教程

一、React 简介 React 是由 Facebook 开发和维护的一个用于构建用户界面的 JavaScript 库,适用于构建复杂的单页应用(SPA)。它采用组件化、虚拟 DOM 和声明式编程等理念,已成为前端开发的主流选择。 二、React 安装方式 2.1 使用…

.NET MAUI跨平台串口通讯方案

文章目录 MAUI项目架构设计平台特定实现接口定义Windows平台实现Android平台实现 MAUI主界面实现依赖注入配置相关学习资源.NET MAUI开发移动端开发平台特定实现依赖注入与架构移动应用发布跨平台开发最佳实践性能优化测试与调试开源项目参考 MAUI项目架构设计 #mermaid-svg-OG…