自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(158)
  • 收藏
  • 关注

原创 NCNN 源码(2)-经典算子实现

由于 relu 比较简单,而 leaky relu 跟 relu 相比只是在小于 0 的地方乘了一个系数,所以作者就将 relu 和 leaky relu 写到一块,由一个只作用于小于 0 区域的斜率 slope 控制。在 ncnn 的实现中,split 和 concat 都是无参数无权重的,也就是说只需要从 param 读取 layer 特定参数,不需要从 bin 读取权重参数。这个版本的卷积计算比较原始,没有过多的优化,后续版本的优化比较多,但是没有这个版本的这么方便阅读。从函数的入参可以看到,

2024-09-22 15:55:43 317

原创 树莓派pico上手

不同于作为单板计算机的树莓派5,树莓派 pico 是一款低成本、高性能的微控制器板,具有灵活的数字接口。英国树莓派公司设计的 RP2040 微控制器芯片双核 Arm Cortex M0+ 处理器,弹性的时钟频率高达 133 MHz264kB SRAM 和 2MB 板载闪存RP2040 能够支持高达 16MB 的片外闪存,不过在 Pico 中只有 2MB。USB 1.1,支持设备和主机低功耗睡眠和休眠模式通过 USB 使用大容量存储器进行拖放编程26 × 多功能 GPIO 引脚。

2024-09-22 15:48:24 1453

原创 NCNN 学习(3)-Optimize

NCNN 的 tools 中包含对模型进行优化的代码,主要是和这两个文件。这两个文件里主要是和两个类,继承自Net继承自。这里Net是 NCNN 的基础数据结构之一,用来抽象和管理 NCNN 的模型中的不变部分,主要是模型结构和模型参数。主要是为了做模型优化添加的一个辅助类,主要用于输出模型,是 ncnn 用来做模型优化的主要的一个类,基本上所有的优化 pass,都是在这个类中实现。

2024-09-21 16:39:38 785

原创 NCNN 源码(1)-模型加载-数据预处理-模型推理

读取 param 和 bin 文件,记录下每一层的 layer、layer 的输入输出节点、layer 的特定参数推理维护一个列表用于存所有节点的数据给输入节点放入输入数据计算输出节点的 layer计算 layer 所需的输入节点还没给输入——>递归调用上一层 layer 计算有输入了——>计算当前 layer输出结果,数据送入后置节点。

2024-09-21 15:40:40 993

原创 NCNN 学习(2)-Mat

Mat 是 NCNN 中最重要数据结构之一,NCNN 的很多计算都会涉及到 Mat。

2024-09-20 20:44:12 846

原创 NCNN 学习(1)-编译与算子注册

是一个高效、轻量级的深度学习框架,支持各种神经网络模型,如pytorch、tensorflow、onnx等,以及多种硬件后端,如x86、arm、riscv、mips、vulkan等。由 Tencent 开发,具有以下特性:支持卷积神经网络,支持多输入和多分支结构,可计算部分分支ncnn 支持卷积神经网络结构,以及多分支多输入的复杂网络结构,如主流的 VGG、GoogLeNet、ResNet、SqueezeNet 等。无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架。

2024-09-20 20:43:10 1043

原创 OpenMP+AVX加速矩阵运算

根据高维数组的存储方式不难知道,在这样的情况下,矩阵 A 是的访问在内存上是连续的,而 B 的访问在内存上是不连续的。在开 16 线程的条件下,对比 2000*2000 的矩阵乘法,使用 avx256 的速度大概接近常规的方式的 140 倍,使用 avx512 的速度大概接近常规的方式的 220 倍。对比 2000*2000 的矩阵乘法,使用 avx256 的速度大概是常规的方式的 8 倍多,使用 avx512 的速度大概接近常规的方式的 13 倍。的寄存器的每个单元都要写入相同的。方法进行复制型的加载。

2024-09-18 15:35:32 593

原创 香橙派zero2w上手——环境配置&添加OLED小屏幕

