自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(260)
  • 资源 (1)
  • 收藏
  • 关注

原创 历时3个月,代码开源了,给所有想入门 AI 视觉的朋友

本项目旨在完成对 AI 的计算机视觉的入门学习,并且在 Intel CPU 上完成以 resnet50 为基础的神经网络的全部手写,以及性能优化。首先通过对一些经典的传统计算机视觉算法进行实操,理解计算机视觉的含义;随后以 resnet50 神经网络为例子,系统的讲解一个 AI 模型的基础算法原理和相关背景知识。最后通过本仓库中的代码实战,从零手写 resnet50 神经网络,完成任意一张图片的识别,以及神经网络模型的性能优化。

2024-02-25 21:12:10 1034 2

原创 手把手教你升级GPT-4,内附详细步骤

在升级之前,你需要先有一个 GPT-3.5 的账户,GPT-3.5 是可以免费使用的,并且基本可以满足很多人的日常需求。而大部分人选择升级 GPT-4 的原因,则是看中了。

2024-01-11 19:24:03 2438

原创 计算机视觉入门与调优

大家好啊,我是董董灿。在 CSDN 上写文章写了有一段时间了,期间不少小伙伴私信我,咨询如何自学入门AI,或者咨询一些AI算法。90%的问题我都回复了,但有时确实因为太忙,没顾得过来。在这个过程中,我发现很多小伙伴问的问题都类似:比如如何入门计算机视觉,某某算法是做什么的,有什么作用。之前写的文章由于过于分散,不成体系,很多知识点没有串联起来。然后依托Resnet50这一经典图像分类网络,将涉及到的算法都剖析和实现一遍,最后亲自完成该神经网络的搭建,并带你完成任意图像的识别。

2024-01-04 22:16:26 1357

原创 大模型的自我监督

因此,每给定一个单词(Token),模型都要预测下一个词,然后将预测出来的词加上原来已有的词作为新的输入,继续预测下一个词,如此反复迭代。事实上,很多自然语言处理(NLP)的模型,尤其是上文提到的大语言模型(如GPT系列),都是通过无监督学习或自监督学习的方式进行训练的。在 GPT 等模型的训练时,如果给定上述句子作为模型的输入,是希望模型可以预测出下一个词是什么,这是模型的任务。在这种训练模式下,模型被训练来预测给定前文的下一个词,这样,模型就能学习到文本的顺序结构和语言的生成过程。

2024-04-15 21:49:07 908

原创 没有算法大佬,都是草台班子

大家都经历过高考,高考成绩好说明你高中花的时间多,刻苦努力,考的不好说明高中有点懒散,不够刻苦,但无论如何,你都学了,而且坚持学了高中3年的时间。去年我业余时间,花了 3 个月开源了一个入门 AI 视觉的项目,面向的是AI小白同学们,就是希望可以帮助想要从零学习 AI 的同学快速入门。所以,小白从零学习 AI 也不要怕,学到及格线就可以去工作,学习不难,还是那句话,难在入行,难在第一份工作的选择。这位小伙伴则相反,从心理学的双非院校毕业后,就直接去做了AI算法,虽然是小公司,但我觉得毕竟是已经入行了。

2024-04-15 21:46:19 733

原创 面试字节被挂了

减少参数量可以这么理解:在输出相同特征图的前提下,将一个普通的卷积,替换成一个1x1的卷积加上另一个卷积,先进行降维,然后计算,如此一来整体的计算量要比普通卷积少。由于1x1卷积不存在长宽方向的像素融合,所有的计算都是通道之间的交叉计算,因此,可以更好的完成通道间的融合,而通道代表的是特征,因此可以更好的实现特征融合。上可以看出,卷积核的个数就是卷积输出的通道数。这是因为1x1的卷积,卷积核长宽尺寸都是 1,在计算的过程中,不存在长、宽方向像素之间的融合计算(乘累加计算),而仅仅存在通道之间的融合计算。

2024-04-07 22:37:15 4540 1

原创 99、仓库代码使用说明

