KuiperInfer

KuiperInfer

开源轻量级深度学习推理框架

KuiperInfer是一个开源深度学习推理框架,支持Resnet、Yolov5和LLama2等主流模型。基于现代C++设计,该框架提供高效算子实现和优化技术,适用于图像分类、目标检测和自然语言处理任务。KuiperInfer不仅是实用的推理工具,还是学习深度学习框架设计和C++工程实践的优质资源。

深度学习推理框架KuiperInferC++大模型Github开源项目

KuiperInfer (自制深度学习推理框架)

我们在本项目的基础上开设了一个全新的课程,《从零自制大模型推理框架》,以下是目录,感兴趣的同学可以扫描二维码或者添加微信 lyrry1997 了解,欢迎大家参加。

<img src="https://yellow-cdn.veclightyear.com/0a4dffa0/fb5e857f-e738-46bb-a525-c17959cc7f4d.jpg" />

《动手自制大模型推理框架》常见问题

  1. 课程更新完了吗?

主体已经更新完毕,完全可以开始自习。支持cuda,int8推理。

  1. 这是收费课程吗?怎么收费,怎么付款,过段时间买可以吗?

收费课程,256元,微信转账。可以,但是我的微信好友快满了,隔一段时间会清理,而且不定期会涨价。

  1. 为什么B站会贵一点,内容都一样吗?

B站要抽成,内容都一样。

  1. 怎么看课

飞书网盘,打开浏览器就可以看。

  1. 有答疑吗

有的,且有答疑群,群友也很热情。

  1. 不会C++可以学吗?

事在人为,我也尽量深入浅出教学。

  1. 课程目录有吗

见下文。

  1. 作者是干什么的?

主业就是开发大模型推理框架的,课件已经被人民邮电出版社约稿,同时也是kuiperinfer项目,也就是本项目的发起人,目前全GitHub C++项目排名120位。

《动手自制大模型推理框架》项目运行效果fp32模型1.1b参数。

KuipeInfer目前2.3k star,帮助很多人获得了大厂岗位。

《动手自制大模型推理框架》课程目录

一、项目整体架构和设计

学习架构思维,防止自己只会优化局部实现

  1. 环境的安装和课程简介
  2. 资源管理和内存管理类的设计与实现
  3. 张量类的设计与实现
  4. 算子类的设计与实现
  5. 算子的注册和管理

二、支持LLama2模型结构

本节将为大家补齐算法工程师思维,在算法层面讲解大模型和Transformer的原理之后,开始对LLama2进行支持

  1. LLama模型的分析
  2. MMap内存映射技术打开大模型的权重文件
  3. LLama模型文件的参数和权重载入
  4. LLama中各个层的初始化以及输入张量、权重张量的分配和申请
  5. 实现大模型中的KV Cache机制

三、模型的量化

为了减少显存的占用,我们开发了int8模型量化模块

  1. 量化模型权重的导出
  2. 量化系数和权重的加载
  3. 量化乘法算子的实现

四、Cuda基础和算子实现

带你学Cuda并在实战大模型算子的实现,为大模型推理赋能

  1. Cuda基础入门1 - 内容待定
  2. Cuda基础入门2 - 内容待定
  3. Cuda基础入门3 - 内容待定
  4. Cuda基础入门4 - 内容待定
  5. RMSNorm算子的Cuda实现
  6. Softmax算子的Cuda实现
  7. Add算子的Cuda实现
  8. Swiglu算子的Cuda实现
  9. GEMV算子的Cuda实现
  10. 多头注意力机制的Cuda实现
  11. 让框架增加Cuda设备的支持和管理
  12. 完成Cuda推理流程

五、用推理框架做点有趣的事情

  1. 文本生成
  2. 讲一段小故事
  3. 让大模型和你进行多轮对话

六、学习其他商用推理框架的实现,查漏补缺

  1. LLama.cpp的设计和实现讲解
  2. Miopen(AMD出品,对标CUDNN)的设计和实现讲解
  3. 总结

带领你亲手打造一个深度学习推理框架。关注我的B站空间,获取最新视频更新。 By following this project to build a deep learning inference framework from scratch, you will gain the following:

  1. Learn the knowledge behind a deep learning framework, master modern C++ project practices, debugging techniques, and engineering experience;
  2. How to design and write a computational graph;
  3. Implement common operators such as convolution, pooling, and fully connected operators;
  4. Based on step 3, learn common optimization techniques to accelerate operator execution;
  5. Finally, you will obtain your own inference framework capable of inferencing models like ResNet, UNet, YOLOv5, MobileNet, etc., which will be greatly beneficial for interviews and knowledge advancement.

Video course link: https://space.bilibili.com/1822828582

Support for LLaMA

We replaced the operators in llama.c with implementations from KuiperInfer

Model download link After downloading, replace it in demos/llama2/main.cpp

a.gif

Second Course Outline

The second course is a reset version of the first course, with more comprehensive and improved content. The first course outline is in the section below.

