- 博客(370)
- 收藏
- 关注
原创 26CCPC网络赛 DFS|数学|解方程|异或哈希|通信|二分|倍增|期望DP|最短路计数
dfs给一个六面都决定的骰子,现在创造一个新骰子,要求六面的和是n,问两个骰子都随机投,一共36种情况,构造一个方案使得至少赢19种第一个骰子六面的值很大,朴素的枚举第二个骰子每一面的值复杂度太大。但实际上我们只用考虑是否能赢第一个骰子,所以第二个骰子可以只枚举每一面,能赢第一个骰子的几面。把第一个骰子的值升序排序,假设能赢前i面,则第二个骰子的值可以直接设为为ai1,这是赢前i面花费最小的方式。最后六面都枚举出来了,如果还有剩余的点数,随便加到某一个骰子上,情况不会变的更差。
2026-10-08 21:04:23
441
原创 【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
132
原创 26ICPC网络赛第二场 计数|DFS|MEX|贪心
计数给一个完全二叉树形成的区间max线段树,给一些约束,每个约束给线段树上一个点赋值v,表示这个点所在的子树,对应的叶子区间的max=v。叶子上是一个排列,问有多少种方案首先是一些无解的情况还有一些无解是构造过程中点不够用了,这留到算方案数的时候处理。考虑每一种值x出现的最浅和最深的点umn,umx。x一定在umx子树内,同时umn子树内的所有叶子不能超过x。考虑把后一个约束做一次dfs下放到所有叶子,具体来说树上每个点约束aux。
2026-10-08 19:57:26
30
原创 【CS336】lecture4 FlashAttention
fa是个很经典的优化,和torch的标准注意力实现相比,访存量减少了一个数量级,运行时间也大幅降低,只有运算量稍微增加了一点,但正如我们前面提到的,GPU的运算吞吐远大于内存带宽,因此计算量增加问题不大,只要优化了搬运量就行,而这就是fa的核心思路。
2026-10-07 19:38:16
83
原创 【CS336】lecture5 Roofline model|线程束分化|低精度|算子融合|重计算|合并访存|分块
这部分的主题是如何在GPU上优化AI任务。开始这个图就很有代表性,表示了随着矩阵规模增长,矩阵乘法的吞吐如何增长,可以发现有大趋势,也有奇怪的细节,后面会一一解释。
2026-10-07 14:09:44
378
原创 【CS336】lecture4 MoE|负载均衡|MoE并行|训练稳定性|Deepseek回顾
MoE的训练关键是路由层,但关键问题是路由层是不可微分的,无法反向传播,有三种解决方法。
2026-10-06 14:57:02
184
原创 【CS336】lecture4 MoE|专家路由|专家数量
啥是MoE?就是原本模型有一个大线性层(FFN),不管来什么token都走一遍,这也是推理时主要的计算开销。现在改成多个小FFN层,对于每个token,选一些最相关的FFN做前向传播,因为不是所有token都需要整个FFN的知识。好处是可以降低推理开销,并且可以增加专家数量,提升模型能力,只会导致显存增加,但不会增加计算开销。
2026-10-06 11:02:19
179
原创 【CS336】lecture4 线性注意力|Mamba|GDN|DSA
这节讲的是注意力变体,先回顾一下传统注意力计算开销随上下文窗口是平方量级增长的,也就是On上下文,On2的计算复杂度,如右图。但是拓展上下文窗口又是很重要的需求,现在模型主流的进化方向之一就是拓展上下文窗口,如左图。上一讲,对此的解决方式是引入混合注意力,稀疏注意力。如左图,展示了一层注意力模块的层内稀疏,以及层间稀疏,也就是几层稀疏注意力,一层完整注意力。但这样的方式优化效果还是不够好。
2026-10-05 19:12:45
447
原创 26 ICPC上海 交互|二分|重心|构造|二分图|贪心|SOSDP|三进制枚举|线性基|字典序贪心|DFS|分块|单侧递归线段树
交互 二分/重心。
2026-10-03 20:21:04
268
原创 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
133
原创 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
174
原创 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
145
原创 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
170
原创 26杭电杭电暑期第八场(前半) 二分|倒序处理|历史和线段树|根号分治|组合数学|DP|分治|最短路|建图
二分/倒序一个图,给一个操作序列,每个操作都是删掉图中一个点及其邻边,问最多多少次操作后,1和n还是联通的删边不好做,可以考虑改成加边。加边的思路有两种:倒序遍历操作序列,则可以改成加边;或者二分最多操作多少个操作,还能联通,check里把剩余没执行的操作的对应边加上,检查联通。这里由于加的点,不是边,纯倒序Onm略难写。二分多一个Ologn但是更好写。
2026-08-28 22:26:03
248
原创 26杭电暑期第九场 贪心|bitset|分层图DP|线性基|笛卡尔树|KMP|随机哈希|博弈|随机游走|二位数点|分类讨论
贪心n个商品,如果一个商品价格超过当前钱的一半,则不会买。问至少准备多少钱,才能买下所有商品,并且商品购买顺序不确定。显然最贵的商品,最可能超过剩余钱的一半,导致买不了。并且如果所有商品价格一样,最后一个买的商品,前面已经花的钱最多,剩余钱最少,最可能超过钱的一半,导致买不了。综合一下,越贵,越靠后的越可能买不了。最严格的条件是:最贵的东西最后一个买,如果这个情况钱都够,前面的也都够。要满足这个条件,至少准备∑aimaxai实际上就够了。
2026-08-22 20:40:00
183
原创 26杭电暑期第十场(前半) 多项式|矩生成函数|下降幂|第二类斯特林数|指数生成函数|二分|最大流|GCD容斥|莫比乌斯反演
卷积|生成函数|第二类斯特林数|下降幂|矩生成函数给一个随机变量X,表示一个正面概率为p的硬币,第一次抛出正面需要的实验次数。这就是几何分布,设q=1−pq=1-pq=1−p,有E(X)=∑i=0iqi−1p=1/pE(X)=\sum_{i = 0} iq^{i-1}p=1/pE(X)=∑i=0iqi−1p=1/p现在问D(Xk)D(X^k)D(Xk),首先可以变形为D(Xk)=E(X2k)−E(X)2D(X^k)=E(X^{2k})-E(X)^2D(Xk)=E(X2k)−E(X)2,仍然是求期望。一个
2026-08-21 18:13:38
170
原创 ABC468 扫描线|贡献法|二阶差分|线段树优化DP
贡献法 扫描线 二阶差分求一个数组的所有子数组的平均数之和。等价于求所有子数组的加权和。对于长度i的子数组,权重就是1/i考虑贡献法,有两种,一种是每个元素的贡献,一种是每个前缀的贡献。先来说第一个,这个比较麻烦,每个元素的贡献,考虑对于每个长度i的划窗,划过整个数组,每一步给窗口内加上1/i。对于一个i只用考虑每个位置被加了多少次1/i。这个东西打表,或者手玩可以发现,贡献基本是一个梯形,开始前缀部分单增的等差数列,中间一段平台,最后后缀是一个单减的等差数列。
2026-08-03 23:45:07
197
原创 ABC469 二分|扫描线|划窗|调和级数|生成树|并查集
二分 扫描线 划窗一个01串,问至少包含k个1的所有子串中,1的个数/子串长度的最大值是多少?注意到这个答案具有单调性,考虑二分答案p,于是有s1i−s1ji−j≥p移项后等价于s1i−pi≥s1j−pj这可以扫描线+数据结构维护,扫描线过程中枚举s1i−pi,然后只要查前缀里是否有更小值,可以上log的数据结构,比如线段树,树状数组。但注意到这只需要维护一个前缀最小值,查询的前缀永远小于i。
2026-08-03 23:16:15
218
原创 26杭电暑期第三场 DP|费用流|分解质因子|数论|贪心|图论|期望|无穷级数
数学 贪心 博弈世界杯赌球,每个队伍都可以能否获得冠军,不同队伍之间押注相互独立。一共w元资金,第i个队伍压赢的赔率xi,压输的赔率是xixi−1。问能收回的资金,最坏情况下的最大值是多少。
2026-07-31 22:39:23
281
原创 26杭电暑期第二场 贪心|线性DP|图论构造|dsu on tree|莫比乌斯反演|大模拟
模拟|堆k台评测机,每秒都有一些队伍提交了请求,每个队伍同时最多有一个请求出于评测,评测机空闲时,会从目前没有正在评测任务的队伍的请求中,按照提交时间排序,选出时间最早请求的进入评测。问每个请求实际开始评测的时间。有很多做法,这里就讲我赛时的做法和官解做法。首先是我赛时的做法,有点麻烦,后来才发现这其实就是官解的做法2。考虑维护一个等待队列,按提交时间排序,评测机有空时弹出队首,用一个堆实现,这里选择set,优先队列也可以。由于评测机中一个队伍最多有一个任务处于评测。
2026-07-28 22:45:09
256
原创 DSU ont tree(附例题)
实际上,前面我们已经发明了dsu on tree。现在给他的流程做一个严格定义两次dfs,第一次维护出每个点的重儿子第二次dfs,首先递归进入轻儿子等轻儿子都递归过了,最后一个递归重儿子,这就是前面说的可以复用最后一个子树的信息,为了复用的尽量多,选择重子树进行复用。添加当前子树的贡献到数据结构,分两部分,第一部分是添加当前点,另一部分是添加各个子树,添加子树时由于重儿子贡献可以复用,已经保存在数据结构里了,跳过重儿子此时全局数据结构里保存的就是当前子树的答案,根据数据结构计算答案。
2026-07-25 16:13:18
180
原创 ABC467
计算几何给四个点,其中两个pq属于一个圆,另外两个rs属于另一个圆。问有没有可能这两个圆的圆心相同?给了圆上两点,可以确定圆心在这两点形成的线段的中垂线上。如果两个中垂线有交点,则交点就是公共圆心。转化为直线交点问题,如果两个中垂线不平行,则一定有交点,如果平行,则只有两个直线重合时才有交点。
2026-07-22 11:20:19
188
原创 【CS336】lecture3 RoPE|模型超参数|训练稳定性|注意力变体
最早的注意力架构,位置编码采用的是余弦编码,也就是加上一个三角函数,波长和token位置成正比。也有一些比较简单的模型如GPT3之前,使用绝对位置编码,第i个token就加上一个固定值,表示第i个。Llama使用了旋转位置编码,并且由于Llama是第一个性能能对齐闭源模型的开源模型,许多后来的开源和闭源模型都借鉴了它的设计,包括RoPE。一个好的位置编码应该具有相对位置的特性,也就是两个不同token的词向量,计算余弦相似度应该只和他们的相对位置有关,和绝对位置以及其他值无关。
2026-07-20 15:38:14
291
原创 【CS336】lecture2 优化器|内存占用|计算量估计
对于模型中的某一层,前向传播最主要的计算量都在全连接层,全连接层计算是(B,D)的激活值,乘上(D,D)的全连接层矩阵,矩阵乘法每个位置都需要一次加法,一次乘法,总计算量大概为。具体实现上,速度或者说动量,采用历史梯度的指数移动平均,这样越近的梯度权重越大,越远的梯度影响越小,考虑了历史梯度信息,但不会使得很久以前的梯度一直叠加。激活值的B是batch size,D是隐藏层维度,也是每个token的维度,L是模型层数,反向传播中,每一层的激活值都要保存,故乘上L。于是一个想法是给每个参数自适应学习率。
2026-07-15 22:26:36
267
原创 【CS336】lecture2 FLOPs|MFU|计算强度|Roofline model|通算隐藏
这个通信不仅要发,还要接收相邻网格的数据,相邻网格和当前网格不在同一个线程块,或者不在一个GPU上,是异步计算的,中间有一段时间,通信处于阻塞。并且,这个线标志的是在特定计算强度下的上界,如果计算强度不变时,没达到这条线的上界,往往是因为前提没达到,也就是没有实现计算和通信的完美重叠,需要我们设计流水线来掩盖通信延迟。具体计算可以使用如下代码,注意这里我们算出来的是一个线性层的实际吞吐率,这既不是FLOPs,也不是硬件FLOPS,可以叫Achieved FLOPS,实际达到的计算吞吐率。
2026-07-15 19:01:50
329
原创 【CS336】lecture2 tensor|数据类型|einops库
最常见的就是fp32,如下图,每个占4B,32个bit,8bit存指数,23bit存有效数字,1bit存符号。数值范围和精度都比较可靠,问题是太消耗内存了,而AI不是科学计算,对精度要求没有那么高,牺牲性能换精度并不划算,所以fp32是最基础的类型,但不是追求极限性能场景使用的类型。我们具体分析一下,fp16的计算规则如下,S是符号位,E是指数位,M是尾数。eniops库的价值在于,shape推导是显式写在代码里的,不需要阅读代码时再人脑里推算,并且维度进行命名,不需要手动对照操作的是哪个维度。
2026-07-15 17:45:53
366
原创 【CS336】lecture1 tokenization
语言模型处理的输入是字符串,但内部是对token预测概率,因此需要字符串到token的转换规则。也就是需要定义压缩率越高越好,因为压缩率高能把相同一段字符串输入,变成更短的token序列,降低模型训练推理的计算开销。然而压缩率提升往往需要更大的词典,比如把一个多个词组成的短语也看成一个token,而不是每个词一个token,压缩率自然提高了,但代价是词典里必须保存这个短语,不能只保存单个词汇。
2026-07-15 12:51:35
295
原创 投机解码 Speculative Decoding 和 多token预测 MTP
投机解码是一种采样方式,先来看模型是如何采样的,模型的最后一层输出是一个长度等于词典大小的向量,表示下一个token是词典中每个词的概率。采样就是根据这个概率向量,选出来下一个token,也就是不会改变模型的推理架构。最简单的采样方式就是谈心采样,每一步都选向量中概率最大的token。也。
2026-07-10 23:42:44
304
原创 连续批处理 continuous batching
大模型推理引擎不会每个请求独立推理,会把一些请求组成一个batch进行批处理,这是推理引擎提升吞吐率的关键。使用批处理后吞吐相比单请求会大幅提升,但还是有个问题,如下图,一个batch=4的批处理,开始推理后,会运行到所有序列推理都结束了才会结束,因此整个batch的推理时间取决于最慢的序列,在这里是第二行的序列,到T8才出现END符号其他序列即使已经推理完了,也只能等着,并且在这个batch结束前不能安排下一个batch,在第二行结束前,计算资源被浪费了。
2026-07-10 18:20:58
241
原创 PD矛盾的解决方案:chunked prefill,mixed bating和PD分离
这张图更清晰地展示了prefill和decode的计算差别,一个是GEMM,多个token的Q组成一个矩阵做注意力;一个是GEMV,一个矩阵的token Q,是一个向量,和前面所有token的KV,是一个矩阵,做注意力。
2026-07-10 13:29:04
383
原创 共享前缀的两种实现:VLLM prefix cache和SGLang radix tree
LLM推理引擎经常遇到这样的问题,同时对多个序列做推理,他们有相同的前缀token,那么为了提高推理效率,并不需要对每个序列重新计算KV,可以复用相同前缀的KV cache。这种场景在大模型推理服务中很常见,比如很多个用户都在用同一个服务/Agent,有相同system prompt。如下图,这是个翻译服务,system prompt是一个翻译任务的示例,完全相同,不同的只是输入的待翻译内容。
2026-07-08 23:48:38
645
原创 从传统OS 内存分页到VLLM paged attention
想理解paged attention,我们需要先理解KV cache。在现在主流大模型的decode阶段,每次新生成一个token需要和前面所有token的KV进行注意力计算,由于前面的KV一旦计算出来就不变了,不受当前token的影响,所以可以缓存下来,不用每次都重新计算,这就是KV cache。如下图,当前输入是token3,,预测下一个token,需要利用token1-3的KV计算注意力,朴素做法是重新使用token1-3,计算出KV1-3。
2026-07-08 11:39:14
283
原创 nano-vllm源码解读(engine部分)
vLLM 是由加州大学伯克利分校和 Meta 的研究人员构建的生产级LLM推理引擎,它的优点是vllm是高性能推理中最值得学习的引擎,但问题是为了适配多种场景,做的太复杂了,10K+行代码难以学习。而nano-vLLM 是 vLLM 的一个极简重构——只有约 1200 行干净的 Python 代码,但保留了VLLM的关键优化,可以用更低的学习负担了解vllm的设计思想。具体来说实现了vllm的这些核心机制。
2026-07-06 11:52:29
224
原创 Triton Puzzles(7-9 flash attenton/online softmax/reduce sum)
这个项目的简介可以看前面这篇文章。
2026-07-03 12:01:39
196
原创 Triton Puzzles(Demo1-4)
Triton 是由 OpenAI 开源的一种专为深度学习加速设计的编程语言和编译器。如果你写过 CUDA,你可能会觉得它太底层、开发周期太长;如果你只用 PyTorch,你可能会发现很多自定义的算子(比如各种新型的 Attention 或量化算子)无法获得极致的性能。Triton 的诞生,正是为了在“开发效率”与“极致性能”之间取得完美的平衡。
2026-07-02 17:43:27
249
原创 NSA 算子解析(Torch/Tilelang)
NSA 的核心思想是将原本全局的 Attention 分解为三个优势互补的稀疏分支,以极低的 KV Cache 占用保留长文本的表征能力:Compressed Attention(压缩注意力)做法:将历史的 KV 序列按照固定的 Block 大小(例如每 128 个 Token 一个块)进行划分,通过一个简单的 Pooling 或小型网络进行粗粒度压缩。作用:用极小规模的 KV 表达全局的“背景宏观语义”,大幅降低远距离历史信息的计算开销,同时会输出各个块的“重要性得分”。
2026-07-01 15:24:04
351
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