Aven_dQ5wsP · 7月22日

R329开发板(仿真)部署AIPU初体验

操作系统:Ubuntu
版 本:20.04 LTS (18.04也一样)
假定当前目录:/root/demo/pb
模 型 文 件 : mobilenet_v1_1.0_224_frozen.pb

docker环境准备


  1. 更新包并安装一些必须的软件
sudo apt update
  1. 安装一些必须的组件
sudo apt install apt-transport-https ca-certificates curl gnupg unzip lsb-release
  1. 添加 Docker 官方的 GPG key到本地
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 设置使用稳定版 stable repo.
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

如果要使用 nightly 或者 test repo. 把上面命令中的 stable 替换即可

  1. 再次更新源并安装docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
  1. 上面命令完成后,使用以下命令进行一下测试
sudo docker run hello-world

如果返回如下图中的信息,说明docker环境安装成功了,如果未成功请按上面步骤重新尝试。
image.png

仿真环境搭建


  1. 仿真镜像获取,如果访问国外网络速度很好,可以直接用以下命令从docker官方Hub摘取镜像。镜像挺大请耐心等待完成
sudo docker pull zepan/zhouyi
  1. 如果访问国外网络速度不好,可以使用下载百度网盘中的仿真镜像文件,然后本地载入。

链接:https://pan.baidu.com/s/1yaKBPDxR\_oakdTnqgyn5fg 提取码:f8dr

3.解压镜像并导入到本地,注意镜像文件路径

gunzip zhouyi_docker.tar.gz
sudo docker load --input zhouyi_docker.tar
  1. 用以下命令检查是否导入成功,如果执行结果中出现下图所示内容,说明导入成功了
docker images

image.png

  1. 使用以下命令创建仿真环境
docker run -itd  -v /root/data:/root/data --name zhouyi  zepan/zhouyi  /bin/bash

其中 zhouyi 是使用镜像创建的容器名,可以根据需要设置

 -v /root/data:/root/data

为了方便文件的传输,使用以上参数把宿主中的 /root/data/ 目录映射到新创建的仿真环境中,也就是说当我们把文件上传到宿主 /root/data/ 下时,仿真环境中的 /root/data/目录下就会有相应的文件,无须再用 docker cp 命令逐个复制

其中 -d 参数是指定容器在后台运行,也就是说关闭当前窗口,容器一样在运行。

关闭窗口后如果我们想再次进行仿真环境,可以使用以下命令

docker  attach  zhouyi

其中 zhouyi 就是是创建时的容器名或者窗口的 ID(下图红框中),可以用以下命令获取

docker ps

image.png

仿真环境测试及模型量化


  1. 容器仿真环境验证。使用以下命令查看已经启动的容器
docker ps

image.png

如果执行结果中有上图中标红的内容,我们可以直接附加到已运行容器

docker  attach  zhouyi

如果容器没有运行,可以使用以下命令先启动

docker  start  zhouyi

image.png

当终端中出现上图中的内容时,说明已经进入到窗口仿真环境了

此时我们选切换到示例目录,此处使用的是pb格式模型,

cd /root/demos/pb

此时我们执行环境验证命令

aipubuild config/resnet_50_run.cfg

根容器分配到的配置,此命令消耗时间从长短不同,命令执行完成即说明环境正常,此时屏幕内容应类似如下图

image.png

仿真环境验证无误,下面可以根据需要进行相应的模型量化了

  1. 网络输出名字的获取,所需工具 Netron(开源) 点此下载
    用Netron打开模型文件,拖动到最底部,如图点一下输出层,有个弹出层
    其中name就是输出层的名字
    image.png

3.制作用于量化的矫正数据集和标签

准备一定数量的样本图片放在目录下

/root/demos/pb/dataset1/sample

然后把所有图片和对应的标签写到文件,每行一个,
格式为

图片名 空格  标签
1.jpg  0
2.jpg  0
.....
3.jpg  1
4.jpg  2

把以上内容保存到

/root/demos/pb/dataset1/sample_label.txt

把示例生成矫正数据集脚本复制到目录

cp /root/demos/pb/dataset/preprocess_dataset.py /root/demos/pb/dataset1/preprocess_dataset.py

主要修改下面几个地方

img_dir='./sample/'
label_file='./sample_label.txt'

#RESNET PARAM
input_height=224
input_width=224
input_channel = 3
mean = [127.5, 127.5, 127.5]
var = 127.5

然后执行脚本生成矫正样本数据集和标签

cd ./dataset1
python3 ./preprocess_dataset.py

执行完成后在 dataset1 目录下会生成以下两个文件

image.png

  1. 准备量化时测试用文件input_cup.bin
    修改 gen_inputbin.py 文件
vim ./model/gen_inputbin.py

主要是图片的文件路径,在此我们用一张杯子的图片做输入

cup.jpeg

input_height=224
input_width=224
input_channel = 3
mean = [127.5, 127.5, 127.5]
var = 1

img_name = "./cup.jpeg"

......