Lesson NumberProgressCourse Link
Lecture 1 Project Preview and Environment SetupCompletedhttps://www.bilibili.com/video/BV118411f7yM
Lecture 2 Design and Implementation of TensorCompletedhttps://www.bilibili.com/video/BV1hN411k7q7
Lecture 3 Definition of Computational GraphCompletedhttps://www.bilibili.com/video/BV1vc411M7Yp
Lecture 4 Building Computational Graph Relationships and Execution OrderCompletedhttps://www.bilibili.com/video/BV19s4y1r7az
Lecture 5 Operators and Registration Factory in KuiperInferCompletedhttps://www.bilibili.com/video/BV1gx4y1o7pj
Lecture 6 Implementation of Convolution and Pooling OperatorsCompletedhttps://www.bilibili.com/video/BV1hx4y197dS
Lecture 7 Lexical and Syntactic Analysis in Expression Layer and Operator ImplementationCompletedhttps://www.bilibili.com/video/BV1j8411o7ao
Lecture 8 Self-made Inference Framework Supporting ResNet Network InferenceCompletedhttps://www.bilibili.com/video/BV1o84y1o7ni
Lecture 9 Self-made Inference Framework Supporting YOLOv5 Network InferenceCompletedhttps://www.bilibili.com/video/BV1Qk4y1A7XL

Demo Effects

UNet Semantic Segmentation

🥰 KuiperInfer currently supports inference of UNet network, using pre-trained weights from Carvana

For inference reproduction, please refer to Running Kuiper's demo at the end of the document.

YOLOv5 Object Detection

The demo directly uses YOLOv5-s pre-trained weights (COCO dataset), using KuiperInfer for inference

First Course Outline

I have started a teaching course on Bilibili, currently covering the first 13 lessons. The course outline is as follows, and the homepage is: https://space.bilibili.com/1822828582. Welcome everyone to follow and support. The way to join the study group is through the QR code shown in the image above.

课程节数主要内容进度课程链接
第一课整体框架解读和开发环境配置完成https://www.bilibili.com/video/BV1HV4y1A7H8/
第二课张量Tensor类的解析和输入数据的内存排布完成https://www.bilibili.com/video/BV1Ed4y1v7Gb/
第三课从CSV文件中初始化张量Tensor的一个实例完成https://www.bilibili.com/video/BV1Pg411J7V5/
第四课手写第一个算子Relu并完成算子注册工厂类完成https://www.bilibili.com/video/BV1bG4y1J7sQ/
第五课Im2col的原理和卷积算子的实现完成https://www.bilibili.com/video/BV1F841137Ct
第六课照葫芦画瓢,完成MaxPooling算子完成https://www.bilibili.com/video/BV1m3411S7yy
第七课图结构(PNNX)讲解和计算图初步完成https://www.bilibili.com/video/BV1VW4y1V7vp
第八课读取PNNX并构建自己的计算图完成https://www.bilibili.com/video/BV1HY4y1Z7S3
第九课卷积算子的实现和im2col加速计算的原理完成https://www.bilibili.com/video/BV1F841137Ct
第十课再探Tensor类,构建计算图的图关系以及对算子的输入输出预分配完成https://www.bilibili.com/video/BV1M54y1K7AG
第十一课算子的执行流程完成https://www.bilibili.com/video/BV1wY411C7Kv
第十二课用我们自制的推理框架完成ResNet网络的推理和图片的分类完成https://www.bilibili.com/video/BV1jD4y1M772
第十三课用自制的推理框架支持Yolov5模型的推理完成https://www.bilibili.com/video/BV1xs4y1J7t2

项目贡献

贡献者列表

感谢以下同学对Kuiperinfer的付出

如何参与项目贡献?

  1. 提交代码增加新功能或修改bug;
  2. 提出特别有用的建议;
  3. 完善文档或增加单元测试。

本项目和视频课程的关系

  • 本项目相当于课程的上游或者预研项目

  • 这里的每一个功能都有可能成为视频课程中的知识点,无论是我开发的还是其他同学完善的。

使用的技术和开发环境

  • 开发语言:C++ 17
  • 数学库:Armadillo + OpenBlas(或者更快的Intel MKL)
  • 加速库:OpenMP
  • 单元测试:Google Test
  • 性能测试:Google Benchmark

安装过程(使用Docker)

  1. docker pull registry.cn-hangzhou.aliyuncs.com/hellofss/kuiperinfer:latest
  2. sudo docker run -t -i registry.cn-hangzhou.aliyuncs.com/hellofss/kuiperinfer:latest /bin/bash
  3. cd code
  4. git clone --recursive https://github.com/zjhellofss/KuiperInfer.git
  5. cd KuiperInfer
  6. git checkout -b 你的新分支 study_version_0.02 (如果想抄本项目的代码,请使用这一步切换到study tag)
  7. mkdir build
  8. cd build
  9. cmake -DCMAKE_BUILD_TYPE=Release -DDEVELOPMENT=OFF ..
  10. make -j$(nproc)

