2. TPU-MLIR开发环境

TPU-MLIR可以将不同框架下预训练的神经网络, 转化为可以在算能智能视觉深度学习处理器上高效运算的模型文件bmodel/cvimodel。

本章将讲解下:

  • 使用Docker中配置TPU-MLIR开发环境

  • 简单演示TPU-MLIR使用

2.1. 配置Docker开发环境

在Docker中创建TPU-MLIR开发环境,在Windows下安装Docker请参考下:https://docs.docker.com/desktop/install/windows-install/ ,其他系统参考下Docker文档, 相关软件包可以直接去配套的网盘资料获取。

安装Docker后,打开Windows命令行终端,拉取Docker镜像(其他系统命令操作也是相同):

PS C:\Users\zgwin> docker pull sophgo/tpuc_dev:latest
latest: Pulling from sophgo/tpuc_dev
a8b1c5f80c2d: Pull complete
194f8ed3b253: Pull complete
546069e8ade9: Pull complete
df05c5abde64: Pull complete
c39bd4f2eeb2: Pull complete
7e7a060e04aa: Pull complete
faa0ec95c1e9: Pull complete
5587510fb963: Pull complete
ccaabcb5f6c3: Pull complete
de0414d2f81e: Pull complete
73d00b0b1b31: Pull complete
34fd558aed7e: Pull complete
b1afaa053d9f: Pull complete
4f4fb700ef54: Pull complete
701bafffaf6c: Pull complete
c03b0f351f72: Pull complete
Digest: sha256:55a772b5d535054b6dac75957a4c8c4ec81199e4e94b8879a7131e5843861d09
Status: Downloaded newer image for sophgo/tpuc_dev:latest
docker.io/sophgo/tpuc_dev:latest

What's next:
    View a summary of image vulnerabilities and recommendations → docker scout quickview sophgo/tpuc_dev:latest

如果命令很慢或者失败,建议手动下载docker镜像,然后加载docker镜像:

wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/24/06/14/12/sophgo-tpuc_dev-v3.2_191a433358ad.tar.gz

docker load -i sophgo-tpuc_dev-v3.2_191a433358ad.tar.gz

创建容器,并运行:

# 创建一个名称为tpu_mlir,映射当前目录到容器/workspace目录
PS C:\Users\zgwin>  docker run --privileged --name tpu_mlir -v ${PWD}:/workspace -it sophgo/tpuc_dev:latest
root@cfa2f8976af9:/workspace#

创建tpu-mlir环境有多种方式,下面简单介绍几种。拉取tpu-mlir源码,编译安装tpu-mlir环境:

# 运行容器后,拉取tpu-mlir源码,构建工程
root@cfa2f8976af9:/workspace# git clone https://github.com/milkv-duo/tpu-mlir.git
root@cfa2f8976af9:/workspace# cd tpu-mlir
root@cfa2f8976af9:/workspace/tpu-mlir# source ./envsetup.sh
root@cfa2f8976af9:/workspace/tpu-mlir# ./build.sh

也可以直接使用pip安装预编译的tpu-mlir:

pip install tpu-mlir

或者使用板卡网盘配套资料中的tpu-mlir文件:

# 解压文件并切换到目录下
tar xvf tpu-mlir.gz
cd tpu-mlir
# 执行命令,设置环境变量即可
source envsetup.sh

提示

重新启动docker环境后,需要source tpu-mlir/envsetup.sh。

2.2. TPU-MLIR使用

下面将以yolov5模型为例,使用TPU-MLIR模型转换功能将onnx模型转换成cvimodel模型文件,包括转换成BF16格式的模型文件和INT8对称格式的模型文件。

提示

LubanCat-P1板卡基于SG2000,支持ONNX系列和Caffe模型,目前不支持TFLite模型,在量化数据类型方面,支持BF16式的量化和INT8格式的非对称量化

在Docker环境中创建测试目录,拉取源码:

# 获取tpu-mlir源码
root@cfa2f8976af9:/workspace# git clone https://github.com/milkv-duo/tpu-mlir.git

# 创建一个yolov5测试目录,复制tpu-mlir/regression目录下图像和yolov5模型文件
root@cfa2f8976af9:/workspace# mkdir yolov5 && cd yolov5
root@cfa2f8976af9:/workspace/yolov5# cp -r ../tpu-mlir/regression/dataset/COCO2017  ./
root@cfa2f8976af9:/workspace/yolov5# cp ../tpu-mlir/regression/image/dog.jpg ./
root@cfa2f8976af9:/workspace/yolov5# cp  ../tpu-mlir/regression/model/yolov5s.onnx ./

# 以上模型和图像文件也可以从配套例程获取

2.2.1. ONNX转MLIR

模型转换使用工具model_transform(model_transform.py),需要设置相关参数。

模型转换命令如下:

