- 博客(121)
- 资源 (28)
- 收藏
- 关注

原创 大模型推理--temperature、top_k、top_p理解
LLM推理的最后一步是要从众多候选token中选择一个输出,一般可以选择softmax概率最大的token输出,这样相同的输入都会获得确定的输出。不过,在很多情况下,最优输出不见得是最好的输出,尤其在当下LLM还不完美的情况下。为此我们需要让LLM的输出在保证靠谱的前提下尽可能多样,temperature、top_k、top_p这三个变量就是出于此目的设计出来的。当然很多博客中已经介绍了这三个变量的作用,但是很多人可能对细节还不了解,正好最近看了一个Python实现,借此给大家详细介绍一下这三个变量的作用。
2025-03-25 22:15:15
885

原创 大模型推理--Scaled_dot_product_attention(SDPA)使用详解
在学习huggingFace的Transformer库时,我们不可避免会遇到scaled_dot_product_attention(SDPA)这个函数,它被用来加速大模型的Attention计算,本文就详细介绍一下它的使用方法,核心内容主要参考了torch.nn.functional中该函数的注释。
2025-03-09 16:43:48
898

原创 大模型推理--KV Cache压缩
这篇博客本应完成于24年9月,但是由于入职新公司之后上下班距离较远下班之后无力再动脑,遂拖到现在才完成,而且再看文章内容感觉不少部分都已过时,但还是可以当做一篇综述性文章来读,了解KV Cache压缩的历史。在之前的博客《》中我们简单提到了KV Cache在超长上下文下过大的问题。为了使得大模型推理能支持超长上下文,我们必须要对KV Cache进行压缩,本博客就介绍一下目前常用的压缩手段。我们还是引用PagedAttention中给出的例子,看一下KV Cache到底有多大。
2025-02-23 18:16:22
1210

原创 大模型推理--MLA
本来想写一篇KV Cache压缩的综述性博客,结果写到MLA部分的时候发现越写越多,完全值得单独拿出来写篇博客,遂从KV Cache压缩博客中单独揪出MLA进行介绍。MLA(Multi-query Latent Attention)是国内创业公司deepseek在24年5月份发布的大模型中用到的KV Cache压缩技术,正是在该技术的加持下DeepSeek-V2可以大幅压缩KV Cache的大小,进而大幅提升吞吐量,也正是从该模型开始,大模型推理的价格一下降低到一个很低的水平。
2024-09-19 23:20:29
3999
2

原创 大模型推理--PagedAttention
在上一篇博客《》中详细介绍了大模型推理的decoding阶段可以采用KV Cache来优化重复计算的原理。虽然KV Cache大幅提升了大模型token生成的速度,但是也引入了新的问题,主要有两个:1. KV Cache在长上下文的情况下占用量非常大,导致batch很小,进而影响吞吐量,甚至根本无法支持长上下文;2. 大模型推理的时候无法预知会产生多少token,所以无法给KV Cache预分配空间,现在的通用做法是按照生成token的上限来分配空间,这产生了非常大的空间浪费。
2024-09-11 09:24:17
1453

原创 大模型推理--KV Cache
KV Cache是大模型推理中常用到的一个技巧,可以减少重复计算,加快推理速度。不少人只是从概念上知道它可以减少重复计算,详细的原理则知之甚少,此外为啥只有KV Cache而没有Q Cache呢,我们在本博客中给出详尽的解释。
2024-09-08 22:15:43
2180

原创 大模型推理--FlashAttention
Attention机制可以算是Transformer的灵魂。正因为有了attention,模型的效果才能大幅提升。但同样是因为attention,导致transformer很难处理超长上下文,因为attention占用显存的大小与上下文长度的平方成正比,会导致上下文很长时显存爆炸。FlashAttention正是为了解决显存爆炸而设计的,它不光解决了显存爆炸的问题,同时也加速了attention的计算,并从数学上保证了结果的一致性。
2024-09-04 18:33:33
2087

