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

2024-02-19 00:52

本文主要是介绍【Kuiperinfer】笔记01 项目预览与环境配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习目标

  • 实现一个深度学习推理框架
  • 设计、编写一个计算图
  • 实现常见的算子,例如卷积、池化、全连接
  • 学会如何进行算子的优化加速
  • 使用自己的推理框架推理常见模型,检查结果是否能够和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 theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare 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 + yY = 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

这篇关于【Kuiperinfer】笔记01 项目预览与环境配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/722992

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤

《SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤》本文主要介绍了SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤,文中通过示例代码介绍的非常详... 目录 目标 步骤 1:确保 ProxySQL 和 mysql 主从同步已正确配置ProxySQL 的

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2