【Kuiperinfer】笔记01 项目预览与环境配置

news2025/3/13 12:54:13

学习目标

  • 实现一个深度学习推理框架
  • 设计、编写一个计算图
  • 实现常见的算子,例如卷积、池化、全连接
  • 学会如何进行算子的优化加速
  • 使用自己的推理框架推理常见模型,检查结果是否能够和torch对齐

什么是推理框架?

推理框架用于对已经训练完成的模型进行加载,并根据模型文件中的网络结构和权重参数,对输入图像进行预测。

推理框架没有反向传播,因为推理过程中权重不需要更新。这也是和训练框架的最大的不同。

推理框架的运行流程可参照下图:

在这里插入图片描述

技术全景

KuiperInfer包括以下几个模块:

  1. Operator:计算图中的计算节点,包括:
    • 存储输入输出的张量,用于存放各层的输入输出
    • 节点的类型和名称,名称是唯一的,用于区分任意一个节点,例如Convolution
    • 节点的参数信息,例如卷积步长、卷积核大小
    • 节点的权重信息,例如weight, bias
  2. Graph:多个Operator串联得到的有向无环图,规定了节点的执行顺序
  3. Layer:运算的具体执行者,首先读入输入张量中的数据,然后对输入帐量进行计算,并将结果放入输出张量中
  4. Tensor:存放多维数据,方便在节点中传递,该结构同时也封装矩阵运算

在这里插入图片描述

环境配置

主要库:

  1. 数学计算:Armadillo,该库是Open Blas的封装
  2. 加速库:OpenMP
  3. 单元测试:Google Test
  4. 性能测试:Google Benchmark

第二次开课提供了docker镜像,更省事一些。

什么是Docker

为什么使用Docker

出现背景:不同的电脑的环境配置不同,导致在一个系统上运行正常的程序,在另一个系统上不能正常运行。

解决这个问题的一个方法是,构建和源系统一样的虚拟机,这种方法通常会占用大量内存来支持Guest OS。与之相对,Docker在这方面省略了大量内存占用。且Docker允许在不同的容器之间共享和重用数据空间,也方便在不同平台之间移植。

Docker是什么

Docker是用于自动化部署应用程序到轻量级的容器中的工具,使得应用可以在不同的运行环境中高效运行。

容器(container)是一种软件包,包含所有运行依赖。

在这里插入图片描述

Docker为每个软件都对应在容器中提供其依赖的框架(framework),使得不同框架的软件,甚至冲突框架的软件,可以在同一宿主机上运行,甚至可以进行数据共享。

Docker是如何工作的

  • Docker是安装在宿主机上的基础引擎,主要功能是build和运行容器
  • 使用client-server架构
  • Client和Server使用REST API交互
  • Client运行指令,指令通过REST API转译,发送到Server
  • Server检查Client请求,在操作系统上响应操作

在这里插入图片描述

Win环境下Docker环境配置

首先安装Docker,进入Docker官网,点击选择products中的Docker DeskTop下载并安装。注意安装后需要重启,记得提前关闭其他应用并保存。

打开Docker DestTop,我我这里出现卡starting的问题,推测可能是Hyper-V的原因,查阅Microsoft手册,首先尝试在powershell中启用Hyper-V

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

提示Microsoft-Hyper-V未知,说明没安装,尝试安装。将下面的文本存入一个cmd文件中,管理员身份运行,然后重启

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

再次启动Docker-DeskTop,这次没有卡住。

验证安装,命令行中输入:

docker run hello-world

出现以下文本,说明安装成功

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

现在开始拉环境

  1. 拉取镜像

    docker pull registry.cn-hangzhou.aliyuncs.com/hellofss/kuiperinfer:datawhale
    
  2. 克隆课程代码

    git clone https://github.com/zjhellofss/kuiperdatawhale.git
    
  3. 创建并运行容器

    x docker run -it -p 7860:22 registry.cn-hangzhou.aliyuncs.com/hellofss/kuiperinfer:datawhale /bin/bash
    
  4. 使用ssh连接容器

    ssh -p 7860 me@127.0.0.1
    

    如果连不上的话可以在Docker DeskTop里面重启一下容器试试。

VS配置Docker

先补一点自己不熟悉的知识:

  1. CMake. CMake是一个跨平台build system,用于在不同平台上创建build。
  2. Visual Studio with CMake. VS内嵌了CMake,可以创建CMake的项目,会自动检测CMakeLists.txt文件,并生成必要的项目文件。
  3. VS使用Docker,调试 > 选项 > 跨平台 > 连接管理器 > 添加。Win平台本机启动的docker主机名为127.0.0.1,端口、用户名和密码按照自己设置的填入即可。在跨平台 > 开发容器中,设置用于运行容器的主机为127.0.0.1