注:串口的 TX 和 RX 是需要交叉连接的,如果不想仔细区分 TX 和 RX 的顺序,可以把串口的 TX 和 RX 先随便接上,如果测试串口没有输出再交换下 TX 和 RX 的顺序,这样就总有一种顺序是对的。开发板进入系统之后,可以直接连接显示器和键鼠操作,不过开发板的 USB 接口比较少,不太方便。Windows 下可以使用的串口调试软件有很多,如 SecureCRT、MobaXterm 等,这里使用 MobaXterm,这款软件有免费版本,无需购买序列号即可使用。

2024-09-18 15:19:11 1058

原创 给树莓派添加 SSD1306 OLED 小屏幕

树莓派被作为一个小服务器使用的时候,通常都不需要接一台专用显示器,而是通过 ssh 远程登录。当环境中有多个设备使用远程登录的时候,就容易不记得相应设备的 IP 地址等信息;有时候只是需要了解设备的一些信息,例如 CPU 负载情况,内存、硬盘使用情况等,使用电脑或者手机远程登录又不够方便,那么给树莓派或者其他有类似需求的小板子添加一个微型的 OLED 小屏幕就是一个不错的解决方案。

2024-09-16 00:02:22 1149

原创 树莓派5上手

树莓派 5 可以安装各种系统,但是如果对于系统没有特殊的要求,还是安装 Raspberry Pi OS 比较合适。写入完成之后,把内存插到树莓派上,树莓派上电等待指示灯变成绿色闪烁则表明已经正常进入系统,那么就可以通过路由器查看树莓派的 ip,之后通过 ssh 远程连接即可进入系统。Raspberry Pi OS 的默认源安装软景非常慢,更换成国内的镜像源,可以恒大程度提高更新与安装软件的速度。如上图,在这里可以看到当前树莓派系统的版本,这里显示使用的是 bookworm,记住这个名字,后面会用到。

2024-09-15 22:22:37 637

原创 SSE和AVX指令基本使用

SSE/AVX 指令属于 Intrinsics 函数,由编译器在编译时直接在调用处插入代码,避免了函数调用的额外开销。但是与 inline 函数不同,Intrinsics 函数的代码由编译器提供,能够更高效地使用机器指令进行优化调整。一般的函数是在库中,Intrinsic Function 内嵌在编译器中(built in to the compiler)。

2024-08-26 23:52:00 751

原创 OpenMP多线程基础使用

OpenMP 是一套 C++ 并行编程框架, 也支持 Forthan,是一个跨平台的多线程实现, 能够使串行代码经过最小的改动自动转化成并行的。具有广泛的适应性。这个最小的改动,有时候只是一行编译原语!具体实现是通过分析编译原语#pragma,将用原语定义的代码块,自动转化成并行的线程去执行。每个线程都将分配一个独立的id. 最后再合并线程结果。

2024-08-26 23:50:12 728

原创 位运算使用

在写代码过程中,适当的位运算是一种提高代码质量的有效手段。

2024-08-20 23:53:39 1057

原创 蒙特卡洛方法

蒙特·卡罗方法(Monte Carlo method),是一种思想或者方法的统称,而不是严格意义上的算法。蒙特卡洛方法的起源是1777年由法国数学家布丰(Comte de Buffon)提出的用投针实验方法求圆周率,在20世纪40年代中期,由于计算机的发明结合概率统计理论的指导,从而正式总结为一种数值计算方法,其主要是用随机数来估算计算问题。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。

2024-08-20 23:51:00 899

原创 iree 编译流程(4)——HAL::HALTransformPassPipeline

7 HAL::HALTransformPassPipeline主要作用是进行 tiling、vectorization 和 bufferization 等操作,分配计算负载,最终生成 target device 的代码。比如 cuda target 的 dispatch source code 会被递降为 NVVM IR。主要作用是进行 tiling、vectorization 和 bufferization 等操作,分配计算负载,最终生成 target device 的代码。比如 cuda targe

2024-08-03 16:23:44 387

原创 iree 编译流程(3)——Stream::StreamTransformPassPipeline

6 Stream::StreamTransformPassPipeline主要作用是将 program 转换到 stream dialect,优化变量编码方式,划分调度子图,生成异步调度策略,并实现内存规划策略。6.1 buildStreamTensorPassPipelineIREE::Stream::createVerifyInputPass检查program的合法性。IREE::Stream::createOutlineConstantsPass将 module 内部的dense