# 模型转换命令,参数model_def指定模型定义文件,input_shapes指定输入形状,mean和scale指定归一化参数,
# keep_aspect_ratio指定是否保持宽高比,pixel_format指定输入图像格式,output_names指定输出名称,
# test_input指定验证的图像,test_result指定验证的结果文件,mlir指定输出mlir模型文件名称和路径。
root@cfa2f8976af9:/workspace/yolov5# model_transform \
                                    --model_name yolov5s \
                                    --model_def ../yolov5s.onnx \
                                    --input_shapes [[1,3,640,640]] \
                                    --mean 0.0,0.0,0.0 \
                                    --scale 0.0039216,0.0039216,0.0039216 \
                                    --keep_aspect_ratio \
                                    --pixel_format rgb \
                                    --output_names 326,474,622 \
                                    --test_input ./dog.jpg \
                                    --test_result yolov5s_top_outputs.npz \
                                    --mlir yolov5s.mlir

# 输出省略............................
min_similiarity = (0.9999997615814209, 0.9999981357100098, 113.57913970947266)
Target    yolov5s_top_outputs.npz
Reference yolov5s_ref_outputs.npz
npz compare PASSED.
compare 622_Conv: 100%|████████████████████████████████████████████████████████████████████████████████████████| 142/142 [00:08<00:00, 16.30it/s]
[Success]: npz_tool.py compare yolov5s_top_outputs.npz yolov5s_ref_outputs.npz --tolerance 0.99,0.99 --except - -vv
root@cfa2f8976af9:/workspace/tpu/yolov5#

# 输出yolov5s.mlir、yolov5s_in_f32.npz、yolov5s_top_outputs.npz文件保存在当前目录下

yolov5模型需要对图像进行预处理,进行归一化操作(rgb值乘以1/255),需要设置–mean和–scale参数。 model_transform执行预处理过程用公式是(X代表输入):y = (X − mean) × scale, 因此参数mean和scale分别设置为 0.0,0.0,0.0 和 0.0039216,0.0039216,0.0039216 。

关于model_transform(model_transform.py)相关参数详情请参考 TPU SDK 开发资料 中的TPU-MLIR开发手册。

2.2.2. MLIR转BF16模型

使用model_deploy(model_deploy.py)工具,将MLIR转成BF16 cvimodel模型,具体转换命令如下:

# 参数mlir指定前面生成的mlir模型文件名称和路径,
# quantize指定量化类型,processor指定目标处理器,test_input指定验证的图像,test_reference前面输出的验证结果文件,model指定输出的cvimodel模型文件名称和路径。
root@cfa2f8976af9:/workspace/tpu/yolov5# model_deploy \
                                        --mlir yolov5s.mlir \
                                        --quantize BF16 \
                                        --processor cv181x \
                                        --test_input yolov5s_in_f32.npz \
                                        --test_reference yolov5s_top_outputs.npz \
                                        --model yolov5s_cv181x_bf16.cvimodel
# 省略.........................................................
[Running]: npz_tool.py compare yolov5s_cv181x_bf16_model_outputs.npz yolov5s_cv181x_bf16_tpu_outputs.npz --tolerance 0.99,0.90 --except - -vv
compare 622_Conv_f32:  67%|██████████████████████████████████████████████████████████     | 2/3 [00:00<00:00, 520.00it/s][326_Conv_f32
    (1, 255, 80, 80) float32
    cosine_similarity      = 0.999995
    euclidean_similarity   = 0.997028
    sqnr_similarity        = 41.396189
[474_Conv_f32                    ]      SIMILAR [PASSED]
    (1, 255, 40, 40) float32
    cosine_similarity      = 0.999996
    euclidean_similarity   = 0.997209
    sqnr_similarity        = 41.273770
[622_Conv_f32                    ]      SIMILAR [PASSED]
    (1, 255, 20, 20) float32
    cosine_similarity      = 0.999997
    euclidean_similarity   = 0.997520
    sqnr_similarity        = 42.229862
3 compared
3 passed
0 equal, 0 close, 3 similar
0 failed
0 not equal, 0 not similar
min_similiarity = (0.9999954700469971, 0.9970281996451034, 41.273770332336426)
Target    yolov5s_cv181x_bf16_model_outputs.npz
Reference yolov5s_cv181x_bf16_tpu_outputs.npz
npz compare PASSED.
compare 622_Conv_f32: 100%|████████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:00<00:00,  9.46it/s]
[Success]: npz_tool.py compare yolov5s_cv181x_bf16_model_outputs.npz yolov5s_cv181x_bf16_tpu_outputs.npz --tolerance 0.99,0.90 --except - -vv

# 输出结果yolov5s_cv181x_bf16.cvimodel文件保存在当前目录下

提示

使用LubanCat-P1板卡processor参数设置为 --processor cv181x 或者设置chip参数为 --chip cv181x

