- 博客(68)
- 收藏
- 关注
原创 再谈全排列
画了树之后,你就知道,这个问题,是一个循环遍历的问题,但是再遍历的过程中,你需要基于过去的状态(哪些元素被存储了),改变你之后的行为。我们还需要考虑终止条件,然后,这是一个回溯的问题,那么你需要考虑的就是回溯之后需要怎样的处理。我们可以判断list的长度,如果list的长度和原数组一致,我们就可以保存。我们需要重置两个状态,一个是path中的元素,另一个是遍历到的元素的判断。每次做全排列的题目,我都要孕育好一阵子,到底怎么去思考这个问题呢?首先,我觉得最好的方式就是画个树。1. 如果保存过去的状态。
2024-09-05 17:06:49
308
原创 CPP八股文-模板类.内存管理,指针
无论是类模板还是函数模板,都是一个蓝图,本身不是一个类或函数,编译器用模板产生指定的类或函数的特定类型版本。产生模板的特定类型实例的过程称为模板的实例化。所以一般将模板类放在头文件中,在编译时,基于使用的具体对象的类别,生成对应的对象。继承语言特性带来的多态性,是程序运行时体现出来的,称为运行时多态性。泛型编程的多态性,是在编译阶段体现的,称为编译时多态性。
2024-09-02 23:21:31
204
原创 八股文整理C++
调用 `basePtr->show()` 时,虽然 `basePtr` 类型为 `Base*`,但由于动态绑定,程序在运行时会调用 `Derived` 类的 `show()` 方法,而不是 `Base` 类的 `show()` 方法。在这个例子中,`Base` 类是一个抽象类,因为它包含一个纯虚函数 `show()`。在这个例子中,尽管 `b` 是一个指向 `Base` 类型的指针,但由于 `show()` 是虚函数,所以在运行时,它调用了 `Derived` 类的 `show()` 函数。
2024-09-01 10:15:52
1285
原创 Swin-Transformer论文阅读
在CNN对于图像分类,目标检测等问题的探索中,大家已经发现,母舰检测,语义分割这类任务,相比于图像分类对于网络backbone有着不一样的需求。而基于vit对于图像分类问题的探索,接下来,大家可以依葫芦画瓢,尝试解决更有挑战的问题了。关于目标检测,语义分割这类任务,通常需要网络具有分层提取不同颗粒度的特征,并且,网络的是输入可能是更高分辨率的图像,输出也是更精细的特征,比如语义分割的mask。
2024-08-20 08:49:58
953
原创 VIT论文阅读: A Image is Worth 16x16 Words
在2024年,大家都知道了transformer的故事,但是在4年前, CNN和Transformer谁才是CV的未来,还没有那么确定。在简介部分,作者提到了一个令人失望的事实,在基于imagenet的实验中发现,transformer的表现差于同尺寸的ResNet。作者把原因归结到bias translation equivariance and locality,这些CNN具有,但是transformer不具有的特性上。如下图【1】
2024-08-18 10:47:46
615
1
原创 AOT & JIT介绍
可以看到,在jit模式下,第一次运行涉及到图的构建,会需要更长的时间,但是在完成warm up之后,速度会比第一次有明显提升。因为,在运行的时候,我们只需要编译一部分的程序。此外,JIT还会基于输入的大小,类型进行图的优化,还会将此前见到的一些输入类型放入缓存,并重新利用。此外,JIT还具有一高效特性,dynamic tracing, 基于数据流,可以生成计算图,也就是DAG(directed acyclic graph),基于该图,我们可以进行进一步的优化,某些情况下,该优化效果甚至强于AOT。
2024-08-17 18:15:51
593
原创 ONNX导出问题解析
在torch模型转换为onnx的过程中,使用的是torch.jit,ScrptModule,而不是torch.nn.Module,关于这两者的区别,有不少更好的视频介绍,简单理解为前者用于提供模型静态图推理,强调性能,后者强调“简洁,美丽”,是一种不关注性能的动态图。今天在进行onnx的模型导出时,遇到了一个问题,如标题,就是“torch.roll"这个算子在从pytorch到onnx的转换过程中会失效。对应的解决方法是,把pytorch的版本升级,原先的版本是1.8,后来升级到了1.10。
2024-08-17 08:06:56
269
原创 yield and generator in python
首先,假设大家都对于pytyhon的List comprehension的使用有了一定经验(它可以用于list,set,和dict哦)不熟悉的参考介绍: Comprehending Python’s Comprehensions – dbader.orggenerator是哦嗯一种返回lazy iterator的特殊类型函数。list comprehensions return full lists, while generator expressions return generators.如下面代码,分
2024-08-03 15:21:50
738
原创 理解slot mapping
这表示,基于block size为8的kv cache,sequence length为16时,slot mapping的分配. 其中,seq将占据两个block,每个slot mapping中sequnce对应的block index就是[0] *8, [1] *8, 而在block中的index对因的就是[0,1,2,3,4,5,6,7,8]..为了理解它,尝试参考源代码构造一个简单的slot mapping。今天尝试理解slot mapping的作用, 参考。
2024-07-26 13:32:00
300
原创 VLLM代码解读 | VLLM Hack 3
这里,hidden_states尺寸为 [26,768], logits的维度为[4, 50272], output对应的数据类型为vllm.sequence.SamplerOutput. 这里4对应的就是输入数量,26对应的是输入的总token数。至此,我们完成了一次迭代,得到了请求的输出,如下面的代码,但是,之前讨论的流程中,我们似乎没有找到区分decode和prefill流程的模块,必然是忽视了一些重要细节。看到这里,我已经失去耐心了,meta几个文件的代码怎么被搞的这么复杂。
2024-07-25 08:51:14
572
原创 VLLM代码解读 | VLLM Hack 2
这个对象用于保管基于同一prompt生成的sequences,可以想象,当进行beam search的时候,我们需要保证sequence的平行宇宙,对应确实需要更好的数据结构去维护它。需要注意的是,scheduler中维护了三个队列,分别为waiting,running,swapped。到目前为止,我们基本完成了输入的封装,让它成为了一个sequencegroup,包括输入对应的token,一个ID,并且交给scheduler调度。因为llmdemo中默认为4的输入,下列的操作我们要进行4次。
2024-07-25 07:50:23
190
原创 VLLM代码解读 | VLLM Hack 1
好,我要去上班了,今天,我们从VLLM的example调用,见证了llm如何启动offline inference,然后基于输入的string一步步封装,目前为止,我们看到它被封装成了sequence这个对象,并且已经考虑到了block size这些和显存占用直接相关的参数,接下来会发生什么?接下来调用_add_processed_request函数,这里使用了一个重要信息,block_size:16,基于它和input信息,我们构建sequence对象。
2024-07-24 08:54:31
310
原创 Llama中模块参数大小
对于一个batch的数据来说哦,因为llama2 7B 包含32个transformer,所以,当使用FP32表达时, 对应一个batch的kv cache的大小为128 * 32 * 128 *2 * 32 * 4byte= 0.5GB.llama2设定 local_kv_heads为32,head_dim为128。所以,kv cache的尺寸为 [1, 512,32, 128] * 2。* 当batch 的最大长度增大时, Kv cache线性增长。* 当batch变大时,kv cache线性增长。
2024-07-21 22:37:44
410
原创 llama2阅读: logits是什么?
在llama2中,当模型进行推理后,得到的是一个[1,n, 32000]的输出,然后基于第n个向量[1,32000], 可以进行sample_top_p,或者argmax的处理,来获得下一个token对应的index,只需要利用tokenizer的解码就可以生成token了。通过这种方式,我们可以实现对对于token的缓存和更新。而在llama2的代码中,同样有logits的使用,那么针对llama2,logits的作用是什么呢?
2024-07-06 06:48:36
433
原创 Lex Fridman Podcast with Andrej Karpathy
但是更令我感到认同的是,他对于公司治理也有自己的观点,他认为start up就需要 聪明的人有big hammer。我不太喜欢Lex Fridman的声音,总觉得那让人昏昏欲睡, 但无奈他采访的人都太大牌了,只能去听。但是听着听着,就会觉得有深度的采访这些人,似乎也只有他这种由研究员背景的人能干, 另,他提的问题确实具有很好的引导效果,有时候非常虚,有时候又直接具体到问你用什么IDE写代码。当Lex问道,你认为LLM是一切的开始,还是中途,还是结束时,他坚定的回答,是开始。
2024-07-05 22:38:36
317
原创 关于目标检测的bbox
box的前两个数字可能表达 [x_min, y_min],或者[x_center, y_center], 后两个数字可能表达[x_max,y_max]或者[w, h]. 不同的数据集或者检测模型有不同的定义,比如coco中, box 定义如下。关于目标检测的bbox,最让人抓狂的,就是你永远不能对于box的定义掉以轻心, 虽然box就是一个正方形,四个数字,但是如果没有正确理解其对应的含义,会对于mAP的计算等任务产生灾难性的影响。所以,当你的目标检测可视化不正确的时候,也许可能只是box的使用有问题。
2024-07-02 21:39:02
338
原创 基于nsight_compute进行kernel性能分析
当利用nsight进行性能分析时,当涉及到内核级别的性能分析时,nvidia提供了系统级别(nsight system),和内核级别的性能分析工具(nsight compute)。其中,内核级别的性能分析,可以检查kernel实现的性能好坏及bottleneck。本次主要对比的是cublas和基于naive cuda实现的kernel性能对比:cublas的实现可以理解为最优解,而naive cuda的kernel没有进行,global memory。共享内存或者寄存器相关的优化。
2024-06-23 11:30:44
888
原创 RAG_Example
1. 文本转换过程中,PDF的信息可能会丢失和损坏。比如对于一个只包含很多小标题的文档,我怀疑是否能够获得足够多的有效信息。此外,一些文档中的信息,是通过图文结合的方式,这种信息是否能有效获取呢?2. LLM基座模型的选择比较重要,目前来看,模型可以理解中文,但是不能说中文,这是一个问题,想到的解决方案就是替代基座模型。3. 目前由于使用不够充分,无法给出结论,但是目前感觉每个环节都可能会出问题。主要流程包括下面几个模块,每一个模块都有很多选择,而不是唯一解。但这里可以感受到潜在的几个问题。
2024-06-14 07:50:39
198
原创 llama2模型参数
tok_embeddings.weight [32000, 4096]norm.weight [4096]output.weight [32000, 4096]layers.0.attention.wq.weight [4096, 4096]layers.0.attention.wk.weight [4096, 4096]layers.0.attention.wv.weight [4096, 4096]layers.0.attention.wo.weight [4096, 4096
2024-06-09 16:50:13
595
原创 stack overflow复现
最后结果是7929kB时, 发生stack overflow. 通过ulimit,可以看到栈的理论最大数值(单位KB),基本一致。其实我们可以更改stack的大小。这个例子想说明的是, 栈的存储空间很小,基于我的电脑,默认情况, 只能存储8192KB的数据,当你在内存的栈中,存放了太多元素,就有可能在哦阿城stack overflow这个问题。对应的一张1280 * 720的图片载入到栈中,就会造成overflow!下图,是我写的程序,不断的创造1KB的栈,来看看执行了多少次。今天看看如何复现这个问题。
2024-06-08 10:47:03
175
原创 CLIP模型NAN问题解决
之后,决定从python代码的角度去寻找问题的答案,经过单步调试,发现,在transformers库的/modeling_clip.py文件的 _build_causal_attention_mask()函数中,存在inf的输入,接着,把它用-10000替代。早有耳闻,clip模型会在fp16下发生NAN的问题,但是今天基于2080Ti测试,发现在单精度下的tensorrt推理同样存在NAN的问题,我甚至一度怀疑是tensorrt的推理代码有问题。然后,对比tensorrt的输出结果,符合预期。
2024-05-30 23:07:12
248
原创 python编程不良习惯纠正: 慎用顶层代码
从开发者的角度,当时开发的时候,可能这样的操作,没有造成明显的问题,但是作为使用者,这样的写法会造成对于程序的理解和执行很大的干扰,因此,我们还是建议将每个模块的可执行部分,封装到main函数中,如下。这几天在跑一个开源代码时,发现,pdb断点不起作用,经过一番检查,发现代码在from show import 时,有大量的操作。而当其他文件调用该模块时,即使是from show import show, show.py中的顶层内容也会被全部调用。经过进一步的检查发现,
2024-05-26 11:12:42
239
原创 cuda-gdb小感
1. 如何kernel内的断点失效,可以在kernel被调用前添加断点,用step的形式进入。4, 优先使用 cuda-sanitizer 进行debug。这两天在学习cuda-gdb,使用的过程中有如下小感。2. 打印数组(你可以打印的不止一个元素)4. 显示device信息。
2024-05-26 09:03:13
269
原创 SmoothQuant量化介绍
针对smoothquant这种方法的理解,我觉得可以分为几个层次,首先从思想层面,它发现了输入的activation具有channel wise的误差,然后,试图把来自activation的误差和量化步长转移一部分到weight中。,量化的颗粒度也可以有所不同,包括per-tensor, per-token, per-channel, group-wise。首先,int8量化的方式可以用公式表达,翻译一下找到int8的数值范围,基于权重的最大值,进行一个线性映射。此外,项目的代码也值得一读。
2024-05-19 07:19:05
786
原创 lora体验
现在如果想体验stable diffusion的lora功能,有很多种渠道吧,虽然lora是微软开源,但是cloneofsimo提供了适配stable diffusion的lora流程。代码基于cli_lora_pti.py 执行, 针对输入的关键词,我们生成对应的token id. 其实就是建立embedding的映射了。接下来,我们可以选择是否进行inversion, 如果选择训练inversion,我们会对于text encoder进行训练,然后,我们可以inspect_lora(什么意思呢?
2024-05-11 11:08:38
440
原创 XTuner笔记
方法:在模型的每一层之间添加可训练的小规模的网络,冻结原始网络权重,以此来减少fine-tune所需要的参数量。应用:适用于那些希望在保持预训练模型结构不变的同时,对模型进行特定任务调整的场景。缺点:引入推理延时在LoRA的基础上,添加了NF4的数据压缩(信息理论中最有的正太分布数据量化数据类型),进一步减少了显存和内存的消耗;然后添加一组可学习的LoRA权重,这些权重通过量化权重的反向传播梯度进行调整。块状 k-bit 量化:既压缩了数据,又解决了异常值(我理解为噪声)对数据压缩的影响。
2024-05-10 17:35:06
435
原创 OpenCompass笔记
但是,大模型的评估是很复杂的,如果说小模型的测试就像体检,指标明确,那么大模型的评测就像高考,怎么考核,考核什么,分数线多少,都是需要仔细讨论的。可以想见的是,这是一个很难公正评价的事情,因此,引入了下面的介绍。假设一个模型,被2bit量化,然后一直瞎说话,怎么办?你是不是应该评估一下这个模型的效果?
2024-05-10 17:11:59
243
原创 智能体Agent笔记
Lagent是一个智能体框架,而legoagent是一个diy算法的模块。从架构思想上,我还是很认可的。我个人觉得智能体是个饼,最核心的问题是,你如何解决大模型的幻觉问题?3. 能运用推理能力理解信息,解决问题,产生推断,决定动作。1. 可以感受环境中的动态条件。2. 能采取动作影响环境。
2024-05-10 17:06:06
192
原创 书生浦语作业6 Lagent
安装Lagent 和 AgentLego 和相关依赖。因为流程完全按照上述链接执行,不copy代码了,简述流程。5. 调用Lagent Web Demo。在网页端,我们可以调用简单的服务。4. 启动lmdeploy服务。1. 创建lagent文件夹。2. 配置conda环境。
2024-05-10 15:55:50
259
原创 书生作业:LMDeploy
自己随便说几句。关于模型部署,很有趣的一件事就是,它一路随着深度学习训练一起发展,尽管例如tensorrt等工具的出现,不断试图降低部署门槛,但是实际上,每一次AI的升级,似乎让这个细分领域没有因为工具易用性的提高而萎缩,反而量化,蒸馏,各个细分领域开支散叶。你说未来的模型部署是什么样呢?
2024-05-10 15:26:44
634
原创 书生作业:XTuner
作业链接: https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md xtuner: https://github.com/InternLM/xtuner首先,按照xtuner的指令依次完成conda环境安装,以及xtuner库的安装。然后,我们开始尝试使用QLora 进行Finetune。通过执行generate_data.py,我们实现对数据的处理。需要复制下列内容然后,会看到personal_assistant.json
2024-05-10 12:36:58
296
原创 RAG技术简介
parametric memory指的是把知识存储在一个分布中,最简单的,比如,我们用高斯分布来表达一个数据时,这就是一种 parametric method,而Bert,GPT这类模型,都是把知识存储在权重中。如下图,基于特定知识,我们维护了一个向量数据库,用户的提问会被转换为增强的提示词,然后传入LLM中。其中,Retrever(DPR)是基于编码器的结构。我不喜欢RAG的思路,号称是non-parametric的方法,实际上也引入了编码器解码器的结构去解决额外难题,另外,RAG的显存占用多大呢?
2024-05-10 11:18:06
637
原创 书生作业:RAG
作业:https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/homework.md。教程:https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/readme.md。6.再创建一个测试用的问询列表,用来测试拒答流程是否起效.在确定好语料来源后,创建 RAG 检索过程中使用的向量数据库。5.下载茴香豆的语料库,提取知识库特征,创建向量数据库。增加茴香豆相关的问题到接受问题示例中。
2024-05-10 10:03:30
385
原创 书生作业2
如果使用提示词“讲一个笑话.200字以上”, 会有偶发的输出较短的笑话的情况。生成200字以上的笑话,可以看到使用不同的提示词,会有不同的效果。如果使用提示词“讲一个200字以上的笑话”时,结果相对稳定。另外一种,可以利用modelscope.hub进行下载。一种登陆hugging face进行直接下载,这里用llava2做了一个demo。
2024-04-04 22:04:18
245
原创 书生浦语笔记一
2023年6月,InternLM的第一代大模型正式发布。仅一个月后,该模型以及其全套工具链被开源。随后,在8月份,多模态语料库chat7B和lagent也被开源。而在接下来的9月份,InternLM20B的开源发布进一步加强了全线工具链的更新。最终,2024年1月17日,InternLM2也正式开源。InternLM2提供了两种不同参数量级的模型,分别是7B(Billion)和20B。前者更轻量级,适用于一般性应用,而后者则能够支持更复杂的场景。
2024-03-31 17:41:49
620
原创 GPT3, llama2, InternLM2技术报告对比
GPT3(September 22, 2020)是大语言应用的一个milestone级别的作品,Llama2()则是目前开源大模型中最有影响力的作品,InternLM2(2023.09.20)则是中文比较有影响力的作品。今天结合三篇技术汇报,尝试对比一下这三个方案的效果。
2024-03-31 17:23:48
1588
原创 YOLO系列论文阅读(v1--v3)
YOLOV2中,作者对于网络结构,和训练策略都做了调整和改进。对于网络架构的修改,有效的弥补了YOLO的短板,而关于训练策略的优化,作者展示了统一目标检测和分类这两类任务的雄心。此外,也提到了在物体分割领域的应用可能。此外,作者的笔风也逐渐飘逸,说实话better,stonger,faster作为小标题,并不利用读者梳理论文的框架。Yolov3的创新点给人一种重剑无锋的感觉,没有太多冗余的更新,但是backbone优化,和多尺度信息引入又大大的改进了YOLOv2的效果。
2024-02-23 16:20:54
1361
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人