操作环境:win10下虚拟机Ubuntu14.04系统
一、搭建矽速科技提供的docker环境
1.下载镜像文件
# 链接:https://pan.baidu.com/s/1yaKBPDxR_oakdTnqgyn5fg
# 提取码:f8dr
gunzip zhouyi_docker.tar.gz
sudo docker load --input zhouyi_docker.tar
2.测试环境
sudo docker run -i -t zepan/zhouyi /bin/bash
cd ~/demos/tflite
./run_sim.sh
python3 quant_predict.py
二、生成模型文件
1.下载模型: NASNet-A_Mobile_224
wget https://storage.googleapis.com/download.tensorflow.org/models/nasnet-a_mobile_04_10_2017.tar.gz
tar xvf nasnet-a_mobile_04_10_2017.tar.gz
2.拉取源码
git clone https://github.com/tensorflow/models.git
git clone -b r1.15 --single-branch https://github.com/tensorflow/tensorflow.git
由于说不清的网络原因,将cpkt文件转成pb文件,会报如下错误。
解决办法: 修改imagenet.py文件。
cd models/research/slim/datasets
vim imagenet.py
'''
#filename, _ = urllib.request.urlretrieve(synset_url)
filename='./datasets/imagenet_lsvrc_2015_synsets.txt'
#filename, _ = urllib.request.urlretrieve(synset_to_human_url)
filename='./datasets/imagenet_metadata.txt'
'''
3.导出图
python3 export_inference_graph.py \
--alsologtostderr \
--model_name=nasnet_mobile \
--image_size=224 \
--output_file=/tf/nasnet_mobile.pb
4.冻结图
python3 freeze_graph.py \
--input_graph=/tf/nasnet_mobile.pb \
--input_checkpoint=/tf/model.ckpt \
--input_binary=true \
--output_graph=/tf/nasnet_mobile_frozen.pb \
--output_node_names=final_layer/predictions
三、准备量化矫正数据集
1.下载1000类的1000张图片 imagenet-sample-images
wget https://github.com/nihui/imagenet-sample-images
tar -xvf imagenet-sample-images-master.zip
#重命名
mv imagenet-sample-images-master imagenet-sample-images
2.生成 dataset.npy 和 label.npy 文件
#先修改 preprocess_dataset.py
cd demos/pb/dataset/
vim preprocess_dataset.py
'''
img_dir='./imagenet-sample-images/'
label_file='./imagelabel.txt'
'''
python3 preprocess_dataset.py
3.生成 input.bin。 测试图片使用 ILSVRC2012_val_00000003.JPEG,将其复制model下,重命名1.jpg,执行以下命令。
python3 gen_inputbin.py
四、编辑NN compiler配置文件
得到pb和校准数据集后,我们就可以编辑NN编译器的配置文件来生成AIPU的可执行文件。
拿出 demos/pb/config/ 里的 resnet_50_run.cfg 重命名为 nasnet_mobile_run.cfg,并修改
[Common]
mode=run
[Parser]
model_name = nasnet_mobile
detection_postprocess =
model_domain = image_classification
output = final_layer/FC/BiasAdd
input_model = /tf/nasnet_mobile_frozen.pb
input = input
input_shape = [1,224,224,3]
output_dir = ./
[AutoQuantizationTool]
model_name = nasnet_mobile
quantize_method = SYMMETRIC
ops_per_channel = DepthwiseConv
calibration_data = ./dataset/dataset.npy
calibration_label = ./dataset/label.npy
preprocess_mode = normalize
quant_precision=int8
reverse_rgb = False
label_id_offset = 0
[GBuilder]
inputs=./model/input.bin
simulator=aipu_simulator_z1
outputs=output_resnet_50.bin
profile= True
target=Z1_0701
五、仿真AIPU执行结果
编辑完cfg文件后,即可执行获得运行结果
aipubuild config/nasnet_mobile_run.cfg
执行后生成文件:output_resnet_50.bin,以下为执行log:
[I] [main.cpp : 118] run simulator:
aipu_simulator_z1 /tmp/temp_3a8415aa7cc317d85c826621f90ae.cfg
[INFO]:SIMULATOR START!
[INFO]:========================================================================
[INFO]: STATIC CHECK
[INFO]:========================================================================
[INFO]: INST START ADDR : 0x0(0)
[INFO]: INST END ADDR : 0x18c7ef(1624047)
[INFO]: INST SIZE : 0x18c7f0(1624048)
[INFO]: PACKET CNT : 0x18c7f(101503)
[INFO]: INST CNT : 0x631fc(406012)
[INFO]:------------------------------------------------------------------------
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x238: 0x472021b(POP R27,Rc7) vs 0x5f00000(MVI R0,0x0,Rc7), PACKET:0x238(568) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x245: 0x472021b(POP R27,Rc7) vs 0x5f00000(MVI R0,0x0,Rc7), PACKET:0x245(581) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x3aa: 0x472021b(POP R27,Rc7) vs 0x9f80020(ADD.S R0,R0,0x1,Rc7), PACKET:0x3aa(938) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x5e7: 0x4520180(BRL R0) vs 0x47a03e4(ADD R4,R0,R31,Rc7), PACKET:0x5e7(1511) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x780: 0x4720204(POP R4,Rc7) vs 0x9f80020(ADD.S R0,R0,0x1,Rc7), PACKET:0x780(1920) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0xc2a: 0x4720204(POP R4,Rc7) vs 0x47a1be0(ADD R0,R6,R31,Rc7), PACKET:0xc2a(3114) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x10c4: 0x472021b(POP R27,Rc7) vs 0x5f00000(MVI R0,0x0,Rc7), PACKET:0x10c4(4292) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x10d1: 0x472021b(POP R27,Rc7) vs 0x5f00000(MVI R0,0x0,Rc7), PACKET:0x10d1(4305) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x1236: 0x472021b(POP R27,Rc7) vs 0x9f80020(ADD.S R0,R0,0x1,Rc7), PACKET:0x1236(4662) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x1473: 0x4520180(BRL R0) vs 0x47a03e4(ADD R4,R0,R31,Rc7), PACKET:0x1473(5235) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x160c: 0x4720204(POP R4,Rc7) vs 0x9f80020(ADD.S R0,R0,0x1,Rc7), PACKET:0x160c(5644) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x1ab6: 0x4720204(POP R4,Rc7) vs 0x47a1be0(ADD R0,R6,R31,Rc7), PACKET:0x1ab6(6838) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x5c59: 0x4720204(POP R4,Rc7) vs 0x47a1be0(ADD R0,R6,R31,Rc7), PACKET:0x5c59(23641) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x63c8: 0x4720204(POP R4,Rc7) vs 0x47a1be0(ADD R0,R6,R31,Rc7), PACKET:0x63c8(25544) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x67ec: 0x472021b(POP R27,Rc7) vs 0x5f00000(MVI R0,0x0,Rc7), PACKET:0x67ec(26604) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x67f9: 0x472021b(POP R27,Rc7) vs 0x5f00000(MVI R0,0x0,Rc7), PACKET:0x67f9(26617) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x695e: 0x472021b(POP R27,Rc7) vs 0x9f80020(ADD.S R0,R0,0x1,Rc7), PACKET:0x695e(26974) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x6b07: 0x4520180(BRL R0) vs 0x47a03e5(ADD R5,R0,R31,Rc7), PACKET:0x6b07(27399) SLOT:0 vs 3
[WARN]:[0803] INST WR/RD REG CONFLICT! PACKET 0x74cd: 0x4720204(POP R4,Rc7) vs 0x47a1be0(ADD R0,R6,R31,Rc7), PACKET:0x74cd(29901) SLOT:0 vs 3
[INFO]:========================================================================
[INFO]: STATIC CHECK END
[INFO]:========================================================================
[INFO]:AIPU START RUNNING: BIN[0]
[INFO]:TOTAL TIME: 11.129592s.
[INFO]:SIMULATOR EXIT!
[I] [main.cpp : 135] Simulator finished.
Total errors: 0, warnings: 0
六、仿真结果比对
改一下 quant_predict.py,并运行
'''
outputfile = current_dir + '/output_nasnet_mobile.bin'
npyoutput = np.fromfile(outputfile, dtype=np.int8)
...
python quant_predict.py
得到以下对比结果
附:配置文件
链接:https://pan.baidu.com/s/1pTaq...
提取码:rmzy