提示:

  1. 如果需要对KuiperInfer进行开发,请使用 git clone --recursive https://github.com/zjhellofss/KuiperInfer.git 同时下载子文件夹tmp, 并在cmake文件中设置$DEVELOPMENT或者指定-DDEVELOPMENT=ON
  2. 如果国内网速卡顿,请使用 git clone https://gitee.com/fssssss/KuiperInferGitee.git
  3. 如果想获得更快地运行体验,请在本机重新编译openblas或apt install intel-mkl

安装过程(构建Docker镜像)

  1. docker build -t kuiperinfer:latest .
  2. docker run --name kuiperinfer -it kuiperinfer:latest /bin/bash
  3. cd /app
  4. 余下步骤参考上述安装过程的步骤4-10

安装过程(不使用docker)

  1. git clone --recursive https://github.com/zjhellofss/KuiperInfer.git
  2. git checkout -b 你的新分支 study_version_0.01 (如果想参考本项目的代码,请使用这一步切换到study标签)
  3. 安装必要环境(推荐编译安装openblas以获得更快的运行速度,或者使用apt install intel-mkl替代openblas)
apt install cmake, libopenblas-dev, liblapack-dev, libarpack-dev, libsuperlu-dev
  1. 下载并编译armadillo https://arma.sourceforge.net/download.html
  2. 编译安装glog、google test和google benchmark
  3. 剩余步骤与上述相同

提示:

  1. 在编译google benchmark过程中,如果遇到关于gtest缺失的错误,可以在google benchmark的cmake中关闭gtest选项

运行 Kuiper 的 demo

运行Unet的推理

编译后请复制 tmp/unet/demo 文件夹下的 test.png 图片的绝对路径或相对路径, 然后在 build/demos 中按以下格式运行推理程序

./unet_test test.png unet_demo.pnnx.param unet_demo.pnnx.bin

pnnx 模型的下载地址:https://cowtransfer.com/s/09c7f337bab443

如果推理成功,你将会在文件夹内看到原图的分割结果 unet_output.jpg 。

运行Yolov5的推理

请在demos文件夹下的yolo_test.cpp文件中修改以下代码

const std::string& image_path = "imgs/car.jpg"; const std::string& param_path = "tmp/yolo/demo/yolov5s_batch8.pnnx.param"; const std::string& bin_path = "tmp/yolo/demo/yolov5s_batch8.pnnx.bin";
  • image_path指定图像目录,param_path为模型的参数文件,bin_path为模型的权重文件,请替换为你本地的路径。

  • 模型定义和权重下载地址如下: https://cowtransfer.com/s/9bc43e0905cb40

  • 编译完成后,在项目目录运行 ./build/demos/yolo_test

已支持的算子

总体理念:逐步优化现有算子;在需要时再开发未实现的算子

  • Convolution
  • AdaptivePooling
  • MaxPooling
  • Expression(抽象语法树)
  • Flatten, View(维度展平和变形)
  • Sigmoid
  • HardSigmoid
  • HardSwish
  • ReLU
  • Linear(矩阵相乘)
  • Softmax
  • BatchNorm
  • Upsample
  • SiLU
  • Concat
  • ConvTranspose

目录

source是源码目录

  1. data/ 是张量类Tensor的实现和Tensor初始化方法
  2. layer/ 是算子的实现
  3. parser/ 是Pnnx表达式的解析类
  4. runtime/ 是计算图结构、解析和运行时相关

test是单元测试目录,基本做到public方法单元测试全覆盖

bench是google benchmark,包含对MobilenetV3、Resnet18和yolov5s的性能测试。

性能测试

测试设备

15 核心的AMD EPYC 7543(霄龙) 32-Core Processor (Docker 容器,宿主机共有32核心)

编译环境

gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

性能结果

耗时通过连续五次运行并取平均值计算

输入尺寸模型名称计算设备耗时
224×224 batch = 8MobileNetV3SmallCPU(armadillo + openblas)6.76ms / 图像
224×224 batch = 8ResNet18CPU(armadillo + openblas)23.53ms / 图像
224×224 batch =16ResNet18CPU(armadillo + openblas)13.52ms / 图像
640×640 batch = 8Yolov5nanoCPU(armadillo + openblas)78.37ms / 图像
640×640 batch = 8Yolov5sCPU(armadillo + openblas)177.54ms / 图像
640×640 batch = 16Yolov5sCPU(armadillo + openblas)134.57ms / 图像

致谢

推理框架NCNN,已在借鉴的代码中保留了NCNN的BSD协议 https://github.com/Tencent/ncnn

优秀的数学库Openblas: https://github.com/xianyi/OpenBLAS

优秀的数学库Armadillo: https://arma.sourceforge.net/docs.html

给予我灵感的Caffe框架: https://github.com/BVLC/caffe

fmath框架:https://github.com/herumi/fmath/

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多