2.2.3. MLIR转INT8模型

转换成INT8模型,经过量化,需要使用run_calibration(run_calibration.py)工具得到校准表,需要使用前面复制的100张来自COCO2017的图片, 再通过model_deploy(model_deploy.py)工具指定用校准表, 生成INT8对称cvimodel模型。

# run_calibration的参数
root@cfa2f8976af9:/workspace/tpu/yolov5# run_calibration yolov5s.mlir  \
            --dataset ./COCO2017 --input_num 100 -o yolov5s_cali_table

# 运行完成后输出yolov5s_cali_table, 该文件用于后续编译INT8模型的输入文件

将模型转成INT8对称量化cvimode模型, 执行下面命令:

# 参数mlir指定前面生成的mlir模型文件名称和路径,quantize指定量化类型,calibration_table指定校准表路径,
# --chip指定目标处理器,LubanCat-P1板卡需要设置为“--chip cv181x”, tolerance表示MLIR量化后的结果与MLIR推理结果相似度的误差容忍度
# test_input指定验证的图像,test_reference前面输出的验证结果文件,model指定输出的cvimodel模型文件名称和路径
root@cfa2f8976af9:/workspace/tpu/yolov5# model_deploy \
                                        --mlir yolov5s.mlir \
                                        --quantize INT8 \
                                        --calibration_table ./yolov5s_cali_table \
                                        --chip cv181x \
                                        --test_input ./dog.jpg \
                                        --test_reference yolov5s_top_outputs.npz \
                                        --tolerance 0.85,0.45 \
                                        --model yolov5n_int8_sym.cvimodel
# 省略......................................
Cmodel: bm_load_cmdbuf
Max SharedMem size:5734400
Cmodel: bm_run_cmdbuf
device[0] closed
[Running]: npz_tool.py compare yolov5s_cv181x_int8_sym_model_outputs.npz yolov5s_cv181x_int8_sym_tpu_outputs.npz --tolerance 0.99,0.90 --except - -vv
compare 622_Conv_f32:  67%|██████████████████████████████████████████████████████████
    (1, 255, 80, 80) float32
[474_Conv_f32                    ]        EQUAL [PASSED]
    (1, 255, 40, 40) float32
[622_Conv_f32                    ]        EQUAL [PASSED]
    (1, 255, 20, 20) float32
3 compared
3 passed
3 equal, 0 close, 0 similar
0 failed
0 not equal, 0 not similar
min_similiarity = (1.0, 1.0, inf)
Target    yolov5s_cv181x_int8_sym_model_outputs.npz
Reference yolov5s_cv181x_int8_sym_tpu_outputs.npz
npz compare PASSED.
compare 622_Conv_f32: 100%|████████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:00<00:00, 14.37it/s]
[Success]: npz_tool.py compare yolov5s_cv181x_int8_sym_model_outputs.npz yolov5s_cv181x_int8_sym_tpu_outputs.npz --tolerance 0.99,0.90 --except - -vv

# 运行完成后输出yolov5n_int8_sym.cvimodel文件,该文件用于后续在LubanCat-P1板卡上部署运行。

2.2.4. 模型效果测试

原始模型yolov5s.onnx和前面转换出的yolov5s.mlir、yolov5s_cv181x_bf16.cvimodel、yolov5n_int8_sym.cvimodel模型文件, 可以使用TPU-MliR的detect_yolov5(detect_yolov5.py)工具测试模型效果。

具体命令如下(下面测试onnx和INT8对称量化模型效果,其他模型测试类似):

# model参数指定模型路径,通过后缀区分模型;onnx模型的执行方式如下, 得到结果dog_onnx.jpg :
root@cfa2f8976af9:/workspace/tpu/yolov5# detect_yolov5 \
                                        --input ./dog.jpg \
                                        --model ./yolov5s.onnx \
                                        --output dog_onnx.jpg
# 省略.....

# yolov5n_int8_sym对称量化模型模拟测试, 得到结果dog_int8_sym.jpg:
root@cfa2f8976af9:/workspace/tpu/yolov5# detect_yolov5 \
                                        --input ./dog.jpg \
                                        --model ./yolov5s.onnx \
                                        --output dog_onnx.jpg
setenv:cv181x
Start TPU Simulator for cv181x
device[0] opened, 4294967296
version: 1.4.0
yolov5s Build at 2024-07-03 10:10:01 For platform cv181x
Cmodel: bm_load_cmdbuf
Max SharedMem size:5734400
Cmodel: bm_run_cmdbuf
device[0] closed

可以查看目录yolov5下生成的结果图片,对比onnx模型和INT8对称量化模型(仿真器运行推理)的结果图片,查看效果。 更多detect_yolov5工具详情请参考 TPU SDK 开发资料 中的TPU-MLIR开发手册。