另外,如果你想运行 python/model 目录下的文件,需要 cd 到 model 目录,安装解析模型相关的依赖库(可以不运行,我已经运行完并且将解析好的文件放在了 model 目录下,可直接用)。此外在仓库主目录下,还增加了一个 new_version_with_notes 目录: 这是本仓库的一个新版本,包含上述所有代码,里面的目录结构复刻了上述结构。6 个目录相互独立,可以独立运行任意目录中的代码,对比查看在迭代过程中,由于代码的优化带来的性能提升效果。

2024-04-07 22:34:52 29

原创 98、小册内容总结

本项目旨在完成对 AI 计算机视觉的入门学习。首先通过对一些经典的传统计算机视觉算法进行实操,理解计算机视觉的含义;随后以 resnet50 神经网络为例子,系统的讲解一个 AI 模型的基础算法原理和相关背景知识。最后通过本仓库中的代码实战,从零手写 resnet50 神经网络,完成任意一张图片的识别,以及神经网络模型的性能优化。传统计算机视觉部分,会有灰度图、RGB、均值/高斯滤波器、利用 Canny 算子对图像进行边缘检测、利用大津算法对图像进行分割等小的实操项目。

2024-03-07 22:40:22 92

原创 97、我对 AI 模型调优的经验和认识

做 AI 算法调优一些年了,这些年中接触了不少模型,也做过不少在 ASIC 芯片进行模型加速的案例。在接触的模型中,有一些模型有着非常奇怪的分支结构,有的还有奇怪的 tensor shape,还有的有这奇怪的自定义算法。但在模型优化时,为了将一个 AI 模型性能调到最优,也是无所不用其极,能用到的办法几乎都会尝试一遍。但是,有方法不代表有效。很多时候,在一个 AI 平台上有效的优化手段,换到了另一个平台上就失效了。

2024-03-07 22:39:01 109

原创 小白如何快速入门计算机视觉?

本项目旨在完成对 AI 的计算机视觉的入门学习,并且在 Intel CPU 上完成以 resnet50 为基础的神经网络的全部手写,以及性能优化。首先通过对一些经典的传统计算机视觉算法进行实操,理解计算机视觉的含义;随后以 resnet50 神经网络为例子,系统的讲解一个 AI 模型的基础算法原理和相关背景知识。最后通过本仓库中的代码实战,从零手写 resnet50 神经网络,完成任意一张图片的识别,以及神经网络模型的性能优化。

2024-03-06 21:53:19 1732 1

原创 96、C++ 性能优化一览

在对 C++ 版本的 resnet50 经过大约 5 个版本的优化之后,性能也基本达到了预期。至少利用手写的 resnet50 在 CPU 上推理一张图片感觉不到卡顿了。下面对这几个版本的性能优化做一个总结。

2024-03-06 21:51:14 196

原创 95、评估使用多线程优化带来的性能提升

在相同的环境下,分别运行 5th_codegen 和 6th_multi_thread 下的 compile.sh 脚本进行代码编译,然后运行编译后生成的可执行文件 ./resnet。可以看到性能提升非常明显:优化前平均推理延时为 772 ms,优化后为 291 ms,性能提升了大概 260%,效果很好,而且推理结果也是正确的。注意:不同电脑机器不同环境下测出来的性能会有差异,大家只需要比对性能提升的相对值即可。本节评估一下,通过对卷积的 co 维度进行多线程切分之后,对于模型的性能提升。

2024-03-06 21:50:22 44

原创 94、利用多线程优化卷积运算

上一节简单介绍了多线程的概念,同时也介绍了在使用多线程编程时,对于数据在线程间的切分,应该遵循的一个原则:那就是切分独立的数据快,而不切分有数据依赖的数据块。最后还抛出了一个问题:对于卷积算法而言,你觉的切分哪个维度最合适呢?

2024-03-04 21:54:45 134

原创 93、多线程概念简介

多线程是一种并发编程技术,它允许程序同时执行多个线程,从而提高程序运行速度。在开始多线程优化之前,先看两个概念:进程和线程。进程我们可以简单粗暴的理解为一个应用进程,比如你在电脑上开一个QQ聊天,那么一个QQ应用就是一个进程,但如果你用一个QQ和多人同时聊天,可以认为每个人聊天都是一个线程,你此时在多线程工作。对应到 C++ 的 resnet50 示例中,当你在 linux 上执行 ./resnet 时,就开启了一个进程,在没有进行多线程编程的情况下,resnet 默认使用一个线程。

