0x00 背景
新一轮白嫖板子活动开始了,好耶。这次白嫖的板子是矽速科技的R329开发板,R329是全志科技的一款芯片,搭载了ARM 中国的AIPU,正好借这次活动来体验一下,下面开始。
0x01 搭建环境
官方只提供了linux版本的sdk,因此我们在ubuntu下面开发
linux 版本:ubuntu 18.04
python环境:anaconda 4.9.2
先来创建所需要的python环境:
conda create -n r329 python=3.6
conda activate r329
创建工作目录
mkdir -p r329/workspace/sdk
cd r329/workspace
0x02 获取模型
https://github.com/tensorflow...,在这个链接下随便下载一个,这里我们下载vgg_16。在工作区下面创建目录vgg_16,把文件拷贝进去并解压,这个是预训练的权重数据。
mkdir vgg_16
tar -vxf vgg_16_2016_08_28.tar.gz
rm vgg_16_2016_08_28.tar.gz
接下来冻结模型
克隆TensorFlow的model备用
git clone https://github.com/tensorflow/models.git
导出推理图
cd models/research/slim/
python export_inference_graph.py \
--alsologtostderr \
--model_name=vgg_16 \
--image_size=224 \
--labels_offset=1 \
--output_file=/home/zyx/r329/workspace/vgg_16/vgg_16_model/vgg_16_inf.pb
在vgg_16_model目录下看到生成的pb文件,用netron.app在线查看导出的图结构,这里可以查看输出名称:vgg_16/fc8/squeezed,这个冻结模型时会用到。
冻结模型
clone tensorflow源码
git clone https://github.com/tensorflow/tensorflow.git
冻结
cd tensorflow/tensorflow/python/tools
python freeze_graph.py \
--input_graph=/home/zyx/r329/workspace/vgg_16/vgg_16_model/vgg_16_inf.pb \
--input_checkpoint=/home/zyx/r329/workspace/vgg_16/vgg_16_model/vgg_16.ckpt \
--input_binary=true --output_graph=/home/zyx/r329/workspace/vgg_16/vgg_model/frozen.pb \
--output_node_names=vgg_16/fc8/squeezed
可能会报如下错误:
ImportError: cannot import name 'py_checkpoint_reader'
修改freeze_graph.py文件:
#from tensorflow.python.training import py_checkpoint_reader
import tensorflow as tf
reader = tf.train.NewCheckpointReader(input_checkpoint)
这里的修改有点奇葩,因为我这个环境安装过TensorFlow1.15,所以可以这么临时修改。
在vgg_16_model目录下看到frozen.pb文件说明冻结成功了。
0x03 准备数据校准集
创建preprocess_vgg_16_dataset文件夹。
这里我们偷个懒,因为这些模型都是1000分类的,所以数据校准集直接拿sdk里面的,我们修改一下py脚本重新运行即可,把Zhouyi\_Compass/AI610-SDK-r0p0-00eac0/AI610-SDK-1003-r0p0-eac0/user-case-example/tf/preprocess_resnet_50_dataset目录下的文件直接复制到preprocess_vgg_16_dataset文件夹下。
input_height=224
input_width=224
input_channel = 3
mean = [127.5, 127.5, 127.5]
var = 1
生成dataset.npy label.npy
python preprocess_dataset.py
0x04 生成input.bin
直接拿zepan docker里的py脚本
sudo docker cp 9b0bb35c2608:/root/demos/tflite/model/gen_inputbin.py .
sudo chmod 777 gen_inputbin.py
我们随便找一张1000分类里面有的图片
修改脚本输入图片
执行脚本生成input.bin文件用于模型的输入
python gen_inputbin.py
0x05 构建可执行的模型并在仿真器上跑起来
先把AI610-SDK-1002-r0p0-eac0/simulator的仿真器目录拷贝到sdk目录下。
根据官方sdk文档,首先创建个cfg文件用于仿真模型,把Zhouyi_Compass/AI610-SDK-r0p0-00eac0/AI610-SDK-1003-r0p0-eac0/user-case-example/tf/config目录下的resnet_50_run.cfg文件拷贝到vgg_16/config目录下并修改成如下内容:
vgg_16_run.cfg
[Common]
mode=run
[Parser]
model_name = vgg_16
detection_postprocess =
model_domain = image_classification
output = vgg_16/fc8/squeezed
input_model = ./vgg_16_model/frozen.pb
input = input
input_shape = [1,224,224,3]
[AutoQuantizationTool]
model_name = vgg_16
quantize_method = SYMMETRIC
ops_per_channel = DepthwiseConv
calibration_data = ./preprocess_vgg_16_dataset/dataset.npy
calibration_label = ./preprocess_vgg_16_dataset/label.npy
preprocess_mode = normalize
quant_precision=int8
reverse_rgb = False
label_id_offset = 0
[GBuilder]
inputs=./vgg_16_model/input.bin
simulator=../sdk/simulator/bin/aipu_simulator_z1
outputs=output_vgg_16.bin
profile= True
target=Z1_0701
在sdk下创建build目录,把构建工具拷贝过来,工具目录AI610-SDK-1003-r0p0-eac0
安装build-tools AIPUBuilder,使用清华的pip源:
pip install AIPUBuilder-3.0.175-cp36-cp36m-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple/
将动态库添加到环境变量
export LD_LIBRARY_PATH=../sdk/simulator/lib:${LD_LIBRARY_PATH}
执行 aipubuild 开始仿真
aipubuild ./config/vgg_16_run.cfg
看到下面的log说明成功了
[INFO]:AIPU START RUNNING: BIN[0]
[INFO]:TOTAL TIME: 42.229991s.
[INFO]:SIMULATOR EXIT!
[I] [main.cpp : 135] Simulator finished.
Total errors: 0, warnings: 0
0x06 验证仿真的结果
从zepan的docker镜像里直接拷贝出quant_predict.py脚本
sudo docker cp 9b0bb35c2608:/root/demos/tflite/quant_predict.py .
chmod 777 quant_predict.py
修改脚本,我们只留下预测部分
outputfile = current_dir + '/output_vgg_16.bin'
npyoutput = np.fromfile(outputfile, dtype=np.int8)
结果:
(tf_1_15) zyx@zyx-B360M:~/r329/workspace/vgg_16$ python quant_predict.py
predict first 5 label:
index 0, prob 127, name: tench, Tinca tinca
index 1, prob 127, name: goldfish, Carassius auratus
index 758, prob 125, name: reel
index 27, prob 121, name: eft
index 389, prob 113, name: barracouta, snoek
Detect picture save to result.jpeg
我们输入图片是金鱼,可以看到结果还是不错的。
工程文件全部打包上传到百度云(文件有点大):链接: 链接: https://pan.baidu.com/s/1UxD6... 密码: gciu