【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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot的智能物流管理系统,计算机毕业设计(带源码+论文)

源码获取地址: 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1759581137025445890

npm ERR! network This is a problem related to network connectivity.

遇到 ETIMEDOUT 错误时,这表明npm尝试连接到npm仓库时超时了,这通常是由网络连接问题引起的。这可能是因为网络不稳定、连接速度慢、或者你的网络配置阻止了对npm仓库的访问。以下是一些解决这个问题的步骤: 1. 检查网络连接 首先&#xff…

java的泛型【详解】

定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff08;如&#xff1a;<E>&#xff09; &#xff0c;称为泛型类、泛型接口&#xff0c;泛型方法、它们统称为泛型。 作用&#xff1a;泛型提供了在编译阶段约束所能操作的数据类型&#xff0c;并自…

Qt 使用QScintilla 编辑lua 脚本

需求&#xff1a; 利用QScintilla 编辑lua 脚本 步骤&#xff1a; 1&#xff0c;下载 QScintilla Riverbank Computing | Download 2, 打开 src/qscintilla.pro 文件 编译出 dll库 3&#xff0c;工程中引入这个库 注意debug 模式 必须加载debug 版本编译的库&#xff0…

Yii2项目使用composer异常记录

问题描述 在yii2项目中&#xff0c;使用require命令安装依赖时&#xff0c;出现如下错误提示 该提示意思是&#xff1a;composer运行时&#xff0c;执行了yiisoft/yii2-composer目录下的插件&#xff0c;但是该插件使用的API版本是1.0&#xff0c;但是当前的cmposer版本提供的…

Selenium实现多页面切换

当使用 Selenium 进行自动化测试或爬取数据时&#xff0c;有时需要处理多个页面之间的切换。以下是一些可能需要多页面切换的情况&#xff1a; 1、打开新窗口/页面&#xff1a; 在当前页面上点击链接、按钮或执行某些操作时&#xff0c;可能会打开一个新的窗口或页面。此时&a…

MySQL 基础知识(六)之数据查询(一)

目录 1 基本查询 1.1 查询相关列 (select * / 列名) 1.2 别名 (as) 1.3 去重 (distinct) 1.4 对列中的数据进行运算 (、-、*、/) 2 条件查询 (where) 2.1 等值查询 () 2.2 非等值查询 (>、<、>、<、!、><) 2.3 逻辑判断 (and、or、not) 2.4 区间判…

matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果

uintt16位的话会在上面前面加上00&#xff0c;16位的话一定是两个字节&#xff0c;一共16位的数据 如果是unint8的话就不会&#xff0c; 注意这里给的是13&#xff0c;但是现实的00 0D&#xff0c;这是大小端的问题&#xff0c;在matlanb里设置&#xff0c;我们就默认用这个模式…

更快找到远程/自由工作的网站

不要使用Fiver或Upwork。 它们已经饱和了。 下面是10个更快找到远程/自由工作的网站&#xff1a; 1. Toptal 这个网站专门为熟练的自由职业者提供远程工作机会&#xff0c;如Shopify和Priceline等一流公司。 他们只接受软件开发、设计和金融等领域的顶级3%自由职业者。 htt…

普中51单片机学习(九)

蜂鸣器 蜂鸣器简介 在单片机应用的设计上&#xff0c;很多方案都会用到蜂鸣器&#xff0c;大部分都是使用蜂鸣器来做提示或报警&#xff0c;比如按键按下、开始工作、工作结束或是故障等等。改变单片机引脚输出波形的频率&#xff0c;就可以调整控制蜂鸣器音调&#xff0c;产…

问题:从完整的问题解决过程来看,( )是首要环节。A.理解问题 B.提出假设C.发现问题 D.检验假设 #学习方法#学习方法

问题&#xff1a;从完整的问题解决过程来看&#xff0c;&#xff08; &#xff09;是首要环节。A&#xff0e;理解问题 B&#xff0e;提出假设C&#xff0e;发现问题 D&#xff0e;检验假设 A.理解问题 B.提出假设 C&#xff0e;发现问题 参考答案如图所示

Eclipse - Switch Workspace

Eclipse - Switch Workspace References Switch Workspace References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

代码随想录算法训练营DAY20 | 二叉树 (8)

一、LeetCode 701 二叉搜索树中的插入操作 题目链接&#xff1a; 701.二叉搜索树中的插入操作https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 思路&#xff1a;见缝插针罢辽。 class Solution {public TreeNode insertIntoBST(TreeNode root, i…

vue3项目配置按需自动导入API组件unplugin-auto-import

场景应用&#xff1a;避免写一大堆的import&#xff0c;比如关于Vue和Vue Router的 1、安装unplugin-auto-import npm i -D unplugin-auto-import 2、配置vite.config import AutoImport from unplugin-auto-import/vite//按需自动加载API插件 AutoImport({ imports: ["…

掘根宝典之C++深复制与浅复制(复制构造函数,默认复制构造函数)

到目前为止我们已经学了构造函数&#xff0c;默认构造函数&#xff0c;析构函数&#xff1a;http://t.csdnimg.cn/EOQxx 转换函数&#xff0c;转换构造函数&#xff1a;http://t.csdnimg.cn/kiHo6 友元函数&#xff1a;http://t.csdnimg.cn/To8Tj 接下来我们来学习一个新函数…

数据传输稳如山,郑州大象陶瓷展文物预防性保护更安心

​一、“人间烟火——古代陶瓷中的衣食住行”郑州展览 2月8日&#xff0c;郑州大象瓷博物馆与郑州紫荆山公园协作&#xff0c;呈现了一场独特的文化盛会。“人间烟火——古代陶瓷中的衣食住行”展览正式拉开帷幕&#xff0c;为市民和游客带来了穿越历史、贯穿古今的文化体验。…

11. Springboot集成Dubbo3(二)示例demo

目录 1、前言 2、注册中心 3、快速开始 3.1、添加dubbo3依赖 3.2、dubbo3-api ​编辑 3.3、dubbo3-server 3.3.1、添加依赖 3.3.2、实现IUserService 3.3.3、添加配置文件application.properties 3.3.4、修改Application启动类 3.3.5、出错解决 3.4、dubbo3-porta…

【零基础学习CAPL】——CAN报文的发送(面板中直接修改信号值进行发送)

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 文章目录 1.概述2.面板创建3.系统变量创建4.系统变量与Panel值绑定4.CAPL实现5.效果6.全量脚本1.概述 在前面文章”【零基础学习CAPL】——CAN报文的发送(按下按钮同时周期性发送)“中对于发送报文中的信号是在脚本中固…

Nodejs 第三十八章(mysql2)

在之前的篇章中&#xff0c;已经补充完成mysql的基本知识&#xff0c;那么现在开始&#xff0c;我们需要把mysql和express,nodejs连接起来。 安装依赖 npm install mysql2 express js-yamlmysql2 用来连接mysql和编写sq语句express 用来提供接口 增删改差js-yaml 用来编写配置…

PyCharm 取消所有断点

PyCharm 取消所有断点 1. Run -> View Breakpoints...2. Python Line Breakpoint3. Remove - DoneReferences 1. Run -> View Breakpoints… 2. Python Line Breakpoint ​​​ 3. Remove - Done References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/