2024-03-04 21:53:36 36

原创 从零入门 AI 视觉:历时 3 个月,我的代码仓库开源了

本项目旨在完成对 AI 的计算机视觉的入门学习,并且在 Intel CPU 上完成以 resnet50 为基础的神经网络的全部手写,以及性能优化。首先通过对一些经典的传统计算机视觉算法进行实操,理解计算机视觉的含义;随后以 resnet50 神经网络为例子,系统的讲解一个 AI 模型的基础算法原理和相关背景知识。最后通过本仓库中的代码实战,从零手写 resnet50 神经网络,完成任意一张图片的识别,以及神经网络模型的性能优化。

2024-02-29 21:39:25 1413

原创 92、评估代码生成操作带来的性能提升

这是因为在目前很多主流的推理框架里,如TVM,MLIR中,都有比较完善的 codegen机制。他们大都是将一个模型中的算法,通过一些中间表示(IR)的形式表示出来,然后对这些中间表示进行优化(包括冗余计算消除,流水排布,指令调优,指令生成)。这其中,指令生成就是会将 IR 对应的计算逻辑直接生成与硬件相关的高效指令计算流。然后进行编译,运行模型。其实整体思路和我们进行的 codegen 差不太多,但是这些推理框架有十分完善的 IR 表示机制,而这个我没有办法手写来复现。

2024-02-29 21:16:35 31

原创 91、在推理流程中加载动态库中的Infer函数

注:建议在 new_version_with_notes 目录下尝试本节内容,有更为丰富的细节输出。在将生成的代码编译成一个动态链接库之后,接下来需要加载动态链接库中写好的推理入口函数,完成推理。在生成的代码中,在 codegen 目录下,有一个文件,里面是一个 Infer 函数,该函数由 5th_codegen/resnet_中的 CodeGen 函数生成。Infer 函数也就是推理的主入口函数。翻回 4th_no_malloc/

2024-02-29 21:15:33 30

原创 90、利用JIT编译技术完成对生成的代码的编译

在完成后,就需要对生成的代码进行编译,这里采用一种叫做 jit 的编译技术来进行。所谓 jit,就是just in time,可以理解为实时编译,它是在程序运行过程中对程序生成的一些中间文件进行编译,从而生成机器码的技术。对应到 codegen 场景下,由于 codegen 中生成的代码是在程序运行时生成的,因此很适合使用 jit 编译来进行。

2024-02-28 22:22:19 41

原创 89、对 resnet50 的c++实现进行代码生成

简单介绍了代码生成的逻辑,并且通过一个例子来进行了代码生成的演示。resnet50 的代码生成思路为:1. 先预先运行一遍模型,在核心计算函数的地方,通过输出字符串的形式,将关键信息(如内存地址、一些层的参数)作为确定值固定下来,然后构造相关算法逻辑的字符串流,输出到文本文件中。2. 生成的所有代码存放在 5th_codegen/ 下的 codegen 目录下。3. 程序运行(执行 ./resnet) 时会进行 jit 编译,调用相关编译命令对生成的代码文本进行编译,编译成动态库。

2024-02-28 22:21:33 278

原创 88、代码生成初探

