【竞赛/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:latest

docker run --privileged=true --restart always -td -v /root/../home/ubuntu/worksplace:/workspace --name mlir sophgo/tpuc_dev:latest bash

docker 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

问题6

权限不够解决办法, 通过 chmod -R +x ../bin 命令重新进一次该文件夹,bin 就代表当前文件夹。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值