2024-08-03 16:21:50 838

原创 torch._dynamo 理解(2)——Backend

TorchDynamo 是一个 Python 级别的即时 (JIT) 编译器,旨在让未修改的 PyTorch 程序运行得更快。它通过 Python Frame Evaluation Hooks(Python 框架评估钩子)来实现这一目标,以便在运行时动态地生成和优化代码。这使得 TorchDynamo 可以有效地处理各种 Python 代码,包括包含控制流(如循环和条件语句)的代码,而无需进行任何修改。

2024-07-30 13:40:15 771

原创 torch._dynamo 理解(1)——Frontend

TorchDynamo 是一个 Python 级别的即时 (JIT) 编译器,旨在让未修改的 PyTorch 程序运行得更快。它通过 Python Frame Evaluation Hooks(Python 框架评估钩子)来实现这一目标,以便在运行时动态地生成和优化代码。这使得 TorchDynamo 可以有效地处理各种 Python 代码,包括包含控制流(如循环和条件语句)的代码,而无需进行任何修改。前端的整体流程如下:nn.ReLU(),).cuda()model(x)sub = None。

2024-07-30 13:38:28 1348

原创 iree 编译流程(2)——buildGlobalOptimizationPassPipeline

当输入 indexing map 是 permutation 时,交换循环维度使得输入的 indexing map 是 identity 的,其作用是使得输入尽可能变成连续访存。将 reduction 循环维度交换到最内层,相应的 parallel 循环维度被交换到外层。和相应的动态维度 index,该 pass 捕获 workgroups 参数中的动态维度 index,插入。内部可以直接复用输入和输出的内存,从而避免了内部的内存分配操作,内存分配只发生在。的 module 文件,默认不做该变换。

2024-07-29 13:46:23 1312

原创 iree 编译流程(1)

IREE 目前支持将 MHLO 或 XLA、Torch Tensor 和 TOSA 作为输入,经过一系列 passes 编译生成 IREE 定义的 VM bytecode 中间产物,其中硬件相关代码会编译成相应的 Executable,保存在 VM bytecode 中供 host 进行调用。例如 CUDA 相关的计算代码会被lower 成 PTX 代码,在 IREE 的 runtime 中再被 CUDA 的 runtime 以 JIT 的方式编译成可执行的 cubin kernel。

2024-07-29 13:44:12 560

原创 pytorch 源码阅读(3)——torch.fx

FX 是一个供开发者用来转换 nn.Module 实例的工具包。符号跟踪器(symbolic_traced)中间表示(intermediate representation,IR)和Python 代码生成(Code generation)。"""graph():""""""add = None"""符号跟踪器对 Python 代码执行符号执行。它将称为代理的虚假值馈送到代码中。记录对这些代理的操作。中间表示是符号跟踪期间记录的操作的容器。

2024-07-26 23:18:32 947

原创 奇异值分解(SVD)时间复杂度分析与优化

奇异值分解是一种矩阵分解的方法,大学线性代数里面也讲过奇异值分解的方法,因此这是一个为大家所熟知的算法。

2024-07-26 23:15:18 1393 1

原创 量子计划 Quark 捯饬

LCD屏幕使用SPI与CPU进行通信,并且其驱动程序内置于系统镜像中。系统中有一个使用python编写的pygame示例,演示了LCD使用。Atom-N(载板)上还有一个内置麦克风,使其具备机器学习功能。可以使用系统中的测试实例使用随镜像预先安装的 Audacity 软件。系统镜像中还内置了OpenCV ,可以通过接入USB 摄像头实现人脸识别功能,需要将USB相机连接到开发板的USB端口A。对于GPIO访问,因为是基于Linux所以十分方便,并且可以使用Python轻松控制。

2024-07-21 20:05:06 340

原创 量子计划 Quark 上手