因为这个docker是Linux的,所以需要在VS installer中,安装用于Linux的C++开发组件,参考:https://devblogs.microsoft.com/cppblog/build-c-applications-in-a-linux-docker-container-with-visual-studio/。

不装这个的话,即使能够连接到docker,也不能设置调试主机为docker容器。

  1. 设置调试主机为docker容器

  2. 配置新的debuger

    在这里插入图片描述

  3. 尝试生成,出现新的错误:无法创建目录,mkdir 退出代码: 1,推测是用户权限问题。

    定位,在docker容器中,打开终端管理,su me登录me账户,尝试在./root/home/me文件夹下创建文件,报Permission denied,说明me用户没有足够权限。

    切root账户,在根目录下,chown -R me home,一定要给home的权限,否则还是不能mkdir

  4. cmake没找到ninja,在debug高级配置中,改用Unix Makefiles,镜像里是没装Ninja的,且这个CMakefile.txt也不支持Ninja,如果不小心用Ninja生成过一次,那改Unix Makefiles也还会报错,需要重新clone

  5. 编译完成后,就可以直接run了;course 1跑Google Test会提示FAILED,是因为axby.cpp中有三个函数需要自己实现。

整理一下使用VS配置环境的关键问题:

  1. 用户权限要给到home文件夹,确保在docker控制台,使用me用户(或者自己创建的用户)能够在home路径下创建文件
  2. 在选项 > 跨平台 > 开发容器中,连接配置好的远程容器,如果容器是Linux环境,则需要先安装Linux组件;设置调试主机为该容器,在管理配置中设置新的CMake配置,修改配置中的主机为该容器,修改generator为UNIX Makefiles。

编写单元测试

使用GoogleTest编写单元测试,测试armadillo的计算接口。接口可参考armadillo的手册。

test/test1.cpp中,包含了对加减乘和点积运算的接口,作业要求实现axby.cpp中的接口。

查手册找算子,对照实现即可。

  1. 实现 y = w × x + b y = w \times x + b y=w×x+b

    void Axby(const arma::fmat &x, const arma::fmat &w, const arma::fmat &b,
              arma::fmat &y) {
        y = w * x + b;
      // 把代码写这里 完成y = w * x + b的运算
    }
    
  2. 实现 y = e − x y = e^{-x} y=ex

    void EPowerMinus(const arma::fmat &x, arma::fmat &y) {
      // 把代码写这里 完成y = e^{-x}的运算
        arma::fmat E(224, 224, arma::fill::value(arma::datum::e));
        y = pow(E, -x);
    }
    
  3. 实现 Y = a × x + y Y = a \times x + y Y=a×x+y

    void Axpy(const arma::fmat &x, arma::fmat &Y, float a, float y) {
      // 编写Y = a * x + y
        Y = a * x + y;
    }
    

编译运行,PASSED。

参考

  • 【Kuiperinfer】:https://github.com/zjhellofss/kuiperdatawhale
  • 作者B站主页:https://space.bilibili.com/1822828582?spm_id_from=333.337.search-card.all.click
  • 【What Is Docker】:https://www.youtube.com/watch?v=rOTqprHv1YE
  • 【Armadillo Docs】:https://arma.sourceforge.net/docs.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1455034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

php数组运算符 比较 isset、is_null、empty的用法和区别

php数组运算符 1. 数组运算符2. 判断两个数组是否相等3. isset、is_null、empty的用法和区别 1. 数组运算符 注意:只会保留第一个数组中的键值对,而忽略后面数组中相同键名的元素,如果想要合并两个数组并覆盖相同键名的元素,可以…

微信小程序之开发会议OA项目

目录 前言 本篇目标 首页 会议 投票 个人中心 会议OA项目-首页 配置 tabbar mock工具 page swiper 会议信息 会议OA项目-会议 自定义tabs组件 会议管理 会议OA项目-投票 会议OA项目-个人中心 前言 文章含源码资源,投票及个人中心详细自行查看…

HTTP请求报文与响应报文格式

HTTP请求报文与响应报文格式 HTTP请求报文与响应报文格式 请求报文包含四部分: a、请求行:包含请求方法、URI、HTTP版本信息b、请求首部字段c、请求内容实体d、空行 响应报文包含四部分: a、状态行:包含HTTP版本、状态码、状态码…

程序员也需要休息:为什么有时候他们不喜欢关电脑

程序员为什么不喜欢关电脑? 背景:作为程序员,长时间与电脑为伴是家常便饭。然而,有时候他们也会觉得厌倦和疲惫,不喜欢过多地与电脑打交道。本文将探讨程序员为何需要适当的休息和放松,以及如何更好地管理…

代码随想录第33天|● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果

文章目录 1005.K次取反后最大化的数组和贪心思路:代码: 34. 加油站思路一:全局贪心代码: 思路二:代码: 135. 分发糖果思路:两边考虑代码: 1005.K次取反后最大化的数组和 贪心思路&am…