先看个例子,假设要实现如下功能:对两个等长的数组,将第一个数组中数值为偶数的数与第二个数组中对应位置的数相加,得到一个新的数组,其余位置设为0。i < 5;i++) {if (v1[i] % 2 == 0) { // 判断是否是偶数// 如果为偶数则相加这样写没问题,但是深入分析就可以看到,数组中 index 为0 和 3 的位置为奇数,只有1,2,4的位置为偶数,相加操作仅计算 index = 1,2,4 的位置即可。这种写法和上面的写法区别在于:没有了循环的使用。

2024-02-28 09:25:36 143

原创 5分钟看懂安迪比尔定律

某游戏项目组B程序猿:“不用,现在的手机都8G运存,至少128G内存,够使的,我们直接加特性就行,再说了,把原来无用代码删了,不怕出bug吗。超级玛丽这款游戏,我们玩了很多年,游戏中那么多关卡,那么丰富的剧情,丰富的配图,丰富的配乐,但是你能想象,这款游戏的总大小才64KB么?除了软件不断更新,添加新的特性之外,更重要的是,现在的应用程序开发者,几乎很难再有节省几KB 内存的意识了。我做过芯片开发,要知道,芯片的片上存储是很珍贵的,多出几十KB的存储,就会有意想不到的系统性能提升。

2024-02-28 09:23:50 303

原创 87、评估移除所有动态内存操作带来的性能提升

在相同的环境下,分别运行 3rd_preload 和 4th_no_malloc 下的 compile.sh 脚本进行代码编译,然后运行编译后生成的可执行文件 ./resnet。可以看到性能提升非常明显:优化前平均推理延时为 875ms,优化后为 742 ms,性能提升了大概 15%,还是很不错的。注意:不同电脑机器不同环境下测出来的性能会有差异,大家只需要比对性能提升的相对值即可。可以分别获取到权值预加载前后的性能指标。之后,对于模型的性能提升。

2024-02-25 21:13:41 36

原创 chatGPT 使用随想

我本身是做AI算法的,很多时候在写一写对于AI算法的理解文章时,需要做一些对比或者更深入的理解某个算法,或者更加通俗易懂的理解某个算法,最常见的是想用一些日常生活中的例子来类比某个AI算法。最后,国产大模型其实也出了很多了,但是还是和GPT4有不少的差距,真的希望国内大模型也可以尽快作出这么好用的功能出来,这样就不用费劲使用某些方法来访问 GPT-4 了。现在写文章,几乎离不开 GPT-4,很多时候会和他探讨一个文章行文的思路,并且确定一个主题,对我来说真的很有帮助,写文好伙伴一点不为过。

2024-02-23 23:03:21 1570

原创 86、移除推理路径上的所有内存操作

动态申请内存的影响,前两节已经介绍过了,细心的朋友可能会发现,在使用 C++实现的 resnet50 代码中,还存在一处动态申请内存的操作。那就是对于每一层的输入或输出 feature map 数据进行内存申请,比如在文件中,卷积的计算中存在对于输出 feature map 的 malloc 行为。本节就使用一种全局内存复用的方法,来将每一层动态分配内存的操作删除掉,从而使得整个推理模型中,不存在任何动态申请内存的操作。

2024-02-23 23:01:24 59

原创 85、字符串操作的优化

介绍了在模型的推理优化过程中,动态内存申请会带来额外的性能损失。Python 语言在性能上之所以没有c++高效,有一部分原因就在于Python语言将内存的动态管理过程给封装起来了,我们作为 Python 语言的使用者是看不到这个过程的。这一点有点类似于 c++ 标准库中的一些操作, c++的标准库中提供了很多容器,常见的有vector,也就是数组,可类比于python中的列表,还有字符串string。

2024-02-23 23:00:17 65

原创 拒掉了一个双 985 的面试者

对应到某一个具体的技术问题时,即使他自己回答的不对,但是能够表现出谦逊好学的态度,就会给我很好的印象分,而这个印象分,真的很重要。如果候选人面试时态度还可以,不需要表现的很谦虚,就和一般的面试者一样,有问有答,也肯定会给他发offer。而社会却是一个大熔炉,它教给我们的,除了知识技能之外,还有很大的一部分是复杂的社会交际关系,其中就包括在。学校教会给我们的,很大程度上是知识,但是学校里学的这点知识,在社会工作中能发挥多大作用,还有待商量。但是如果太过分,仗着自己懂技术,就傲慢的不得了,就很难了。

2024-01-30 23:03:04 473

原创 84、介绍:操作系统中内存申请的性能

本节简单的介绍一下在操作系统中的内存申请机制。有些同学看到这可能会有疑惑,我们不是在学习 AI吗,为什么要介绍内存申请的知识呢?因为无论是 AI,还是其他的计算学科,都离不开以下几个方面的内容:算法 + 操作系统 + 芯片 + 数据。AI 作为这几年爆火的学科,不是突然之间横空出世的,它是在已有的计算科学框架下,厚积薄发的一门学科。AI 与其他传统的学科相比,变化最大的地方应该是算法和芯片,但即使是这两方面,也离不开传统算法和传统芯片的加持。

2024-01-30 23:01:37 114

原创 83、评估权值预加载带来的性能提升

上两节介绍的权值预加载技术,在很多业务中是真实存在的。只不过限于本小册内容以及大部分同学硬件设备的局限,这里无法通过真正的推理框架(比如 tvm, pytorch) + GPU 来实现底层细节,这些推理框架中一般会将类似的优化技术封装起来。作为 tvm 或者 pytorch 的用户,你一般看不到这些实现细节,除非你是这些框架的开发者。因此,为了介绍这个优化,我通过 81、82 这两节内容来引入了一个简单的硬件-内存模型。

2024-01-29 20:43:18 280

原创 82、手写的模型如何模拟权值预加载

介绍了模型的权值预加载方法,以及为什么要做权值预加载。对于我们自己手写的模型,如何来完成权值预加载呢?其实大概分为以下几步:申请足够大的内存来存放模型的权值,这一步模拟的是 GPU 拥有足够的显存来存放模型权值将模型的所有权值加载到预申请的足够大的内存中,并且保持在推理过程中,这些内存中的权值数据不变,模拟的是GPU中权值驻留在显存空间中的操作。运行神经网络进行推理,运行到某一需要权值的层时,直接从已经申请的内存对应的位置中读取权值,然后进行推理计算。具体到这个项目代码中,是通过以下方式来实现的。

2024-01-29 20:42:37 41

原创 81、计算机基础:数据流加载以及为什么要做权值预加载

本节我们开启对手写的 resnet50 模型的第二个优化,对应到仓库中的优化代码为本次优化内容为模型的权值预加载。将模型的权值进行预加载,可以减少甚至消除模型推理过程中冗余的内存操作,降低推理延迟,大幅提高模型性能。所以,接下来的几节内容,会围绕这个优化来展开。在开始这个优化之前,先介绍一下计算机的基础知识,以及为什么要做这个优化。大家可能听说过冯诺依曼架构,事实上,现在很多的计算机(芯片)都是基于冯诺依曼架构来进行的设计。冯诺依曼架构的特点,总结下来可以这么理解:计算部件和存储部件的分离。

2024-01-22 22:24:44 90

原创 龙年到!10分钟带你定制龙年微信红包封面

可以帮助完全不懂 AI 的小白,建立一个从底层算法的原理上对 AI 的认知,如果你是非 AI 行业的程序员,那么真的很适合,可以试试。封面简称就直接使用自己公众号的名字,个人 logo 就使用公众号的头像,否则,你要提交其他的证明材料,很可能审核不通过。这一步其实也很简单,因为我们是用 AI 做的图,证明材料只要可以证明你上传的封面图片的版权是 AI 创作的就可以。压完之后,将图片保存到电脑中,进行下一步上传审核。在完成以上步骤,点击下方的提交,然后等待即可,我的经验是,大概半天左右的时间就能完成审核。

2024-01-22 22:22:01 1358

原创 80、评估优化前后的性能差距

在测试的过程中,可以关注一下每次推理的结果,应该都是正确的,比如下面是我在第二版本中推理的Gou.jpg 的图像,一样会显示推理的 top1 准确度为 Samoyed。可以看到利用 avx2 优化后的第二版的延时为 5 s,吞吐为 0.2 fps。比第一版性能提升了约 3.4 倍,提升来源仅仅是做了一个卷积乘法的向量化计算。可以看到第一版的延时为 17s,吞吐为 0.06 fps。

2024-01-21 22:10:33 53

原创 79、avx2 向量指令集优化卷积运算

介绍了 avx2 向量指令集中的 load/store 操作,本节介绍如何使用 avx2 的向量指令集来实现乘累加运算。因为我们实战中用到的 resnet50 神经网络中,卷积运算在整个模型中的比例占据是相当高,而卷积运算的核心计算就是乘累加计算。因此,只要将最核心的乘累加计算效率提高,那么整个模型的性能就会有大幅度的提高。在介绍向量寄存器的时候,举了一个例子来说明向量加法的计算,向量乘法和向量加法一样,下面我们就用实际的代码来展示,如何完成向量乘法的计算。

2024-01-21 22:09:23 73

原创 超简单,不用GPU,3步教你轻松在笔记本上部署聊天大模型 LLaMA

后来有人为了在传统 CPU 电脑上运行大模型,就开发了比较牛的框架,我们今天要用的,就是其中的一个明星产品:llama.cpp。大模型我们都不陌生了,但是以 chatGPT 为代表的大模型是闭源的,他们的源代码不开放,我们只能用他们的商业化产品。从上面的命令中我们可以看出,下载的是 llama-2-7b 模型,也就是有着 70 亿参数的那个模型。但是参数量大,就会对计算机的算力有更高的要求,因此很多大模型,基本部署都是要求在 GPU 上进行。

2024-01-17 21:24:50 2053

原创 78、avx2 数据 load/store 向量化操作介绍

向量寄存器和一个最简单的寄存器-内存的存储器模型,查看。本节基于整个内存模型,介绍一下如何使用 avx2 向量指令集,来完成数据从内存到寄存器中的交互的。

2024-01-17 21:21:33 53

原创 77、avx2 向量寄存器介绍

在现代计算机和高性能计算系统上,我们经常遇到各种术语,其中“向量寄存器”是一个重要的概念。先说一下寄存器,寄存器是 CPU 内最快速的存储设备,它直接用于参与计算,一般 CPU 中的寄存器个数不多。比如,我们电脑中常用的 Intel 芯片,寄存器是 64 位的,也就是说一个寄存器可以存放一个 int64 的数据,或者两个 int32 的数据。Intel i7 CPU 只有16个64位寄存器,因此,如果我们要实现一个 1+1等于2的运算,基本上需要占用 3 个寄存器。

2024-01-17 21:20:45 77

原创 今年的年终奖开了个寂寞

说到这你可能就明白了,只要不是付诸到纸面上的数字,尤其是年终奖,都有不发的风险,而且对公司而言,是有正当理由的。所以,如果你看中了公司的长远价值,并且坚信公司未来会有很好的发展,有信心可以将期权持有到公司上市。这两种薪资包的总包一般都是一样的,不同的就是在总包中,到底是股票占的多一些还是现金占的多一些。我们经常在网上看到一些说法,发了 offer 后给的包有多大,这里说的包指的是薪资总包,年底了,又到了一些公司开年终奖的时候了,往年这个时候,网上都是争相"炫富"的声音。

2024-01-16 22:50:01 939

原创 76、avx2 向量指令集介绍

我们介绍了计算向量化的概念,简单来说,计算向量化就是把对数据的计算,从循环计算的方式,优化为使用一条指令来完成,起到性能优化的目的。接下来简单介绍一个在绝大部分电脑 CPU 上都有的向量指令集,后面我们也会用这个指令集来优化卷积运算,那就是 avx2 指令集。

2024-01-16 22:43:09 320

原创 75、avx2 什么是计算向量化

接下来的几篇文章,会利用向量化指令来加速神经网络的计算,先学习一下什么是计算向量化。计算的向量化是一种对计算的优化方法,简单来说,就是让计算机在计算数据时,同一时间计算多个数据,而不是一个一个的循环计算,这样可以大幅提高计算的效率。计算向量化的概念,其实和线性代数中的向量运算有点类似。在线性代数中,向量运算比如向量点积,做的一整个向量的运算,映射到计算机来执行这个运算时,则依赖于计算机底层硬件对于向量指令的支持来实现的。

2024-01-16 22:41:58 50

原创 74、C++ - 开始进行一次基于 C++ 的推理吧

在经过了前面几节环境搭建和仓库介绍之后,下面开始进行一次 C++ 的全流程代码推理吧。

2024-01-16 00:03:00 36

串口COM口数据转发软件

可实现电脑上两个串口之间的数据转发,将两个串口合并为一个通信信道使用。注意选择串口类型为COM。

2018-01-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除