参考资料:量子计划 Quark 迷你卡片电脑是稚晖君的超迷你 Linux 卡片电脑软硬件开源项目。这个板子到手好久了,一直没顾上上电试试,今天终于还是拆开了。这个板子做工很精致,体积是普通树莓派大小的 1/4(40mm × 35mm),虽然板子很小,但配置了麦克风,陀螺仪,加速度计,显示屏、功能按键,在 Quark-N 核心板上集成了 16GB 的 eMMC。可以将系统放进 eMMC,这样不需要插入 SD 卡也能够访问系统。

2024-07-21 20:03:45 937

原创 奇异值分解(SVD)原理

0 引子奇异值分解(singular value decomposition,SVD)是一种矩阵因子分解方法,是线性代数的概念。在机器学习中,矩阵分解是常用的手段,作为矩阵分解的经典方法SVD,不仅是经典的数学问题,在工程应用中许多地方也都有它的身影。SVD被广泛应用在推荐系统、图像处理等领域,是一种数据降维的经典方法。许多数学对象可以通过将它们分解成多个组成部分或者找到它们的一些属性来更好地理解,这些属性是通用的,而不是由我们选择它们的方式所产生的。对应地,我们也可以通过分解矩阵来发现矩阵表示成数组元

2024-07-20 14:23:31 1524

原创 Python如何优雅地在Terminal打印下标

在 Python 中想要再terminal窗口打印下表,可以使用Unicode方法将下标打印到 terminal 窗口也可以使用\N{}转义序列将下标打印到 terminal 窗口。

2024-07-20 14:18:51 423

原创 yolov5 上手

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的约瑟夫-雷德蒙(Joseph Redmon)和阿里-法哈迪(Ali Farhadi)开发。YOLO 于 2015 年推出,因其高速度和高精确度而迅速受到欢迎。YOLOv5 在 YOLOv4 的基础上进一步提高了模型的性能,并增加了超参数优化、集成实验跟踪和自动导出为常用导出格式等新功能。

2024-07-15 23:55:01 911

原创 linux解决报错 libstdc++.so.6: version GLIBCXX_3.4.30 not found

这个工程之前是可以正常编译的,猜测是更新之后,相应的文件丢失了或者是文件(动态链接指向的文件)出问题。在多用户的机器上,在需要使用和系统自带的版本不同的软件的时候,可以把需要的版本的软件安装到自己账户的。目录下,再通过设置环境变量了指定软件的位置即可,这样既不影响其他用户,也不会被其他用户影响。应该可以看到是一个软连接,那么就和我们前面的猜测一致了,是动态链接指向的文件出问题了。更新过了,导致需要使用 gcc 进行编译的工程在编译过程中出现。———— 沃·兹基硕德。

2024-07-15 23:52:12 1220

原创 pytorch 源码阅读(2)——torch._dynamo.optimize

这个函数时 TorchDynamo 的主入口点。进行 graph 提取并调用 backend() 来优化提取到的 graph。

2024-06-25 23:32:06 402

原创 pytorch 源码阅读(1)——torch.complie

如上所述,为了更快地运行工作流,torch.compile 通过 TorchDynamo 需要一个后端,该后端将捕获的图形转换为快速的机器代码。对于在编译区域内执行的每一帧,都会尝试编译,并将编译结果缓存到代码对象中,供将来使用。中引入的 PyTorch 函数,旨在解决 PyTorch 中的准确图形捕获问题,并最终使软件工程师能够更快地运行其 PyTorch 程序。这个函数的作用是使用 TorchDynamo 和指定的后端优化给定的模型/函数,进行包装和参数配置的设置,最终会调用。,这个是用来进行调试的。

2024-06-25 23:31:29 1058

原创 源码编译安装 clang/gcc

在同一个机器上有多个人同时使用的时候,机器的环境比较复杂,会存在和别人使用的基础工具版本不同的情况,这个时候为了不影响其他人,也不被其他人影响,可以通过使用源码来编译。编译完成之后,通过环境变量的设置,来使其只针对当前的用户或者 teminal 生效。

2024-06-15 23:11:58 863

原创 AVX介绍