[C++]二叉搜索树

一、定义 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

Java+Vue+MySQL,国产动漫网站全栈升级

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

综合练习

目录 查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置 确定要使用的数据表 确定已知的关联字段 查询每个员工的编号、姓名、职位、基本工资、工资等级 确定要使用的数据表 确定已知的关联字段 查询每个员工的编号、姓名、职位、基本工资、部门名称、工资…

如何系统地学习Python

建议系统学习Python的途径遵循理论与实践相结合的教学方法。以下是一个分阶段的学习计划: 阶段一:基础知识 理解Python的特点: 认识Python的历史与设计哲学。学习Python的基本语法和运行环境。 安装Python: 学习如何在不同操作系…

NNLM - 神经网络语言模型 | 高效的单词预测工具

本系列将持续更新NLP相关模型与方法,欢迎关注! 简介 神经网络语言模型(NNLM)是一种人工智能模型,用于学习预测词序列中下一个词的概率分布。它是自然语言处理(NLP)中的一个强大工具,…

从kafka如何保证数据一致性看通常数据一致性设计

一、前言 在数据库系统中有个概念叫事务,事务的作用是为了保证数据的一致性,意思是要么数据成功,要么数据失败,不存在数据操作了一半的情况,这就是数据的一致性。在很多系统或者组件中,很多场景都需要保证…

IO进程线程作业day1

1> 使用fgets统计给定文件的行数 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <unistd.h> int main(int argc, const char *argv[]) {//判断外部输入文件名是否规范if(argc!2){printf("in…

K8S之运用污点、容忍度设置Pod的调度约束

污点、容忍度 污点容忍度 taints 是键值数据&#xff0c;用在节点上&#xff0c;定义污点&#xff1b; tolerations 是键值数据&#xff0c;用在pod上&#xff0c;定义容忍度&#xff0c;能容忍哪些污点。 污点 污点是定义在k8s集群的节点上的键值属性数据&#xff0c;可以决…

ARMv8-AArch64 的异常处理模型详解之异常处理详解(进入异常以及异常路由)

在上篇文章 ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions中&#xff0c;作者对异常处理整体流程以及相关概念做了梳理。接下来&#xff0c;本文将详细介绍处理器在获取异常、异常处理以及异常返回等过程中都做了哪些工作。 ARMv8-AArch64 的异常处理模型…

批量追踪中通快递

在物流信息的管理中&#xff0c;批量追踪中通快递单号一直是个让人头疼的问题。但有了固乔快递查询助手&#xff0c;这一切都变得轻而易举。 固乔快递查询助手&#xff0c;作为市场上备受好评的快递查询软件&#xff0c;专门针对批量查询需求进行了优化。用户只需将中通快递单号…

鸿蒙生态来了 ,60k 高薪向你招手

最近&#xff0c;各大平台都被华为鸿蒙不断刷屏。原因是在华为秋季发布会上&#xff0c;华为宣布启动鸿蒙原生应用&#xff0c;不再兼容安卓应用。一石激起千层浪&#xff0c;这无疑是IT界的一颗核弹&#xff0c;各大企业和开发者都纷纷开始加入“鸿蒙朋友圈”。 鸿蒙原生应用…

数据分析 — Matplotlib 、Pandas、Seaborn 绘图

目录 一、Matplotlib1、折线图2、柱状图3、水平条形图4、直方图5、散点图6、饼图 二、pandas1、折线图2、柱状图 三、seaborn1、散点图2、箱线图3、直方核密度图4、成对图 一、Matplotlib Matplotlib 是一个用于绘制数据可视化图形的 Python 库。它提供了丰富的绘图工具&#…

Eliminating Domain Bias for Federated Learning in Representation Space【文笔可参考】

文章及作者信息&#xff1a; NIPS2023 Jianqing Zhang 上海交通大学 之前中的NeurIPS23论文刚今天传到arxiv上&#xff0c;这次我把federated learning的每一轮看成是一次bi-directional knowledge transfer过程&#xff0c;提出了一种促进server和client之间bi-direction…

浅析Linux设备驱动:IO端口和IO内存

文章目录 概述IO端口和IO内存的区别 IO资源管理IO资源类型IO端口资源IO内存资源 IO资源分配 IO端口访问IO端口操作函数 IO内存访问IO内存操作函数 相关参考 概述 在计算机系统中&#xff0c;外部设备通常会提供一组寄存器或内存用于处理器配置和访问设备功能。这些寄存器或内存…

MCU电源控制(PWR)与低功耗

目录 一、STM32 的内核和外设电源系统管理&#xff1a; 二、MCU电源监控&#xff1a; 三、三种低功耗模式&#xff1a; 1、睡眠模式&#xff1a; 2、停止模式&#xff1a; 3、待机模式&#xff1a; 一、STM32 的内核和外设电源系统管理&#xff1a; ① 电池备份区域&#…