fw = open("input_cup.bin", "wb")
fw.write(data)
fw.close()
print("save to input.bin OK")

执行以下命令生成 input_cup.bin 文件

python3 gen_inputbin.py

运行结果如下说明生成成功

image.png

  1. 模型量化配置文件
    在此使用的已经固化好的PB模型 【mobilenet-v1-1.0-224.pb】,首先我们创建一个量化配置文件,我们复制示例配置文件然后修改即可。也可以用自己导出的模型,导出模型 ,
cp config/resnet_50_run.cfg config/mobilenet-v1-1.0-224.cfg

然后我们用vim进行修改此配置文件,关于vim的基本操作在此不多说了。

vim config/mobilenet-v1-1.0-224.cfg

几处需要修改的地方如下图中标红之处
image.png

[Common]
# 仿真环境用run 真实环境 build
mode=run  

[Parser]
# 目前根据观察量化时一些中间文件会用,应该可以随意
model_name = mobilenet_v1 
# 根据名字猜测为检测模型量化时后处理相关
detection_postprocess =
# 分类模型 image_classification 同理猜测检测模型 image_detection
model_domain = image_classification 
# 网络的输出名名字,具体请看下一小节内部
output = MobilenetV1/Predictions/Reshape_1 
# 待量化模型文件的路径
input_model = ./model/mobilenet_v1_1.0_224_frozen.pb
# 待量化模型的网络输入名称
input = input
# 待量化模型的内乡输入大小
input_shape = [1,224,224,3]
# 输出文件存入目录
output_dir = ./

[AutoQuantizationTool]
# 目前根据观察量化时一些中间文件会用,应该可以随意,和上面的保持一致
model_name = mobilenet_v1
# 根据字面猜测量化方式
quantize_method = SYMMETRIC
# OP相关,具体目前未知
ops_per_channel = DepthwiseConv
# 用于量化矫正的样本集
calibration_data = ./dataset1/dataset.npy
# 用于量化矫正的样本集标签
calibration_label = ./dataset1/label.npy
# 预处理方式,归一化
preprocess_mode = normalize
# 量化类型 int8
quant_precision=int8
# 是否交换RB通道,主要看模型输入是BGR还是RGB
reverse_rgb = False
# 标签偏移量
label_id_offset = 0

[GBuilder]
# 量化完成测试用输入文件
inputs=./model/input_cup.bin
# 模拟器? 未知
simulator=aipu_simulator_z1
# 量化完成测试输入文件对应的输出结果
outputs=output_mobilenet_v1_1.0.bin
# 猜测是量化时收集一些性能相关数据
profile= True
# 版本号? 猜测
target=Z1_0701

对于 【mobilenet-v1-1.0-224.pb】 修改后的文件内容如下

[Common]
mode=run

[Parser]
model_name = mobilenet_v1
detection_postprocess = 
model_domain = image_classification
output = MobilenetV1/Predictions/Reshape_1
input_model = ./model/mobilenet_v1_1.0_224_frozen.pb
input = input
input_shape = [1,224,224,3]
output_dir = ./

[AutoQuantizationTool]
model_name = mobilenet_v1
quantize_method = SYMMETRIC
ops_per_channel = DepthwiseConv
calibration_data = ./dataset1/dataset.npy
calibration_label = ./dataset1/label.npy
preprocess_mode = normalize
quant_precision=int8
reverse_rgb = False
label_id_offset = 0

[GBuilder]
inputs=./model/input_cup.bin
simulator=aipu_simulator_z1
outputs=output_mobilenet_v1_1.0.bin
profile= True
target=Z1_0701
  1. 在仿真环境中执行量化
cd /root/demos/pb
aipubuild config/mobilenet-v1-1.0-224.cfg

如果不出现红色日志,说明量化成功了,此时会得到标红的量化参数

image.png

同时在当前目录下也会得到量化运行结果文件

output_mobilenet_v1_1.0_224.bin
  1. 量化结果对比

首先修改上面生成的量化测试用文件input_cup.bin

vim ./quant_predict.py

主要修改以下文件路径

input_path = './model/input_cup.bin'

然后可以执行查看结果

python3 ./quant_predict.py

由截图可以看出预测结果top1【cup】是一致的,概率prob大小范围不同是因为
在用原始模预测时被缩放到0至1了

image.png

检测模型尝试


由于目前没有找到相关的说明文档,所以仅只是初步尝试

  1. yolo-v3-tiny

image.png

由日志可以看出模型解析部分没有问题,但量化时出了错

  1. ssd_mobilenet_v1_coco

image.png

由日志可以看模型解析时就出错了,有些OP不支持

如果有机会收到板子再继续尝试吧

相关文件下载


本文提到的所有文件及代码,可以从这里下载: z1.zip (提取码: 8hs2)

1 阅读 82
推荐阅读
0 条评论
关注数
0
文章数
1
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
Arm中国学堂公众号
关注Arm中国学堂
实时获取免费 Arm 教学资源信息
Arm中国招聘公众号
关注Arm中国招聘
实时获取 Arm 中国职位信息