【竞赛/TPU】算能TPU编程竞赛总结
如果觉得我的分享有一定帮助,欢迎关注我的微信公众号 “码农的科研笔记”,了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【竞赛/TPU】算能TPU编程竞赛总结
1 基础知识
1.1【Ubuntu】
Ubuntu操作系统中有很多不同的文件夹,每个文件夹都有不同的用途和内容。以下是Ubuntu中常见的文件夹列表及其用途:
-
/:根目录,也称为“文件系统根”。所有其他文件夹都是在此根目录下的子目录。
-
/bin:存放基本系统命令的二进制文件,如ls、cp、mkdir等。
-
/boot:存放启动引导程序和内核镜像文件。
-
/dev:存放设备文件,包括硬件设备文件和虚拟设备文件。
-
/etc:存放系统配置文件,如网络配置、用户和组配置、安全配置等。
-
/home:存放用户主目录,每个用户都有一个与其用户名相同的文件夹。
-
/lib:存放系统共享库文件。
-
/media:用于挂载可移动媒体设备(如CD、DVD、USB驱动器)的挂载点。
-
/mnt:用于挂载其他文件系统的挂载点。
-
/opt:用于存放可选应用程序的文件夹。
-
/proc:虚拟文件系统,用于访问系统内核信息。
-
/root:超级用户(root)的主目录。
-
/run:存放系统运行时文件,例如PID文件和套接字文件。
-
/sbin:存放系统管理命令的二进制文件,例如reboot和shutdown。
-
/srv:用于存放本地服务的数据,例如Web服务器的网站内容。
-
/sys:虚拟文件系统,用于访问系统硬件信息。
-
/tmp:用于存放临时文件的文件夹。
-
/usr:用于存放系统应用程序和数据的文件夹,包括bin、lib、share等子文件夹。
-
/var:存放系统运行时文件和日志文件,例如日志文件、数据库文件、邮件文件等。
这些文件夹不仅在Ubuntu中存在,也存在于其他基于Linux的操作系统中,并且是基本的文件系统结构。
- ls -l 命令:以长格式的形式查看当前目录下所有可见文件的详细属性
1.2【Docker操作】
- docker images:将获得当前系统上所有可用的docker镜像的列表
- docker ps /docker ps -q:查看您系统中正在运行的docker容器
- docker stop <CONTAINER_ID/CONTAINER_NAME>:要停止正在运行的docker容器
- docker rm <CONTAINER_ID/CONTAINER_NAME>:删除容器
1.3【INT8对称量化模型和非对称区别】
https://tpumlir.org/docs/developer_manual/06_quantization.html
INT8对称量化模型和非对称量化模型都是用于优化神经网络模型的计算速度和内存占用的技术。
-
对称量化模型指的是量化范围以0为中心对称分布的模型。例如,对于8位整数,范围是-128到127。这意味着模型只能表示在这个范围内的整数值,并且0值是最精确的。因为它是对称的,因此在某些硬件上实现时,可以使用一些优化技术,例如位移和异或等来加速计算。
-
非对称量化模型指的是量化范围不对称的模型。例如,范围是0到255,这意味着模型可以表示0到255之间的整数值,并且128值是最精确的。非对称量化模型可以更好地适应具有不同权重分布的不同神经网络模型。
对称量化模型相对于非对称量化模型来说,具有更高的计算效率和更简单的实现方式。但是,非对称量化模型可以提供更高的精度和更广泛的数值表示范围。在选择量化方法时,需要考虑具体的应用场景和要求。
以图像分类任务为例,假设我们使用一个预训练好的卷积神经网络(CNN)模型来对图像进行分类。CNN模型通常具有大量的参数,因此在部署到嵌入式设备等资源受限的环境中时,需要将模型的计算速度和内存占用进行优化。在这种情况下,可以使用量化技术来优化模型。如果我们选择使用对称量化模型,将模型参数量化为8位整数,并且量化范围为-128到127。在这种情况下,所有的权重和激活值都将被量化为8位整数,并且量化范围是对称的。这种方法可以提高计算效率和内存利用率,并且可以使用硬件优化技术来加速计算。如果我们选择使用非对称量化模型,将模型参数量化为8位整数,并且量化范围为0到255。在这种情况下,所有的权重和激活值都将被量化为8位整数,并且量化范围是非对称的。这种方法可以提供更高的精度和更广泛的数值表示范围,但可能会导致一些硬件实现的复杂性。
1.4【为什么转INT8模型前需要跑calibration, 得到校准表】
在将神经网络模型转换为INT8格式之前,需要进行量化校准(calibration),以便确定量化范围和量化参数。量化校准是指将模型输入的数据集输入到模型中,并收集模型在这些数据上的激活值,然后基于这些激活值计算出一个量化参数表。这是因为在INT8量化模型中,模型中的权重和激活值都被量化为8位整数。但是,对于每个模型,量化参数都需要在实际数据上进行校准,以确保量化后的模型在精度上没有过多损失。因为在量化时,通过将浮点数值映射到整数值,会引入一些不可避免的误差,因此需要根据具体的模型和数据集来确定量化参数,以最小化精度损失。
量化校准通常包括以下步骤:
-
将数据集输入到模型中,收集模型在数据集上的激活值。
-
对激活值进行统计分析,以确定量化范围和量化参数。
-
根据量化参数生成一个量化表(Quantization Table),包括每个层的量化参数和量化范围。
-
将量化表应用到模型中,以将权重和激活值量化为8位整数。
量化校准是将模型从浮点数格式转换为INT8格式的关键步骤。通过量化校准,我们可以确保在进行INT8量化后,模型的精度仍然可以得到保持,从而可以在嵌入式设备等资源受限的环境中高效地部署模型。
2 TPU-MLIR竞赛
参赛地址:https://www.sophgo.com/competition/introduction.html?id=3
2.1【操作流程】
【第一步】购买云主机 ubuntu 18.04 64位,Putty连接服务器并登录
镜像: Ubuntu 20.04 64位
CPU: 16核
内存: 128G
系统盘总容量: 20GB
数据盘总容量: 0GB
【第二步】修改ubuntu用户名权限
Ubuntu系统默认用户是ubuntu,需要修改配置文件启动root
- 并设置密码: sudo passwd root
- 修改文件:sudo vim /etc/ssh/sshd_config
- 插入文件:shift+i
- 将PermitRootLogin prohibit-password更改为:PermitRootLogin yes
- 保存修改:按ESC,然后输入:wq
- 最后重启ssh服务:sudo systemctl restart ssh
- 利用root用户 root
【第三步】安装docker环境
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
【第四步:配置环境】首先从比赛官网下载tpu-mlir_v0.8.13-g327ff6dc-20230113以及unet.zip
sudo apt-get install tmux
tmux new -s mlir
mkdir worksplace
docker pull sophgo/tpuc_dev:latestdocker run --privileged=true --restart always -td -v /root/../home/ubuntu/worksplace:/workspace --name mlir sophgo/tpuc_dev:latest bashdocker exec -it mlir bash
mv tpu-mlir_v0.8.13-g327ff6dc-20230113 tpu-mlir
cd tpu-mlir
chmod -R +x ../tpu-mlir
source envsetup.sh
cd ..
mkdir competition
cd competition/unet/script
- apt-get install tmux:这个命令将安装tmux工具,它是一种终端复用器,可以让用户在单个终端窗口中同时运行多个命令行程序,而不需要打开多个终端窗口。在Ubuntu中,您可以使用apt-get包管理器来安装tmux。
- tmux new -s mlir:这个命令创建一个名为mlir的新tmux会话。tmux会话可以在一个终端窗口中同时运行多个终端会话,并且可以在会话之间切换。通过创建一个新会话,您可以在同一个终端窗口中同时运行多个命令行程序,而不需要打开多个终端窗口。这个命令中的-s选项用于指定新会话的名称,而mlir是会话的名称。如果省略-s选项,则会话名称将由tmux自动生成。
- mkdir worksplace:这个命令创建一个名为worksplace的新目录,用于存储您的工作文件。
- docker pull sophgo/tpuc_dev:latest:这个命令使用Docker引擎从Docker Hub Registry中拉取sophgo/tpuc_dev:latest镜像。该镜像是一个包含深度学习框架和TPU开发工具的Docker镜像。
- docker run --restart always -td -v /root/…/workspace:/workspace --name mlir sophgo/tpuc_dev:latest bash:这个命令使用sophgo/tpuc_dev:latest镜像创建一个新的Docker容器。–restart always选项告诉Docker引擎,当容器异常停止时应该自动重启容器。-td选项告诉Docker在容器中以交互式终端模式运行。-v /root/…/workspace:/workspace选项将/root/…/workspace目录挂载到容器内的/workspace目录,这样就可以在容器内访问/root/…/workspace目录中的文件。–name mlir选项为容器指定了一个名称mlir,以便以后可以使用该名称轻松访问容器。最后,bash命令告诉Docker在容器中启动Bash终端。
- docker exec -it mlir bash:这个命令通过容器名称mlir进入已经运行的Docker容器,并在容器中启动Bash终端。-it选项告诉Docker将终端连接到容器的标准输入和输出,并使终端处于交互模式。
【第五步:检测环境是否编译成功】
python3
import pyruntime_bm
import pymlir
exit()
【第六步:MLIR转F32模型】
unzip unet.zip
cd unet/script
sh run1.sh
sudo sh run.sh
sudo run.sh
【第六步:MLIR转INT8模型】
python3 ../../../tpu-mlir/python/tools/run_calibration.py ../model/unet_scale0.5.mlir \
--dataset ../data/test_hq \
--input_num 200 \
-o unet_scale0.5_cali_table
python3 ../../../tpu-mlir/python/tools/model_deploy.py \
--mlir ../model/unet_scale0.5.mlir \
--quantize INT8 \
--calibration_table unet_scale0.5_cali_table \
--chip bm1684x \
--tolerance 0.85,0.45 \
--model ../model/unet_scale0.5_int8.bmodel;
【第七步:结果输出】
python3 mlir_tester.py --img_dir ../data/test_hq --out_dir ../data/result --model ../model/unet_scale0.5.mlir
2.2【可能问题】
问题1
ImportError: /workspace/tpu-mlir/lib/libdnnl.so.2: file too short
替换libdnnl.so.2为其中对应的文件,并命名为libdnnl.so.2
问题2
ModuleNotFoundError: No module named ‘torchsummary’
直接运行:pip install torchsummary
问题3
fail to load cmodel: libcmodel.so
替换并覆盖
问题4
INFO:cpu_lib ‘libbmcpu.so’ is loaded.
问题5
ubuntu@10-60-205-99:~$ apt-get install tmux
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
sudo apt-get install tmux
问题6
权限不够解决办法, 通过 chmod -R +x ../bin
命令重新进一次该文件夹,bin
就代表当前文件夹。
相关文章:
【竞赛/TPU】算能TPU编程竞赛总结
如果觉得我的分享有一定帮助,欢迎关注我的微信公众号 “码农的科研笔记”,了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【竞赛/TPU】算能TPU编程竞赛总结 1 基础知识 1.1【Ubuntu】 Ubuntu操作系统中有很多不同的文件夹,每个…...
Substrate 基础教程(Tutorials) -- 模拟网络 添加可信节点
三、模拟网络 本教程基本介绍了如何使用一个私有验证器(validators)的授权集合来启动私有区块链网络。 Substrate节点模板使用授权共识模型(authority consensus model),该模型将块生产限制为授权帐户的旋转列表(rotating list)。授权帐户(…...
SAP 设置无物料号的费用采购
现在还是以外购电来说一下ERP中费用采购单的使用步骤: (1).Tcode:OMSF定义物料组D1,如下图。 (2).到配置路径IMG Path:物料管理->采购->帐户分配(或直接SE16:V_T163K)定义一科目分配类别,默认的K就是费用采购科目分配类型,如果可能可以复制一个,如下图,注意下…...
k8s ConfigMap 中 subPath 字段和 items 字段
Kubernetes中什么是subPath 有时,在单个 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 属性可用于指定所引用的卷内的子路径,而不是其根路径。 这句话理解了,基本就懂subPath怎么用了,比如我们要替换nginx.cnf, 挂…...
UML建模
主要记录UML中的相关知识,包括类、对象、接口、方法、用例、活动、状态、组件和部署图,详细介绍类之间关系与类图的绘制 文章目录一、UML介绍二、类图类之间的关系依赖关系继承关系实现关系关联关系组合关系聚合关系正文内容: 一、UML介绍 …...
JavaScript常见面试题(更新中)
介绍js的基本数据类型 js一共有五种数据类型 分别是undefined null boolean number string 还有ES6中新增的symbol和ES10的bigInt symbol代表创建后独一无二的不可变的数据类型,他的出现我认为是为了解决可能出现的全局变量冲突的问题 BigInt是一种数字类型的数据 …...
TCP/IP协议
✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录TCP/IP协议应用层协议自定义应用层协议DNS传输层协议端口号UDP协议UDP协议端格式TCP协议TCP协议段格式TCP工作机制确认应答(安…...
Python使用异步线程池实现异步TCP服务器交互
背景: 实现客户端与服务端交互,由于效率原因,要发送与接收异步,提高效率。 需要多线程,本文用线程池管理。 common代码: import pickle import struct import timedef send_msg(conn, data):time.sleep(…...
matplotlib常用操作
文章目录1 matplotlib绘图1.1 绘图步骤2 matplotlib基本元素2.1 matplotlib 画布2.2 设置坐标轴长度和范围2.3 设置图形的线型和颜色2.4 设置图形刻度范围、刻度标签和坐标轴标签等2.4.1 设置刻度范围2.4.2 设置坐标轴刻度2.5 文本标签图例3 matplotlib的ax对象绘图4 绘制子图5…...
二分算法题
文章目录一、在排序数组中查找数字二、0~n-1中缺失的数字三、旋转数组的最小数字四、二维数组中的查找一、在排序数组中查找数字 题目传送门 法一:暴力解 直接遍历然后计数 法二:二分法求边界 看到关键字排序数组、有序数组,一定要想到二分…...
Vue+ElementUI+SpringBoot项目配合分页插件快速实现分页(简单暴力)
首先需要在项目中引入Element-UI的组件库,使用以下命令,不会引入的请自行百度。 npm i element-ui -S Element官网地址:https://element.eleme.cn/#/zh-CN/component/changelog 去Element-UI官网组件库找到合适的分页插件,并把他引…...
【回眸】牛客网刷刷刷!嵌入式软件中也会遇到的嵌入式硬件,通讯,通讯协议专题(一)
前言 最近继续刷题,看看嵌入式软件还需要了解一些嵌入式硬件中的通讯协议和常用接口协议 比如说SPI CAN I2C 通讯协议专题 1.波特率 波特率 每秒传送的字符数 * 字符位数。串口的工作模式为1个起始位,7个数据位,1个校验位,1个…...
使用Vue展示数据(动态查询)
学习内容来源:视频P4 本篇文章进度接着之前的文章进行续写 精简前后端分离项目搭建 Vue基础容器使用 目录选择组件修改表格组件修改分页组件增加后端接口前端请求数据接口页面初始化请求数据点击页码请求数据选择组件 在官方文档中选择现成的组件,放在页…...
构建数据库测试数据——mysql
建表脚本 -- 建表 CREATE TABLE test_table (id INT(11) NOT NULL AUTO_INCREMENT,varchar_col VARCHAR(50),char_col CHAR(10),text_col TEXT,tinyint_col TINYINT(4),smallint_col SMALLINT(6),mediumint_col MEDIUMINT(9),int_col INT(11),bigint_col BIGINT(20),float_col…...
你想要的Android性能优化系列:启动优化 !
App启动优化为什么要做App的启动优化?网页端存在的一个定律叫8秒定律:即指用户访问一个网站时,如果等待打开的时间超过8秒,超过70%的用户将会放弃等待。同样的,移动端也有一个8秒定律:如果一个App的启动时间…...
python3的基础入门3:基本数据类型
基本数据类型 python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号(&…...
消息队列原理与实战-学习笔记
消息队列:保存消息的一个容器,本质是个队列,但是需要支持高吞吐、高并发、高可用。 1 前世今生 1.1 业界消息队列对比 Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色RocketMQ:低延迟、强一致、高性…...
Linux权限相关知识(大量图文展示,及详细操作)
Linux权限相关概念 Linux下有两种用户:一种是超级用户(root)、一种是普通用户。 超级用户:可以在linux系统下做任何事情,不受限制 普通用户:在linux下做有限的事情。 超级用户的命令提示符是“#”…...
Ep_操作系统面试题-什么是协程
协程 是一种 比线程更加轻量级的存 在,一个线程可以拥有多个协程。是一个特殊的 函数 ,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行。协程 不是被操作系统内核所管理 , 而完全是由程序所控制(也就是在…...
在C#中使用互斥量解决多线程访问共享资源的冲突问题
在阿里云上对互斥量的概述:互斥量的获取是完全互斥的,即同一时刻,互斥量只能被一个任务获取。而信号量按照起始的计数值的配置,可以存在多个任务获取同一信号量的情况,直到计数值减为0,则后续任务无法再获取…...
JavaEE进阶第六课:SpringBoot配置文件
上篇文章介绍了SpringBoot的创建和使用,这篇文章我们将会介绍SpringBoot配置文件 目录1.配置文件的作用2.配置文件的格式2.1 .properties语法2.1.1.properties的缺点2.2 .yml语法2.2.1优点分析2.2.2配置与读取对象2.2.3配置与读取集合2.2.4补充说明3.设置不同环境的…...
MySQL基础(一)SQL分类、导入、SELECT语句,运算符
目录 MySQL安装以及相关工具 SQL分类 导入数据 最基本的SELECT语句 SELECT FROM 列的别名 去除重复行 着重号 查询常数 描述表结构 过滤数据(重要) 运算符 算数运算符 比较运算符 符号运算符 非符号运算符 逻辑运算符 位运算符 MySQL安…...
反激与正激的区别
之前学习了正激开关电源,但是对于正激和反激一直不是很清楚,网上找了一篇,觉得感觉该可以,以此记录。正激和反激是两种不同的开关电源技术一、正激(1)概述正激式开关电源是指使用正激高频变压器隔离耦合能量…...
王道操作系统课代表 - 考研计算机 第四章 文件管理 究极精华总结笔记
本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “文件管理” 章节知识点总结的十分全面,涵括了《操作系统》课程里的全部…...
前端开发规范,你真的了解吗?一起来学习一下前端开发规范,让你的代码高级起来!
代码规范 1 编码风格规范 1.1 使用ES6风格编码源码 定义变量使用let ,定义常量使用const 使用export ,import 模块化 1.2 组件 props 原子化 提供默认值 使用 type 属性校验类型 使用 props 之前先检查该 prop 是否存在 1.3 避免 this.$parent 1.4 谨慎使用 …...
Licode—基于webrtc的SFU/MCU实现
1. webrtc浅析webrtc的前世今生、编译方法、行业应用、最佳实践等技术与产业类的文章在网上卷帙浩繁,重复的内容我不再赘述。对我来讲,webrtc的概念可以有三个角度去解释:(1).一个W3C和IETF制定的标准,约定…...
开发运维工具推荐 --- 解决远程访问局域网服务的问题。开发调试推荐
一、FastNat 可为您解决的问题1. 没公网服务器,需要发布本地的站点或网络程序到公网上,供他人访问;此项功能大大方面开发人员进行远程调试,微信小程序等开发工作进行。2. 需要远程到在其他网络中的设备,但两处的网络不…...
【华为OD机试 】单词倒序(C++ Java JS Python)
文章目录 题目描述输入描述输出描述备注用例题目解析C++ 解法JavaScript算法源码Java算法源码Python解法题目描述 输入单行英文句子,里面包含英文字母,空格以及,.?三种标点符号,请将句子内每个单词进行倒序,并输出倒序后的语句。 输入描述 输入字符串S,S的长度 1 ≤ N…...
PLC 诊断故障的基本原理
(1)东欢坨选煤厂机电设备故障信号主要取自开关量信号,PLC 通过开关量的通和断对设备进行故障诊断。PLC 对开关量的识别是通过输入模块来实现的。PLC 控制设备运行时,设备中的温度、压力、急停、跑偏、速度、过热以及各种按钮和行程开关的传感器与 PLC 输入模块相连接,输入模块的…...
QT打开外部程序并嵌入Qt子窗口的缺点
首先可以参考如下文章: QT打开外部程序并嵌入Qt界面_qt界面嵌入外部应用程序_初学小白Lu的博客-CSDN博客 Qt嵌入外部程序界面初探_qt嵌入其他程序窗口_liming4675的博客-CSDN博客 QT 如何把外部程序嵌入到QT界面_qt嵌入其他程序窗口_hellokandy的博客-CSDN博客 Qt界…...
淄博做网站小程序的公司/惠州seo外包服务
洛谷 P1886 滑动窗口 (单调队列) 题解 洛谷 P1886 题目 有一个长为 nnn 的序列 aaa,以及一个大小为 kkk 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 例如&…...
公装网站怎么做/南宁百度seo排名价格
1.diff命令 (1)diff比对文件夹 diff -r 文件夹1 文件夹2 > 对比信息的文件 diff -r a b > test.log (2)diff比对文件 diff 文件1 文件2 > 对比信息的文件 diff a.c b.c > test.log 2.path命令 (1)...
网站代理备案步骤/开鲁视频
Node.js os 模块提供了一些基本的系统操作函数。可以通过以下方式引入该模块(不过最新版本的node.js已经默认引入了该模块了): var os require("os"); hostname() 返回操作系统的默认临时文件夹。loadavg() 返回一个包含 1、5、…...
做网站网页版和手机版/百度免费建网站
题面描述了一种加密的方式,让coder按照要求解密~ 将字母分成三段,再将位置用数组储存~所谓的旋转其实就是右移~ #include"cstdio" #include"iostream" #include"cstring" using namespace std; int main() { int k1,k2,…...
一般网站建设用什么样的代码/如何推广网店
常系数齐次线性递推 要干啥 已知\[f[n]\sum_{i1}^k C_if[n-i]\] 求\(f[n]\)的值,\(n\le 10^9,k\le 20000\),答案取模。 暴力做法 如果复杂度\(O(nk)\)允许的话,显然是可以直接\(dp\)转移的。 当\(k\)很小的时候,转移写成矩阵形式&…...
如何建立网站链接/注册公司流程和费用
一、MNIST手写数字介绍 1、获取样本 手写数字的MNIST数据库可从此页面获得,其中包含60,000个示例的训练集以及10,000个示例的测试集。它是NIST提供的更大集合的子集。这些数字已经过尺寸标准化并以固定尺寸的图像为中心。 下载链接:http://yann.lecun.co…...