- 博客(364)
- 收藏
- 关注
原创 算法头文件 && 宏定义
/*Work by: ChelseaProblem: 不知名屑题Knowledge: 垃圾算法Time: O(能过)*/#include<map>#include<set>#include<stack>#include<queue>#include<cmath>#include<bitset>#include<cstdio>#include<string>#include<ve
2021-11-23 16:11:44
559
原创 从0开始复现nano-vllm「llm_engine.py」
LLMEngine是一个高效的大语言模型推理引擎,实现了从文本输入到生成输出的全流程管理。核心功能包括:1) 初始化时自动配置模型参数、加载分词器,并启动多进程分布式计算;2) 提供add_request接口添加生成请求;3) 通过step方法执行单步推理,支持预填充和解码阶段;4) 实现generate批量生成接口,内置进度条显示和性能统计。该引擎封装了底层并行计算、批处理调度等复杂逻辑,对外提供简洁API,支持多GPU协同工作,能高效处理大规模文本生成任务。
2026-02-17 23:24:41
572
原创 从0开始复现nano-vllm「model_runner-py」下半篇之核心数据编排与执行引擎调度
本文分析了prepare_prefill函数在大模型推理中的作用,它负责为prefill阶段构建高效的计算环境。该函数将多个变长序列(可能部分已缓存)转换为GPU可直接处理的结构化输入,包括整理input_ids、positions等数据,并生成FlashAttention所需的元数据(如cu_seqlens_q/k、max_seqlen_q/k等)。特别处理了prefix caching情况,避免污染KV缓存池,并通过prepare_block_tables处理已缓存的KV数据。最后将数据从CPU传输到G
2026-02-17 13:29:50
489
原创 从0开始复现nano-vllm「model_runner.py」上半篇之初始化分布式推理环境
ModelRunner 摘要 ModelRunner 是 nanovllm 框架的核心类,负责高效加载和运行 Qwen3 大语言模型。其主要功能包括: 分布式初始化:通过 NCCL 后端建立多 GPU 通信,实现张量并行推理 显存管理:自动计算并预分配 KV Cache,采用 PagedAttention 机制优化长序列生成 推理优化:区分预填充和解码阶段,支持 CUDA Graph 加速小批量推理 预热机制:通过极限负载测试初始化模型并清理显存碎片 该类实现了从输入准备、模型推理到 Token 采样的完整
2026-02-13 14:29:08
728
原创 从0开始复现nano-vllm「ModelRunner.capture_cudagraph()」
文章摘要: 该代码实现了CUDA Graph捕获功能,用于优化LLM推理性能。通过预分配固定内存缓冲区(包括输入token、位置编码、KV缓存槽位映射等)并录制不同batch size的计算图,消除了CPU调度开销。关键技术点包括:1) 静态内存分配确保地址固定;2) 分批录制计算图(1-8小批次和16为步长的大批次);3) 使用共享内存池优化资源利用。这种设计特别适合高频小算子场景,能显著降低推理延迟,提升GPU利用率。代码还展示了不同类型张量的优化选择,如int64用于PyTorch标准层,int32用
2026-02-13 14:26:21
624
原创 从0开始复现nano-vllm「 utils/contex.py」
本文介绍了一个全局上下文管理器(Global Context Manager)的实现,用于在深度学习框架和底层计算核心之间高效传递元数据。该管理器通过维护一个全局单例状态_CONTEXT,存储包括预处理/解码阶段标记、序列长度信息、KV缓存位置映射等关键参数,避免了在函数间显式传递大量参数。主要功能包括:set_context更新推理参数,get_context获取当前状态,reset_context重置环境。这种设计简化了接口调用,优化了内存访问效率,特别是通过一维化的slot_mapping和分块管理的
2026-02-12 16:20:30
566
原创 从0开始复现nano-vllm「scheduler.py」
本文介绍了一个推理调度器(Scheduler)的设计与实现,该调度器负责管理序列在等待队列和运行队列之间的流转。其核心功能包括:1) 优先执行预填充(Prefill),在满足最大并发数、批处理Token数和显存条件下将等待队列序列移入运行队列;2) 执行解码(Decoding)时采用抢占机制(preempt),当显存不足时强制挂起低优先级序列以腾出空间;3) 提供序列生命周期管理,包括Token追加、终止条件检查和资源回收。调度器通过前缀缓存(prefix caching)优化显存使用,并采用双端队列实现优
2026-02-10 22:41:38
295
原创 从0开始复现nano-vllm「block_manager.py」
从0开始复现nano-vllm「block_manager.py」Block类表示一个固定大小的KV缓存存储单元,具有以下核心特性: 包含block_id、引用计数、哈希值和token列表 通过reset()方法初始化使用状态,设置引用计数为1 通过update()方法标记可复用状态,保存哈希和token列表 BlockManager类管理多个Block的生命周期: 维护空闲和已用block列表 提供计算哈希的方法 实现block的分配(allocate)和释放(deallocate)逻辑
2026-02-10 11:49:01
321
原创 从0开始复现nano-vllm「linear.py」
本文介绍了分布式深度学习中的张量并行线性层实现,重点分析了列并行和行并行两种核心策略。通过LinearBase基类统一管理参数结构和权重加载协议,派生出了ReplicatedLinear、ColumnParallelLinear和RowParallelLinear三个子类。列并行将权重矩阵按列拆分,适合MLP第一层;行并行按行拆分并需配合输入切分,适合MLP第二层。两者通过不同维度的参数切分(tp_dim=0/1)和相应的通信操作(All-Gather/All-Reduce)协同工作,共同解决大模型单卡显存
2026-02-06 16:14:52
577
原创 从0开始复现nano-vllm「utils/loader」
本文介绍了一个PyTorch模型参数加载器(loader.py)的实现原理。该加载器解决了两个关键问题:1)模型结构与checkpoint参数组织方式不一致(如Qwen3模型使用合并矩阵而HF风格checkpoint使用拆分参数);2)TP并行时各卡只需加载部分参数。通过分析PyTorch参数系统(树状结构的nn.Module和nn.Parameter)和safetensors文件格式(JSON头+二进制数据),解释了如何实现高效安全的参数加载。重点介绍了packed_modules_mapping机制,它
2026-01-29 10:54:37
606
原创 从0开始复现nano-vllm「engine/sequence」
摘要: 该代码定义了一个Sequence类,用于封装和管理文本生成请求的状态。SequenceStatus枚举定义了请求的生命周期状态(等待、运行中、结束)。Sequence类包含请求ID、状态、token列表、缓存信息等核心属性,并提供了一系列计算属性方法来获取prompt/生成的token数量、缓存块状态等信息。类还实现了__len__、__getitem__等魔术方法,以及序列化/反序列化支持。该类主要用于跟踪请求进度、管理KV缓存块分配,并维护生成过程中的各种状态参数。
2026-01-29 10:49:27
476
原创 从0开始复现nano-vllm「sampling_params」
本文介绍了SamplingParams类,它定义了三个关键参数控制文本生成过程。temperature参数调节输出随机性,温度值越高生成结果越多样;max_tokens设置单次推理的token数量上限;ignore_eos决定是否忽略结束标记强制生成文本。类中还通过断言禁止温度值过低,避免纯贪婪搜索。这些参数共同控制着文本生成的质量、长度和多样性。
2026-01-29 10:46:07
175
原创 从0开始复现nano-vllm「config」
本文介绍了基于Python dataclass的模型推理配置类Config,它作为全局配置中心管理推理引擎的核心参数。该类通过AutoConfig加载Hugging Face模型配置,并验证关键参数:包括批处理token上限(max_num_batched_tokens)、最大序列数(max_num_seqs)、模型长度限制(max_model_len)、GPU显存利用率(gpu_memory_utilization)等。通过__post_init__方法进行参数校验和初始化,确保KV缓存块大小符合256倍
2026-01-29 10:45:20
342
原创 leetcode134双周赛 子数组按位与值为 K 的数目「动态规划」「位运算」
leetcode134双周赛 子数组按位与值为 K 的数目「动态规划」「位运算」
2024-07-10 15:46:08
1163
原创 leetcode 404 周赛 找出有效子序列的最大长度 II「暴力」「动态规划」
leetcode 404 周赛 找出有效子序列的最大长度 II「暴力」「动态规划」
2024-07-01 14:31:33
1177
原创 leetcode 401周赛 执行操作可获得的最大总奖励「dp」「bitset优化」
首先,我们能发现,如果取了一个价值高的物品,那比它小的物品的价值都拿不了,所以肯定是从小的开始取,先对。是0,你可以进行任意次操作,每次操作都可以选择任意一个未被选择过的物品,而且必须满足。再仔细分析一下我们的状态转移方程,可以发现,第一维度可以用滚动数组滚掉。的数据,左右两段都是0,正好和原先的b对上了,二者取或即得到答案。由于bitset的特性,下标是从右往左计算的,所以先。的一段连续的数据,与dp数组中左侧的另一段长度为。,获得这个物品后也将获得它的价值,即。的数据,后半段全是0,再右移。
2024-06-20 20:22:56
678
原创 Suryxin’s ACM退役记
我的记忆力很差,经历过的很多事情都已经记不太清了,其中有很多美好回忆也已经消散,我很惋惜没能留存一些照片和声音或是文字供我怀念,这就像《泰坦尼克号》一样,露丝和杰克感人肺腑的爱情故事,最后也仅仅存在于暮年露丝的回忆里。这四年所经历的一切,都是我这一生可遇而不可求的美好时光,有些事情我不想忘记,也不想最后只有我记得,所以我想以文字的形式记录并怀念一下这四年的ACM生活。
2024-06-07 12:35:17
1971
9
原创 AtCoder Beginner Contest 229 「F dp」
我们可以通过枚举当前点的颜色和上一个点的颜色来进行状态转移。都存在一体指向0的带权无向边,边权为ar[i],同时从。问你形成二分图最小需要删除的边的权值之和是多少。,当然,n指向的不是n+1,是1,即是一个环。最后不要忘了计算一下n和1的颜色。假设最后形成的二分图进行染色后。也存在一条带权无向边,边权为。要形成二分图,点i可以和。的颜色相同,说明要删除。的颜色相同,说明要删除。
2023-07-04 22:06:04
528
原创 AtCoder Beginner Contest 307「E dp」
a[n]的条件,那答案就是m*(m-1)时,前i个数字中任意相邻的两个数字不相同的方案数。时,前i个数字中任意相邻的两个数字不相同的方案数。有了这个限制条件以后,我们可以用dp来解决。答案对998244353取模。表示第i个数和第一个数字。表示第i个数和第一个数字。
2023-07-04 20:31:51
320
原创 最佳牛围栏「二分答案+前缀和+双指针」
给你一个长度为n的数组a[i],你想求一段长度至少为m的连续的子数组所包含的数字和的平均值最大是多少。从m开始,判断是否满足条件,二者同时往后移动,这样保证了长度至少是。给的题面看的很抽象,半天看不懂再说什么,我简化一下。显然是要用二分答案,我们二分平均值。即可,我们可以利用双指针,一个指针。,但是难就难在check函数。从0开始枚举,维护前缀最小的。数组存在一个长度大于等于。,此时我们只需要找到一对。成功,所以我们可以对。
2023-07-02 21:54:23
266
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