原创 常见的GPU性能对比
写这篇博客的目的就是想搞清楚英伟达不同显卡之间的性能差异以及移动端GPU的性能达到了英伟达显卡的哪一代,让自己也让大家明白不同显卡的算力差异。所有的数据均从网络搜索,有不正确的地方欢迎批评指正。同一显卡会有一个首次发布,此外还有一系列的迭代升级版本,我们只考虑首次发布版本的性能。鉴于现在的模型推理大多使用int8来进行推理,所以大家可以着重看一下int8算力那一列。
2024-08-14 17:53:59
7596

原创 借助树状数组的思想实现cuda版前缀和
昨天面试快手,面试官出了一个cuda编程题–实现前缀和。当时没有做出来,一直在思考是否有类似于规约树这样的解法,感觉好难……面试结束后搜了一下cuda前缀和的介绍,发现该问题是一个经典的cuda编程问题,NVIDIA很早之前就给出了一个快速的实现。看别人的博客研究了很久也没太明白,索性自己写一个好了。前缀和每一个位置的计算都依赖于前一个位置,这就导致无法利用规约树求和算法逐层递减问题规模。但是前缀和的每一个位置都是从0开始到当前位置的和,总感觉和规约树求和脱不了关系。
2024-08-08 17:37:04
1197

原创 如何在3s内对10亿(1G)正整数进行排序
很早之前我曾经写过一篇博客《》,详细介绍了如何对基数排序进行优化,使其速度能达到快排的5倍左右。在博客的最后也提到,可以通过修改基数实现对任意int型正整数的排序。在此,我们继续尝试通过并行手段优化基数排序,速度最快可达系统排序的20倍左右,最终可以在3s左右完成10亿(也即1B)int型正整数的排序。
2024-08-05 19:31:05
927

原创 利用二级指针进行链表操作
Linus曾经在网上吐槽很多程序员不会写真正的底层核心代码,并用简单的单链表删除举例。常规的链表删除除了当前的遍历指针还需要维护一个prev指针,用来连接被删除节点的下一个节点,但实际上利用二级指针就可以避免多维护一个指针,使代码更加简洁。Linus的吐槽没错,到目前为止,我几乎没有在实际工作中看到过用二级指针进行链表删除的相关代码,除了各种网页中对Linus描述的解释。二级指针不光能够简化链表的...
2018-10-19 10:27:38
6767
6

原创 区间调度问题详解
今天给大家介绍一下区间调度问题。区间调度是一类难度比较大,但同时应用比较广的问题,经常会在面试中以各种形式出现。本文将会介绍区间调度的各种变形,希望能使大家在面临区间调度问题时得心应手,并可以在实际工作中巧妙应用。1. 相关定义在数学里,区间通常是指这样的一类实数集合:如果x和y是两个在集合里的数,那么,任何x和y之间的数也属于该集合。区间有开闭之分,例如(1,2)和[1,2]的表示范围不同,后者包
2017-12-25 22:25:59
10346
2

