- 博客(393)
- 收藏
- 关注
原创 vLLM 前世今生:从 PagedAttention 到分布式推理引擎的演进之路
以显存效率为起点,以吞吐为目标,逐步长成一个通用的推理基础设施。诞生时,它用 PagedAttention 解决了 KV Cache 浪费这个最痛的问题;发展期,它不断扩展模型、量化、并行、硬件支持,从"快但窄"走向"全而稳";当下,V1 引擎、PD 分离、结构化输出、长上下文是社区最热的方向;未来,它想成为硬件无关、场景无关的推理标准层。对于使用者来说,理解 vLLM 的演进逻辑,比记住它的 API 更有价值——因为它的每一次取舍,背后都是对"推理系统到底在优化什么"这个问题的重新回答。
2026-11-04 10:18:54
308
原创 TVM 的分层架构:每一层做了什么优化,又向下传递了什么
写一个深度学习算子,最朴素的做法是直接写 CUDA:手动管理线程块、共享内存、寄存器,把循环展开、向量化、流水线全部自己安排。而 TIR 的特殊之处在于,它既是这条流水线上的一个 IR 节点,又是一门可以手写算子的类 Python DSL。只不过在 TVM 的编译流水线里,它主要扮演 IR 的角色,手写只是它的一种使用方式。解耦的手段就是分层——每一层只关心自己该关心的事,把已经确定下来的信息以某种中间表示(IR)的形式交给下一层,下一层再在此基础上做自己那一层的优化。
2026-11-04 10:17:06
184
原创 TVM 前世今生:从深度学习编译器到 AI 时代的统一计算抽象
TVM 的故事,本质上是**「用编译器的通用性对抗硬件的碎片化」**的故事。它诞生于深度学习框架割据、硬件百花齐放的时代,凭借「算法与调度分离」「自动搜索」「开放后端」三个核心洞察,走出了一条不同于手写内核库的道路。近十年间,TVM 从 NNVM 演进到 Relay,再到今天的 Relax;从 CNN 时代走到 LLM 时代。它坚持了调度分离与自动化,也增加了动态形状、BYOC、异构执行等能力。面向未来,它需要在统一 IR、大模型抽象、自动调度智能化与生态互操作上继续突破。
2026-11-04 10:15:20
256
原创 ONNX 是什么?一文讲清 ONNX 格式、与其他模型格式的异同、为何成为主流以及 ONNX Runtime
ONNX 是一个开放的、与框架无关的神经网络模型表示格式,由微软和 Facebook(Meta)于 2017 年联合发起,现由 Linux 基金会下的 ONNX 基金会维护。你可以在任意支持的框架里训练模型,导出成 ONNX,然后在任意支持 ONNX 的运行时里推理。ONNX 是什么:一个开放的、与框架无关的神经网络模型表示格式,本质是 Protobuf 序列化的计算图,只描述前向推理。和其他格式的异同:相同点是都承载"计算图 + 权重";
2026-11-04 10:14:01
302
原创 TVM 的前世今生:从深度学习编译器到 AI 基础设施
TVM 的诞生,本质上是对"深度学习部署碎片化"这一时代痛点的回应。它把编译器领域沉淀多年的思想——分层 IR、算法与调度分离、自动搜索——引入深度学习系统,走出了一条从学术论文到工业基础设施的完整路径。回望它的前世:是框架爆发与硬件碎片化的矛盾催生了它;看它的今生:它已成为 AI 编译领域的重要基石;而它的未来,则与大模型、异构计算和新硬件形态紧密相连。对于工程师而言,理解 TVM 不仅是掌握一个工具,更是理解"如何让算法高效地跑在任何硬件上"这一 AI 系统领域的核心命题。
2026-11-04 10:13:14
174
原创 TVM 的分层架构:每一层做了什么优化,又向下传递了什么
第一次读 TVM 源码的人,很容易被 、、、、 这些名字绕晕。它们看起来都在"编译",但职责边界其实非常清晰。TVM 的核心设计思想是分层抽象 + 逐层下降(lowering):每一层只解决一类问题,把已经解决的问题"固化"成下一层能理解的表示,然后把剩下的问题交给下一层。这样做的直接好处是:整条链路可以粗略概括为:前端模型 / 算子定义Relay:图级 IRTE / TensorIR:算子级 IRTIR:底层 IRTarget 相关代码生成Runtime 执行下面按层拆开讲,重点说清楚三件事:这一层做了什
2026-11-03 15:00:19
254
原创 量化交易、因子与因子挖掘全流程:从 WorldQuant 101 Alphas 到一次完整回测
量化交易是用数据和程序化的规则来做交易决策的方式:把"买什么、什么时候买、买多少、什么时候卖"这些决策,写成可以被计算机执行的规则,然后让程序去执行。它和主观交易的核心区别不在于"用不用电脑下单",而在于决策依据是否可复现维度主观交易量化交易决策依据经验、盘感、消息、研报数据 + 明确规则可复现性低,换个时间可能做出不同决策高,同样输入必然同样输出验证方式事后复盘历史回测 + 样本外检验风险控制依赖纪律可编程、可度量、可自动化容量瓶颈受个人精力限制。
2026-11-03 14:55:50
299
原创 从 MLIR Toy Tutorial 到自定义硬件方言 Pass:一份 AI 编译器面试项目实战指南
AI 编译器岗位的面试,通常不会只问你「什么是算子融合」这种概念题,而是会顺着简历上的项目往下挖:你写的这个 Pass 解决了什么问题?IR 是怎么设计的?lowering 的边界在哪?为什么这里要插一个 Op 而不是直接生成循环?一个基于 MLIR 的小项目,恰好能覆盖这些追问点。它足够「真」——你能讲清楚 IR、Dialect、Pass、Lowering 的完整链路;又足够「小」——不需要真的去写一个后端,也不需要跑在真实硬件上。先讲 MLIR 的核心思想、分层设计和功能;
2026-11-03 14:49:37
316
原创 基于 TVM Relax BYOC 扩展 Example NPU 后端:从跑通官方流程到自定义算子融合
至于 codegen 要不要补,取决于 Example NPU 的实现细节——先跑通分区验证,再决定是否深入 codegen,是更稳妥的路径。而「扩展一个原本不支持的融合模式」这件事,恰好能证明你不是照着教程抄了一遍,而是真的理解了 BYOC 的分区规则是怎么工作的。),那么新模式即使被切出来,codegen 阶段也可能报「不支持的算子」。如果 Example NPU 的 codegen 是「按算子名硬编码」的,那么新模式切出来之后,这句话本身没问题,但偏「结果导向」,面试官会追问细节。
2026-11-03 14:42:03
268
原创 Diffusion 模型生图原理详解:从 UNet 到 DiT,从高斯噪声到跳步加速
把上面的内容串起来,一次完整的文生图推理是这样的:fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;否是文本提示词文本编码器 (CLIP/T5)条件嵌入 c随机高斯噪声 x_T去噪网络 ε_θ (UNet / DiT)时间步 t预测噪声 ε采样器更新 (DDIM / DPM-Solver / LCM)是否到达 t=0VAE 解码。
2026-11-03 14:34:40
104
原创 缠论是什么:一套带动力系统直觉的主观分析框架
缠论源于网络博客,经社区整理形成体系,至今没有统一标准版本;它的核心是把走势拆解为分型、笔、线段、中枢、走势类型等结构单元;从数学视角看,它确实带有动力系统与符号动力学的影子,但本质上是主观定性模型,而非可求解的动力学方程;它的价值在于提供一套一致的观察语言,帮助交易者减少随意性;使用时务必结合级别、仓位与止损,警惕事后解释与过度拟合。理解缠论最好的方式,不是争论它"科不科学",而是把它当作一副结构化的眼镜——戴上它,你看走势的方式会变得更有序;但最终做决策的,仍然是你自己。
2026-11-02 23:41:36
136
原创 CANN Bot 详解:Plugin + Workflow + Agent + Skill 的算子开发闭环
Plugin(交付)→ Workflow(YAML 剧本)→ Agent(多角色分工)→ Skill(SKILL.md 能力包)。调度上,它靠独立 orchestrator 读取 YAML 跑状态机,用落盘状态,执行与验收强制分离,Agent 无法跳步。这套机制保证了流程的确定性,但交付质量仍需人工把关。对开发者而言,合理的预期是:把它当作一个能显著压缩「初稿生成与自检」时间的助手,而不是替代人工验收的银弹。
2026-11-02 23:38:39
333
原创 2023ICPC网络赛第一场 模拟|并查集||树上启发式合并|前缀和|DP|积分|计算几何
模拟根据网络赛规则,把两场每场按学校取最高,再把两场的排名合并,再按学校去重,输出最终排名合并类似于归并排序的写法,只是不用比较大小。最后看两个序列哪个还剩下没用完的,全接在末尾longlongforint;<=;++
2026-11-02 22:58:25
167
原创 25CCPC重庆 模拟|矩阵快速幂|DP|枚举|贪心|二分|树上差分|主席树|根号分治|分解质因子
模拟给一个五子棋的下棋顺序,问每一步走完后,场面上的连续五子的个数,包含四个方向的注意到时间比较富裕,可以在每一步落子后,取出这个落子位置周围9*9的网格,这就是这次落子能影响的范围,检查连续五子的个数具体实现上,可以写一个公用的函数,传入一个01数组,检查其中有多少个子区间元素和为5。然后对于四个方向,分别枚举,构造01序列,都用这个函数检查longlongforint;<=;++
2026-11-02 18:39:56
663
原创 AI 编译器入门:TVM 与 MLIR 的原理、差异与实战
AI 编译器的本质,是在「模型语义」与「硬件执行」之间建立可自动化的映射关系。TVM 用计算与调度分离、自动调优和端到端链路,解决了「一份模型跑多硬件」的工程问题;MLIR 用方言体系和渐进式降级,解决了「编译器如何可扩展、可复用」的架构问题。两者不是替代关系,而是不同层次的答案。理解 TVM,你会知道一个可用的 AI 编译器长什么样;理解 MLIR,你会知道如何把它拆解、重组、扩展到新的领域。把这两条线都走一遍,再回头看任何一个推理框架或芯片工具链,都会清晰很多。
2026-10-29 23:46:16
369
原创 26ICPC成都 DP|预处理|计数|通信|欧拉序|二分|贪心|维护区间
计数 DP 预处理 枚举一个长度100的01序列b,做前缀和得到a,对a做前缀和得到s。现在给m个约束p,v,表示spv。问满足所有约束的b序列的个数对于俩相邻的约束ivijvj,有sj−siai∗j−ixvj−vi于是可以枚举ai,如果ai确定了,x就确定了。只需要求出这个x的方案数即可计数了。注意到对于一个位置i,所有0100的ai的方案数可能不同,所以我们还需要维护到达i。
2026-10-29 22:55:29
216
原创 【CS336】lecture9 scaling law|缩放定律|数据缩放|数据配比|数据重复
进入第九讲 scaling law,缩放定律。开始就是个很实际的问题,如果给你一个万卡集群,你打算怎么训练?训练模型中一个比较难办的事情是超参数的选择,以前的做法很笨,真的去大模型训练上手动测试超参数。而现在缩放定律告诉我们,可以在小模型上测试超参数,总结规律,再拓展到大模型上例如左侧这张著名的图,我们可以把计算量和验证集loss取对数坐标轴,拟合出一条直线作为下界,不同颜色的所有模型的数据,都在这条线上方,这条线可以帮助我们预测,当我们拓展模型规模,模型的loss以什么速度下降。
2026-10-27 17:27:59
221
原创 【CS336】lecture 8收尾 上下文并行CP|多维并行|重计算
对于注意力层,有特殊的并行策略,上下文并行。核心是超长上下文时,qkv矩阵都很大,从内存角度单卡装不下,从计算吞吐角度也想要提高吞吐,于是想把注意力计算分散给多卡。不过注意到每个q都要和所有的kv计算注意力,因此不能简单的对qkv分别切分,分给多卡,这样每个卡内的q只算了和卡内kv的注意力,没算和其他kv的注意力。上下文并行的思路是,每个卡负责一些q,然后让kv块在多卡间做一个ring通信,每个kv块都会在环上走过所有卡,能与所有q块计算注意力。
2026-10-26 21:07:30
69
原创 ABC480 单调栈|线段树|DP|状压DP|DP状态定义|二分|枚举|计数
二分 前缀和把一个序列的所有前缀拼起来,得到一个长度nn1/2的序列,每次问这个序列的一个区间和显然可以先做一个二阶前缀和,就是对前缀和数组再做一次前缀和,这样能快速知道第l个前缀到第r个前缀的和。这只能做查询区间是一些完整前缀的情况,如果不是,需要知道边界指针位于某个前缀内的什么位置这可以二分来定位当前边界落在哪个前缀块内,预处理一个前缀块长度的前缀和即可。最后,可以再把询问lr拆成1l−11r,进一步简化。
2026-10-24 22:50:41
124
原创 26CCPC长春 贪心|思维|割边|差分转化|通信|构造|扫描线|ST表二分|同余|回文|中心拓展
贪心 线性规划网格图上,每次选择一条类似单调路径,具体来说一个序列中的点,所在列必须是一个区间LR,也就是列必须每次增加1,所在行必须是不减的。每次选一个路径后,给路上所有点-1,。问最少多少条路径,可以把网格图变成全0直接找路径不好找。换一个角度,可以只用单点-1,也能变成全0,代价是∑aij,相当于相选了这么多个长度为1的序列。想要最小化序列数,可以把其中一些序列连起来再注意到选择的序列必须是列号每次增加1的一段,因此i列只能和相邻的i−1i1列连接,对于一个ai。
2026-10-22 17:05:44
287
原创 【CS336】lecture8 分布式并行策略|PP流水线并行|TP张量并行|SP序列并行|EP专家并行
如图横轴是批处理大小和噪声的比值。可以认为批处理大小增加就是在增加数据并行的机器规模。当比值小于1时,增大这个比值,训练效果会变好,也就是单纯增加数据并行的机器数,增加批处理大小,就能加速模型训练。当大于1时,边际效益会快速降低,也就是再增加机器数,也几乎不会加速训练了,也就是增大批处理大小,来一个超大batch,可能每轮的loss下降速度也和一个小batch是差不多的。这里的原因是增加batch size来加速训练,这个机制成立的原因是数据量不够的话,梯度会含有噪声,影响模型收敛。
2026-10-22 13:14:27
209
原创 【cs336】lecture8 TPU通信|超节点|数据并行|ZeRO|FSDP
三个版本都是指增加了线性的通信量,在通信带宽不太小的情况下,这不会带来太多的通信延迟,但把显存取得了大幅优化,这是值得的。实测在8卡A100集群上,能跑的最大模型参数量如上图。其中stage3对比baseline,显存可以严格除以GPU数,也就是/8,相应的,能跑的最大参数量也变大了8倍。
2026-10-15 12:29:22
142
原创 【CS336】lecture7 多卡|通信架构|集合通信|NCCL|通信原语|torch.distributed
这讲开始,进入多GPU并行。整体结构如上,我们前几讲了解的是单GPU的结构,在此之上还有更高的层次:单节点多GPU之间通过NVLink和NVSwitch连接,这也被称为单机多卡。多节点之间通过以太网或Infiniband连接,这被称为多机多卡根据我们之前单GPU的内存层次学到的规律,离得越近通信应该越快,在这里同样满足这个规律,NVLink比HBM慢,以太网又比NVLink慢使用多GPU的是模型参数太大,单卡显存放不下,这是从内存角度来讲的。另一方面,多卡可以获得更高的计算吞吐,这是从计算角度来讲的。
2026-10-13 16:53:39
115
原创 26CCPC网络赛 DFS|数学|解方程|异或哈希|通信|二分|倍增|期望DP|最短路计数
dfs给一个六面都决定的骰子,现在创造一个新骰子,要求六面的和是n,问两个骰子都随机投,一共36种情况,构造一个方案使得至少赢19种第一个骰子六面的值很大,朴素的枚举第二个骰子每一面的值复杂度太大。但实际上我们只用考虑是否能赢第一个骰子,所以第二个骰子可以只枚举每一面,能赢第一个骰子的几面。把第一个骰子的值升序排序,假设能赢前i面,则第二个骰子的值可以直接设为为ai1,这是赢前i面花费最小的方式。最后六面都枚举出来了,如果还有剩余的点数,随便加到某一个骰子上,情况不会变的更差。
2026-10-08 21:04:23
593
原创 【CS336】lecture6 占用率|bank冲突|Triton|GeLU算子|softmax算子|reduce算子|matmul算子
这节主要讲的是如何用triton写算子,优化性能。首先回顾一下上一节讲的GPU架构。一个GPU上有多个SM,多个SM共享全局内存(HBM),以及一个全局缓存L2。每个SM共享L1缓存和共享内存。每个线程独享寄存器资源,但一个SM上的寄存器其实也是公用的一块区域划分出来的。对于各级内存的具体大小和带宽,如上表。对于线程模型,每次启动只能启动一个grid,grid的shape决定了线程块block的排布。每个block也称为CTA(Cooperative Thread Array),保存了一组线程。
2026-10-08 20:51:24
177
原创 26ICPC网络赛第二场 计数|DFS|MEX|贪心
计数给一个完全二叉树形成的区间max线段树,给一些约束,每个约束给线段树上一个点赋值v,表示这个点所在的子树,对应的叶子区间的max=v。叶子上是一个排列,问有多少种方案首先是一些无解的情况还有一些无解是构造过程中点不够用了,这留到算方案数的时候处理。考虑每一种值x出现的最浅和最深的点umn,umx。x一定在umx子树内,同时umn子树内的所有叶子不能超过x。考虑把后一个约束做一次dfs下放到所有叶子,具体来说树上每个点约束aux。
2026-10-08 19:57:26
195
原创 【CS336】lecture4 FlashAttention
fa是个很经典的优化,和torch的标准注意力实现相比,访存量减少了一个数量级,运行时间也大幅降低,只有运算量稍微增加了一点,但正如我们前面提到的,GPU的运算吞吐远大于内存带宽,因此计算量增加问题不大,只要优化了搬运量就行,而这就是fa的核心思路。
2026-10-07 19:38:16
97
原创 【CS336】lecture5 Roofline model|线程束分化|低精度|算子融合|重计算|合并访存|分块
这部分的主题是如何在GPU上优化AI任务。开始这个图就很有代表性,表示了随着矩阵规模增长,矩阵乘法的吞吐如何增长,可以发现有大趋势,也有奇怪的细节,后面会一一解释。
2026-10-07 14:09:44
424
原创 【CS336】lecture4 MoE|负载均衡|MoE并行|训练稳定性|Deepseek回顾
MoE的训练关键是路由层,但关键问题是路由层是不可微分的,无法反向传播,有三种解决方法。
2026-10-06 14:57:02
213
原创 【CS336】lecture4 MoE|专家路由|专家数量
啥是MoE?就是原本模型有一个大线性层(FFN),不管来什么token都走一遍,这也是推理时主要的计算开销。现在改成多个小FFN层,对于每个token,选一些最相关的FFN做前向传播,因为不是所有token都需要整个FFN的知识。好处是可以降低推理开销,并且可以增加专家数量,提升模型能力,只会导致显存增加,但不会增加计算开销。
2026-10-06 11:02:19
182
原创 【CS336】lecture4 线性注意力|Mamba|GDN|DSA
这节讲的是注意力变体,先回顾一下传统注意力计算开销随上下文窗口是平方量级增长的,也就是On上下文,On2的计算复杂度,如右图。但是拓展上下文窗口又是很重要的需求,现在模型主流的进化方向之一就是拓展上下文窗口,如左图。上一讲,对此的解决方式是引入混合注意力,稀疏注意力。如左图,展示了一层注意力模块的层内稀疏,以及层间稀疏,也就是几层稀疏注意力,一层完整注意力。但这样的方式优化效果还是不够好。
2026-10-05 19:12:45
463
原创 26 ICPC上海 交互|二分|重心|构造|二分图|贪心|SOSDP|三进制枚举|线性基|字典序贪心|DFS|分块|单侧递归线段树
交互 二分/重心。
2026-10-03 20:21:04
320
原创 26杭电暑期第五场 凸包|DP|期望|z函数|树状数组|扫描线|线段树|线性基|点分树|双指针|DFS
凸包 DP给一个点集,每个点上都有个字符,左括号或者右括号。问有多少种选法,选出一个子集,这个子集是一个凸包,且沿着凸包边界走,左括号右括号交替出现?选出一个点击必须是凸包,这可以DP。因为选出凸包的一部分后,设最后两个点是a,b,选下一个点c,只需要看ab,bc两个向量的叉乘是否满足条件。和ab前面已经选好的点无关。因此可以f(a,b)f(a,b)f(a,b)表示凸包的最后两个点位a,b的方案数,就可以对凸包计数。注意起点不同,选出的凸包不同,所以还需要枚举凸包的最低点s,也就是y坐标最小的点。由于这个状
2026-09-11 16:29:23
135
原创 26ICPC网络赛第一场 栈模拟|拓扑排序|计数|折半搜索|双指针|手写bitset|模拟加法|字典树|树套树|贪心
思维 模拟一个栈,给一个操作序列,只有压栈x,和询问栈顶是否为x,询问还会给出询问结果TF,表示是否正确。需要我们插入一些弹栈操作,使得插入和询问没有矛盾,保证有解,同时要求栈内不能存在重复元素。首先看询问操作,不矛盾的话一定是,插入x,若干个询问x,结果为T,然后弹出x,后面若干个询问x为F。所以对于x,这个弹栈操作,一定在最后一个T和第一个F之间。另外一个约束是不能存在重复元素,也类似最后一个T和下一个插入x之间,必须有一个弹出。总结一下就是最后一个T(没有T的话就是+),和下一个非T操作之间,必须有弹
2026-09-09 18:03:03
177
原创 26杭电第六场 2-SAT|MEX|线段树|DP
2-SAT mex给一棵树的所有边,按照给出的顺序,每条边必须确定方向,然后把起点点权赋值为0,终点点权+1。问最后操作完,树上点权mex的最小值?注意到最后一次操作,一定会把一个点点权赋值为0,因此mex最小为1。再注意到,我们可以确定一个根,然后让所有边的方向,都是从根到叶子的方向,由于这是一棵树,这样定向可以保证每个点的入度不超过1,也就是每个点被+1的次数最多一次,那么点权不超过1,mex可以取到2确定了2这个上界,还确定下界1,答案只可能是1或2。2是好实现的,关键是检查能否实现1。
2026-09-03 13:16:24
148
原创 26杭电第七场 ac自动机|fail树|树上前缀和|dp|树哈希|扫描线|单调队列优化启发式合并|带权并查集|贪心|哈夫曼树
ac自动机 fail树 树上前缀和 dp一个字符串序列,保证长度不减,问有多少个长度k=1,2...nk=1,2...nk=1,2...n的子序列,满足子序列中相邻两个串,前一个是后一个的子串?考虑朴素dp,设当前考虑前i个串,选中了第i个串,并且子序列一共选中了j个串的方案数f(i,j)f(i,j)f(i,j)。看起来似乎是O(n2)O(n^2)O(n2)的,但由于这个子序列保证相邻串一定是子串关系,且规定这些串两两不同,因此子序列中相邻两个串,长度至少+1,那么选xxx个串,总长度至少是O(x2)O(x
2026-09-02 13:18:51
173
原创 26杭电杭电暑期第八场(前半) 二分|倒序处理|历史和线段树|根号分治|组合数学|DP|分治|最短路|建图
二分/倒序一个图,给一个操作序列,每个操作都是删掉图中一个点及其邻边,问最多多少次操作后,1和n还是联通的删边不好做,可以考虑改成加边。加边的思路有两种:倒序遍历操作序列,则可以改成加边;或者二分最多操作多少个操作,还能联通,check里把剩余没执行的操作的对应边加上,检查联通。这里由于加的点,不是边,纯倒序Onm略难写。二分多一个Ologn但是更好写。
2026-08-28 22:26:03
250
原创 26杭电暑期第九场 贪心|bitset|分层图DP|线性基|笛卡尔树|KMP|随机哈希|博弈|随机游走|二位数点|分类讨论
贪心n个商品,如果一个商品价格超过当前钱的一半,则不会买。问至少准备多少钱,才能买下所有商品,并且商品购买顺序不确定。显然最贵的商品,最可能超过剩余钱的一半,导致买不了。并且如果所有商品价格一样,最后一个买的商品,前面已经花的钱最多,剩余钱最少,最可能超过钱的一半,导致买不了。综合一下,越贵,越靠后的越可能买不了。最严格的条件是:最贵的东西最后一个买,如果这个情况钱都够,前面的也都够。要满足这个条件,至少准备∑aimaxai实际上就够了。
2026-08-22 20:40:00
190
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