SIMD:Single Instruction Multiple Data,单指令多数据,一个指令可以控制多个数据进行操作。在这里,使用的是单指令单数据(SISD)的处理方式,要进行四次加法运算,就当真是进行了四次加法运算,使用了四次加法指令。进行4次加法只需要进行一个长度为4的向量加法,只是用了一次向量加法的指令。在SIMD指令集中,可以控制若干个大寄存器,把这些寄存器中的数据按照某些规则进行统一的操作,相当于一条指令可以完成好几次重复运算,从而达到加快运算速度的效果。

2024-06-15 23:10:14 1440

原创 零拷贝(Zero Copy)

是Linux提供的一种内存映射文件的机制,它实现了将内核中读缓冲区地址与用户空间缓冲区地址进行映射,从而实现内核缓冲区与用户缓冲区的共享。DMA控制器根据socket缓冲区中的地址和偏移量将数据从内核缓冲区拷贝到网卡中,从而省去了内核空间中仅剩1次CPU拷贝。最主要的变化是,CPU不再和磁盘直接交互,而是DMA和磁盘交互并且将数据从磁盘缓冲区拷贝到内核缓冲区,之后的过程类似。这种方式有2次状态切换、0次CPU拷贝、2次DMA拷贝,但是仍然无法对数据进行修改,并且需要硬件层面DMA的支持,并且。

2024-05-29 22:05:49 694

原创 OrangePi Kunpeng Pro 开发板测评 | AI 边缘计算 & 大模型部署

香橙派联合华为发布了基于昇腾的 OrangePi Kunpeng Pro 开发板,具备 8TOPS 的 AI 算力,能覆盖生态开发板者的主流应用场景,具备完善的配套软硬件。开发板的整体体验远超出预期,作为低功耗 AI 边缘计算开发板,支持Ubuntu、openEuler操作系统,能够满足大多数AI算法原型验证、推理应用开发的需求,结合昇腾 AI 生态支持,在 CV 网络上的表现令人满意。更让人意外的是,甚至对于大语言模型也有一战之力。

2024-05-29 21:50:37 2273 2

原创 safetensors介绍

safetensors 是 Huggingface 推出的一种可靠、易移植的机器学习模型存储格式,用于安全地存储 Tensor,而且速度很快(零拷贝)。8 bytes:一个无符号的整数,表示 header 占的字节数N bytes:JSON UTF-8 字符串,存储 header 的内容,形如:},},Rest of the file:存储 tensor 的数据。

2024-05-21 23:08:42 890

原创 flax 框架理解

flax采取就地定义,就地使用的方式,使用时再定义。

2024-05-21 23:06:39 453

原创 ubuntu安装flash_attn

flash_sttn 依赖 cuda-11.6及以上的版本,使用命令。* 检查 pytorch 版本和 cuda 版本是否匹配。等架构的GPU,例如:A100、H100等,V100属于。,否则编译过程会持续很长时间,如果。来安装 flash_attn。查看 cuda 的版本,已经安装完毕,可以直接执行。* 即便是提前安装好了。* 另外,目前原生的。

2024-05-18 13:33:05 707

原创 bazel 编译 C++ 项目

大多数目标是两种主要类型之一:文件和规则。如示例中的hello-world和hello-greet等。文件进一步分为两种。源文件通常由用户编写并签入代码库。生成的文件(有时称为派生文件或输出文件)不会被签入,但是从源文件生成的。第二种目标使用规则声明。每个规则实例都用于指定一组输入文件与一组输出文件之间的关系。规则的输入可以是源文件,也可以是其他规则的输出。target是某个 rule 的一个实例。Rule规定了 一类构建规则。

2024-05-18 13:31:44 1316

原创 sympy_python代数符号运算

SymPy 是一个符号计算的 Python 库,完全由 Python 写成,为许多数值分析,符号计算提供了重要的工具。它是一种计算机代数系统computer algebra system (CAS), 既可以用作单独的应用也可以作为其它的应用中的包。GitHub 链接:https://github.com/sympy/sympySymPy 官方网站:https://www.sympy.org/en/index.html。

2024-05-05 17:39:05 1502 1

原创 使用llama.cpp量化部署LLM

以llama.cpp工具为例,介绍模型量化并在本地部署的详细步骤。这里使用 Meta最新开源的 Llama3-8B 模型。

2024-05-05 17:37:48 1930 1

空空如也

空空如也

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

TA关注的人

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