Nano-vLLM 源碼學習

以下內容由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…