原创 快速浮点开方运算
代码下载:开根号的几种算法实现 在之前的博客中我们介绍了数据类型的地址转换,利用它我们可以将一个float型的值直接看成一个int类型。这种地址转换到底有什么意义,或者说有什么用途呢?今天,给大家展示一个实例—快速浮点开方运算,让大家更加明白地址转换的含义和它们之间的对应关系。1 二分法浮点开方也就是给定一个浮点数x,求x√\sqrt x。这个简单的问题有很多解,我们从最简单最容易想到的二分开始讲
2017-12-19 10:35:16
18517
8
原创 如何在3s之内解决17皇后问题
随着LeetCode逐渐被大家熟知,也变得越来越容易了(题号只有51,大部分刷题的人都会刷到),但是LeetCode中的题目规模只到9,所以处理起来不是特别麻烦。18年的时候,楼教主在小马智行的招聘面试中出了一个17皇后的问题,很多人吐槽“出的题好简单,楼教主不刷力扣吗”。不要小看数字17,随着N的增大,N皇后的复杂度会越来越高,时间会以量级的规模上升,我们需要经过很多优化才能使得17皇后的求解速度达到3s以内。
2024-08-02 17:48:24
732
原创 蓄水池抽样算法
最近面试字节,被面试官问到一个这样的问题:给定一个超大的文件,从该文件中随机选取k行文本出来,使得每一行被选择的概率相等。当时一脸懵,后来了解到这个问题需要通过蓄水池抽样算法来解决,经过两天的学习大概搞明白了算法原理,简单记录一下。...............
2022-07-07 11:34:05
473
原创 Leetcode 之 Count Complete Tree Nodes
问题来源:Count Complete Tree Nodes问题描述:给定一棵完全二叉树,求树的节点个数。完全二叉树就是把满二叉树右侧的叶子节点删掉几个构成的二叉树。该问题一看就不能用传统的递归遍历或者层次遍历来统计节点个数,因为这没有利用到完全二叉树的性质,估计提交会超时。所以我们需要另辟蹊径,想想如何利用完全二叉树的性质来统计节点个数。解法一面对树的问题,我们首先想到的思路就是采用递归。针对该问题也可以采用递归实现(当然不是遍历所有节点的递归),不过在递归的时候需要我们发现完全二叉树的一个性质:
2021-01-28 23:13:25
532
原创 leetcode之Long Pressed Name
问题来源:Long Pressed Name问题描述:判断字符串name是否是由长按字符串typed得来。长按含义是name的每个字符可能会重复1到多次。看到该题目第一眼还以为是Is Subsequence,判断短串是否是长串的子序列,随即用该思路实现了一版,结果发现不对。原因在于在本题中要求的长按模式比子序列更为严格:首先name的开头和结尾字符要和typed的开头和结尾字符相同,此外typed的字符顺序要和name相同,中间不得插入其他字符。后来又想到另一种思路:把typed中前后相同的字符进行压缩
2021-01-16 22:16:17
464
1
原创 利用callgrind+gprof2dot+dot进行性能分析
在确保代码运行正确无误之后,我们往往都需要进行性能优化,不过受限于阿姆达尔定律,性能优化需要针对热点代码进行。热点代码可以通过分析算法复杂度获得,也可以通过运行性能分析工具获得。在此我们给大家介绍一组工具callgrind+gprof2dot+dot,可以非常方便地分析代码瓶颈。1.CallgrindValgrind是一款常用的代码分析工具,在大多数情况下我们都会用它来帮我们查找内存泄露和内存读写错误,但实际上,它的功能远不止如此。利用它的callgrind工具我们还可以对代码各部分的运行时间进行分析。
2020-11-16 22:13:27
2520
3
原创 leetcode 之 move zeros
问题来源:move zeros问题描述:给定一个数组,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。看到该问题第一个感觉很easy啊,抬手就来:void moveZeroes(vector<int>& nums) { int start=0,end=nums.size()-1; while(start<end) { while(start<end&&nums[start]!=0) start
2020-10-23 22:12:55
406
原创 leetcode之Isomorphic strings
问题来源:Isomorphic strings问题描述:给定两个字符串,判断它俩是否满足同构关系。同构关系表示两个字符串的字符能一一对应,例如title和paper构成同构关系,而foo和bar不构成同构关系。该问题属于一个比较简单的题目,利用两个map分别对每个字符串的字符建立映射关系即可判断两个字符串是否满足同构关系(注意:必须要用两个map,可以利用ab和aa来理解)。该问题的有趣之处在于它有多种解决思路,而且相比原始思路会使代码更加简洁。解法一如果给定字符串的每个字符都是ASCII码(事实也
2020-10-21 23:20:36
210
原创 Matlab类与链表
最初知道matlab可以创建链表是通过阅读博客:在matlab中实现链表知道的。然后通过仔细阅读matlab帮助文档,终于自己搞明白如何利用matlab创建链表。首先介绍matlab中的类。1 matlab中的class 起初认为matlab是面向过程式的语言,通过编写一系列函数或者脚本完成任务,但其实matlab中也可以通过创建类的方式实现面向对象编程。其实自己早就应该发现,在
2020-02-27 10:02:31
20355
原创 CMake入门
在之前的工作中经常用Makefile来编译项目,但是最近需要阅读别人的项目需要用到CMake,在此记录一下CMake的入门级知识。添加项目中所有的代码文件aux_source_directory命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。#查找当前目录下的所有源文件#并将名称保存到 DIR_SRCS 变量aux_source_directory(. DIR_SRCS)#...
2020-02-16 19:07:15
1169
原创 最小化曼哈顿距离
曼哈顿距离曼哈顿距离和欧式距离一样是一种距离度量标准,不同的是它定义在L1范数下,也即用绝对值来衡量两点之间的距离。在一维空间下,曼哈顿距离定义如下:d(x,y)=∣x−y∣d(x,y)=|x-y|d(x,y)=∣x−y∣在二维空间下,曼哈顿距离定义如下:d(x,y)=∣x1−y1∣+∣x2−y2∣d(x,y)=|x_1-y_1|+|x_2-y_2|d(x,y)=∣x1−y1∣+∣x2...
2019-07-07 18:10:30
13467
3
原创 k均值图像分割的GPU加速
图像分割是指把图像分成各具特性的区域并提取出感兴趣目标的技术和过程,是从图像处理到图像分析的关键步骤。K均值聚类算法是目前最受欢迎和应用最为广泛的聚类分析方法之一。K均值聚类算法用于图像分割具有直观、快速、易于实现的特点。不过当图像很大或者k很大时,采用k均值算法进行图像分割会异常缓慢,所以我们需要对其进行加速。幸运的是,k均值算法最核心的步骤具有很高的并行性,这给我们加速带来了很大遍历。我们既可...
2019-06-04 17:08:45
2428
2
原创 cuda half编程的各种坑
自cuda7.5开始我们可以直接用half(fp16)编程,理论上速度会比float快一倍左右。理想虽好,现实却比较骨感,在实际中会遇到各种坑,最终的结果却是不一定有收益,下面把自己在用half编程中踩过的坑记录一下。1. half编程和计算能力密切相关half编程要求GPU的计算能力要大于等于5.3,这就意味着大家很多GPU不支持此功能。例如,GTX 1050之前的GPU全不支持half计算...
2019-05-24 18:24:24
10073
1
原创 cblas_sgemm和cublasSgemm参数详解
机器学习最核心的底层运算肯定是矩阵乘法无疑了,为了让矩阵乘法执行更快,大家也是绞尽脑汁。从算法层面,stranssen算法将矩阵乘法复杂度由O(n3)O(n^3)O(n3)降到O(n2.81)O(n^{2.81})O(n2.81),最新的算法好像已经降到O(n2.37)O(n^{2.37})O(n2.37)左右了(Coppersmith–Winograd algorithm),但这只是理论复杂度,...
2019-05-21 17:42:30
11172
2
原创 leetcode 之 Merge k Sorted Lists
问题来源:Merge k Sorted Lists该问题是一个很经典的问题,给定k个有序链表将其合并成1个有序链表。很多人应该在实际的面试中遇到过该问题(至少我会经常问面试者该问题,因为接着可以问堆相关的算法~)。为啥要针对该经典问题写篇博客呢,是因为该问题确实会在日常工作中出现,但是却很少有人想到用优化的算法来解决该问题。我们先看一下该问题的两种优化解法。解法一最常用的方法是利用最小堆(链...
2019-03-16 15:27:17
1883
原创 利用ARM NEON intrinsic优化常用数学运算
ARM NEON是arm平台下的SIMD指令集,利用好这些指令可以使程序获得很大的速度提升。不过对很多人来说,直接利用汇编指令优化代码难度较大,这时就可以利用ARM NEON intrinsic指令,它是底层汇编指令的封装,不需要用户考虑底层寄存器的分配,但同时又可以达到原始汇编指令的性能。 所有的intrinsic指令可以参考博客《ARM Neon Intrinsics各函数介绍》,本...
2018-04-14 21:13:41
14869
5
原创 arpa2fst 原理详解
在基于 wfst 的语音识别中,需要将 HCLG 四个不同层次的模型复合(composition)在一起构成一个超大的解码网络,其中的 G 即是语言模型的 WFST表示。但是我们常见的语言模型并不是以 WFST 形式存在的,而是基于 ngram 实现的,通常以 arpa 文件形式存在。所以复合的第一步就是将 arpa 文件转为 wfst,在 kaldi 中以 arpa2fst 脚本形式存在,我们在此
2017-12-08 22:15:26
9027
9
原创 语音识别中的lattice与confusion network
如果大家使用搜狗输入法的语音识别可能会发现在我们说我一句话之后,语音识别会返给你多个结果,这些结果之间只有微小差异(很多时候是发音相同的替代词)。绝大多数时候,输入法给出的结果就是我们需要的,但是偶尔也会出现候选结果中的才是我们需要的。你可能会好奇这些候选结果是如何产生的,在本文中我就给大家简单介绍一下。one best最初的语音识别结果只有一个,也被称为one best,即一个最优结果。语音识别解
2017-08-27 17:05:52
12476
5
原创 流式数据中的数学统计量计算
在科技飞速发展的今天,每天都会产生大量新数据,例如银行交易记录,卫星飞行记录,网页点击信息,用户日志等。为了充分利用这些数据,我们需要对数据进行分析。在数据分析领域,很重要的一块内容是流式数据分析。流式数据,也即数据是实时到达的,无法一次性获得所有数据。通常情况下我们需要对其进行分批处理或者以滑动窗口的形式进行处理。分批处理也即每次处理的数据之间没有交集,此时需要考虑的问题是吞吐量和批处理的大小。滑
2017-07-03 22:38:04
6825
原创 Linux下统计文档中每个字符出现的次数
给定一个中文文档,我们想统计其中每个字出现的次数该怎么做呢?如果是英文文档,这个问题有比较固定的思路:用tr命令或者awk命令按照每行的空格将单词切分到多行,然后sort命令排序所有的行,最后uniq命令统计重复行的次数即可获得每个单词出现的次数。但是换成中文文档之后,tr或者awk命令就无法再根据空格将一行汉字切分到多行,需要我们更换其他命令。 一种可行的方法是借用cut命令。cut命令
2017-03-24 10:42:02
9415
1
原创 利用FFmpeg将pcm文件转成wav文件
现在需要利用cool edit对一批pcm音频文件进行分析。由于没有相关信息指定音频的采样率,信道数和精度,所以cool edit在打开一个pcm的时候需要让我们指定相关参数。当需要分析的pcm非常多时,每次都需要指定相关参数就显得非常麻烦。我们可以给pcm文件添加一个wav文件头来指定相关参数,从而无需每次打开进行设置。 给原始的pcm数据添加wav头不是什么麻烦事,我们完全可以写一个c
2017-03-12 14:24:44
13713
翻译 《Machine Learning is Fun Part 6: How to do Speech Recognition with Deep Learning》译文
最近看到一篇介绍语音识别的《博客》,感觉写得不错,正好自己也在搞语音识别,就把它翻译成中文,希望对语音识别感兴趣的同学有所帮助。(囧:原来网上早就有翻译了,白浪费两天时间翻译,大家选择性围观)语音识别正在占领我们生活的各个方面,手机、游戏手柄和智能手表中都会发现它的身影。同时它也在使我们的家庭更加智能,只需要花费50美元我们就可以买到亚马逊的Echo Dot—一个可以帮我们订披萨,获得天气预报,甚至
2017-03-02 22:48:45
2401
原创 NDK编程的一个坑—Arm平台下的类型转换
最近在做DNN定点化相关的工作,DNN定点化就是把float表示的模型压缩成char表示,虽然会损失精度,但是由于DNN训练的模型值比较接近且范围较小,实际上带来的性能损失非常小。DNN定点化的好处是可以以4倍的效率压缩模型,这个在移动端会具有比较大的优势。 做完定点化之后,在x86服务器上验证没有问题,但是利用NDK移植到arm移动端却一直得不到正确结果,真是一时头大。通过仔细调试,最终
2017-01-15 15:14:02
2400
1
原创 leetcode之Find All Numbers Disappeared in an Array
问题来源:Find All Numbers Disappeared in an Array 很久没有刷题了,感觉大脑开始迟钝,所以决定重拾刷题的乐趣。一开始不要太难,选一些通过率高的题目做,然后就看到了这个题目。我有些吃惊,这个题我虽然知道两种解法,但本身还是有难度的,居然通过率这么高。然后就搜索相关网页,看到一个和它很接近的题目《Find All Duplicates in an Array》,
2016-12-24 18:21:10
10710
原创 Linux下的有用命令
在之前的博客《Linux下常用命令与使用技巧》中,介绍了Linux的常用命令,在今天的博客中,给大家介绍其他的有用命令。1.文本转换命令在Linux下工作,我们不可避免地要和文件格式做斗争,相信大家也深刻地体会过格式的复杂性。今天给大家介绍几个在实际中经常用到的和格式相关的命令。export命令在linux命令行中输入汉字的时候有时候会显示乱码,这时我们就需要设置一下系统的编码方式。可以先用loca
2016-12-10 18:21:57
2661
原创 链表的替代品—内存池
链表是大家非常熟悉的数据结构,使用频率也非常高,但是链表有几个缺点。首先,我们每创建一个节点,都要进行一下系统调用分配一块空间,这会浪费一点时间;其次,由于创建节点的时间不固定,会导致节点分配的空间不连续,容易形成离散的内存碎片;最后,由于内存不连续,所以链表的局部访问性较差,容易出现cache缺失。 针对链表的上述问题,在实际工作中,我们很少直接用链表,而是采用链表的替代品—内存池。上过
2016-11-27 19:06:16
2753
原创 基于递归分割的迷宫生成算法与自动寻路
代码下载:基于递归分割的迷宫生成算法与自动寻路 今天给大家介绍一个图形学里的东西—迷宫的生成算法。迷宫的生成算法有很多种,比如基于深度优先和广度优先的生成算法,在此介绍另外一种方法,基于递归分割的迷宫生成算法。网上大部分迷宫生成算法生成的迷宫墙壁都是线条,本文生成的迷宫墙壁是正方形,先给大家看个示例: 下面就开始正式介绍基于递归分割的迷宫生成算法。1. 生成迷宫在生成迷宫之前,我们需要先确定
2016-07-31 14:06:43
20574
12
原创 leetcode之Largest Rectangle in Histogram
问题来源:Largest Rectangle in Histogram 问题描述:给定一个长度为n的直方图,我们可以在直方图高低不同的长方形之间画一个更大的长方形,求该长方形的最大面积。例如,给定下述直方图,我们 可以以高度5宽度2画一个更大的长方形,如下图,该长方形即是面积最大的长方形。 该问题是难度比较大的问题,但是很出名,经常作为面试题出现。最近陈利人老师给出该问题的一个O(n)
2016-07-30 13:47:33
9164
基于递归分割的迷宫生成算法与自动寻路
2016-08-01
基于Access数据库的matlab学生成绩管理系统
2014-06-29
哼唱检索的并行化方法研究与实现
2014-03-18
vim高亮插件
2013-06-20
marsyas工作过程
2012-07-09
TCP实现windows和linux之间文件传输
2012-03-02
高效的霍夫曼文本压缩
2011-10-31
基于最短路的GPS地图导航
2011-02-28
PL0 集成开发环境
2010-07-12
PL0递归下降编译程序
2010-03-12
用霍夫曼树实现的文本压缩*(升级版)
2010-03-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人