解压测试包

mkdir -p sophon/model-zoo
tar -xvf path/to/model-zoo_<date>.tar.bz2 --strip-components=1 -C sophon/model-zoo
cd sophon/model-zoo

测试包的目录结构如下:

├── config.yaml
├── requirements.txt
├── data
├── dataset
├── harness
├── output
└── ...
  • config.yaml 中包含通用的配置:数据集的目录、模型的根目录等,以及一些复用的参数和命令

  • requirements.txt 为 model-zoo 的 python 依赖

  • dataset 目录中包含模型的 imagenet 数据集预处理,将作为 plugin 被 tpu_perf 调用

  • data 目录将用于存放 lmdb 数据集

  • output 目录将用于存放编译输出的 bmodel 和一些中间数据

  • 其他目录包含各个模型的信息和配置。每个模型对应的目录都有一个 config.yaml 文件,该配置文件中配置了模型的名称、路径和 FLOPs、数据集制作参数,以及模型的量化编译命令。

准备数据集

ImageNet

下载 imagenet 2012 数据集

ILSVRC2012_img_val.tar(MD5 29b22e2961454d5413ddabcf34fc5622)。

将 ILSVRC2012_img_val.tar 解压到 dataset/ILSVRC2012/ILSVRC2012_img_val 目录中:

cd path/to/sophon/model-zoo
tar xvf path/to/ILSVRC2012_img_val.tar -C dataset/ILSVRC2012/ILSVRC2012_img_val

COCO (可选)

如果精度测试用到了 coco 数据集(如yolo等用coco训练的网络),请按照如下步骤下载解压:

cd path/to/sophon/model-zoo/dataset/COCO2017/
wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip
wget http://images.cocodataset.org/zips/val2017.zip
unzip annotations_trainval2017.zip
unzip val2017.zip

在非 x86 环境运行性能与精度测试

性能与精度测试只依赖于 libsophon 运行环境,所以在工具链编译环境编译完的模型可以连同 model-zoo 整个打包,在非 x86 环境(soc、arm服务器)中使用 tpu_perf 进行性能与精度测试。这里介绍一种通过 linux nfs 远程文件系统挂载来实现在工具链环境编译模型,在远端设备上测试的方法,可以免去数据拷贝。

首先,在工具链环境服务器『host 系统』安装 nfs 服务:

# for ubuntu 操作系统
sudo apt install nfs-kernel-server
# for centos 操作系统
sudo yum install nfs-utils

/etc/exports 中添加共享目录:

/path/to/sophon *(rw,sync,no_subtree_check,no_root_squash)

* 表示所有人都可以访问该共享目录,也可以配置成特定网段或 IP 可访问,如 192.168.43.0/24

然后执行如下命令使配置生效:

sudo exportfs -a
sudo systemctl restart nfs-kernel-server

另外,需要为 dataset 目录下的图片添加读取权限:

chmod -R +r path/to/sophon/model-zoo/dataset

安装客户端并挂载该共享目录:

mkdir sophon
# for ubuntu 操作系统
sudo apt-get install -y nfs-common
# for centos 操作系统
sudo yum install nfs-utils
# 再执行以下操作
sudo mount -t nfs <IP>:/path/to/sophon ./sophon

这样便可以在远端测试环境访问测试目录。测试其余的操作与 x86 pcie 基本一致,请参考下文进行操作;运行环境命令执行位置的差别,已经在执行处添加说明。

准备运行环境

安装运行 model-zoo 所需的依赖:

# for ubuntu 操作系统
sudo apt-get install build-essential
sudo apt install python3-dev
sudo apt-get install -y libgl1 # For OpenCV
# for centos 操作系统
sudo yum install make automake gcc gcc-c++ kernel-devel
sudo yum install python-devel
sudo yum install mesa-libGL
# 再执行以下操作
cd path/to/sophon/model-zoo
pip3 install -r requirements.txt

另外,运行环境中调用 tpu 硬件进行性能和精度测试,请根据 libsophon 使用手册安装 libsophon。

安装 tpu_perf 工具

使用 tpu_perf 工具,可以方便地验证模型性能和精度,实现多模型、多种 batch size 批量测试验证。可以从 这里 获取对应架构最新版本的 tpu_perf release,也可以从源码编译,以下是源码编译步骤。

请在部署环境进行 tpu_perf 源码编译。编译依赖 libsophon-dev,请参考 libsophon 使用手册进行安装。

编译依赖 python 打包工具,请使用 pip 安装:

pip3 install setuptools wheel

编译依赖 protoc 请使用如下方法安装:

# for ubuntu 操作系统
sudo apt-get install -y protobuf-compiler
# for centos 操作系统
sudo yum install protobuf-compiler

然后,获取 tpu_perf 源码并解压,然后执行编译。命令如下:

mkdir tpu_perf
tar xvf path/to/tpu-perf-X.Y.Z.tar.gz --strip-components=1 -C tpu_perf

# 如果已经存在tpu_perf/build目录,建议先删除
# rm -r tpu_perf/build

# 执行编译
mkdir -p tpu_perf/build
cd tpu_perf/build
cmake ..
make install/strip -j4

编译成功后将在 tpu_perf/python/dist 下生成 whl 包。

tpu_perf 运行时还依赖于 numpy , lmdb , protobuf==3.19.* , psutil , pyyaml ,请确保安装 whl 时可以连接互联网或手动安装依赖包。

cd ..
pip3 install --upgrade python/dist/tpu_perf-X.Y.Z-py3-none-manylinux2014_<arch>.whl

请注意,如果在非 x86 环境编译 tpu_perf,请在非 x86 和工具链环境『host 系统』上分别下载编译一次,获得两个安装包分别供两个机器使用。

准备工具链编译环境

建议在 docker 环境使用工具链软件,最新版本的 docker 可以参考 官方教程 进行安装。安装完成后,执行下面的脚本将当前用户加入 docker 组,获得 docker 执行权限。

sudo usermod -aG docker $USER
newgrp docker

下一步,从 docker hub 拉取 docker 镜像:

docker pull sophgo/tpuc_dev:v2.1

然后,在测试包目录解压工具链开发包。最新的工具链开发包可以从官网获得。

cd path/to/sophon
tar xvf tpu-nntc_vx.y.z-<hash>-<date>.tar.gz

# 可选,将 tpu_perf 安装包拷贝到工作目录
cp path/to/tpu_perf-X.Y.Z-py3-none-manylinux2014_x86_64.whl ./

接下来,启动 docker 容器,并将目录映射到 docker 中。

docker run -td -v $(pwd):/workspace --name nntc sophgo/tpuc_dev:v2.1 bash

执行如下命令可以进入 docker 环境:

docker exec -it nntc bash

一个例子

这里以 resnet50 网络为例,把性能与精度测试的流程完整地执行一遍,方便用户对测试流程有完整的了解。

首先,在『docker 工具链环境中』进行模型编译:

# Env setup
cd /workspace/tpu-nntc_vx.y.z-<hash>-<date>
source scripts/envsetup.sh

# 准备工作目录
cd /workspace/model-zoo
mkdir -p output/resnet50
cp vision/classification/ResNet50-Caffe/ResNet-50-* output/resnet50
cd output/resnet50

python3 -m ufw.cali.cali_model \
    --model ./ResNet-50-deploy.prototxt \
    --weights ./ResNet-50-model.caffemodel \
    --cali_image_path /workspace/model-zoo/dataset/ILSVRC2012/caliset \
    --test_iterations 10 \
    --net_name resnet50 \
    --postprocess_and_calc_score_class none \
    --target BM1684X \
    --cali_iterations 100 \
    --cali_image_preprocess='
        resize_side=256;
        crop_w=224,crop_h=224;
        mean_value=103.94:116.78:123.68,scale=1' \
    --input_shapes=[1,3,224,224]

--target 用于指定芯片型号,目前支持 BM1684BM1684X

该命令使用 auto_cali 量化工具将模型量化为 int8 模型。需要用到量化数据集,并指定预处理参数。

接下来,我们将在运行环境中进行模型的性能测试与精度验证。先退出工具链 docker 环境:

exit

注:运行环境指SOC或带PCIE板卡的服务器并已安装好libsophon,以下皆同。

可以使用 bmrt_test 工具验证模型的推理时间

cd path/to/sophon/model-zoo
bmrt_test --bmodel output/resnet50/resnet50_batch1/compilation.bmodel --devid 10

--devid 用于在多设备id的测试环境下指定在某个id上测试。

该命令执行后将打印出模型的关键性能参数。

接下来运行精度测试程序在数据集上验证 bmodel 精度:

python3 harness/topk.py \
    --mean 103.94,116.78,123.68 --scale 1 --size 224 \
    --bmodel output/resnet50/resnet50_batch1/compilation.bmodel \
    --image_path ./dataset/ILSVRC2012/ILSVRC2012_img_val \
    --list_file ./dataset/ILSVRC2012/caffe_val.txt
    --devices 10

--devices 用于在多设备id的测试环境下指定在某个id上测试。

程序最后一行会输出 bmodel 实测的 top1 和 top5 精度。

以下两章介绍如何使用 tpu_perf 验证性能与精度,由于模型较多,命令的执行时间普遍比较长,如果是通过 ssh 会话操作,建议将命令放在 screen/tmux 这类终端管理器中执行,以免会话结束造成任务中止。

性能测试

首先,在『docker 工具链环境中』进行模型编译:

# Env setup
cd /workspace/tpu-nntc_vx.y.z-<hash>-<date>
source scripts/envsetup.sh

# 安装 tpu_perf 工具
pip3 install --upgrade path/to/tpu_perf-X.Y.Z-py3-none-manylinux2014_x86_64.whl

cd /workspace/model-zoo
python3 -m tpu_perf.build --target BM1684X --list default_cases.txt  --time

--target 用于指定芯片型号,目前支持 BM1684BM1684X

tpu_perf 所有的命令都可以指定运行的 case 列表文件,这里使用 default_cases.txt 。可以通过指定 full_cases.txt 运行完整的 case 列表(时间可能比较长),或自定义列表文件。如果不指定列表, tpu_perf 会遍历当前目录寻找 config.yaml 文件,一一执行。

运行测试需要在 docker 外面的运行环境中进行,先退出工具链 docker 环境:

exit

由于模型生成在 docker 中默认以 root 用户执行,所以需要首先将 output 目录所属人改成当前用户

cd path/to/sophon/model-zoo
sudo chown -R $(whoami):$(whoami) output

然后,安装并使用 tpu_perf 工具运行模型,生成性能数据:

pip3 install --upgrade path/to/tpu_perf-X.Y.Z-py3-none-manylinux2014_<arch>.whl
python3 -m tpu_perf.run --target BM1684X --list default_cases.txt

--target 用于指定芯片型号,目前支持 BM1684BM1684X

性能数据在 output/stats.csv 中可以获得。

对于多设备id的测试环境,可以通过 --devices 参数指定在某个id上测试,如:

python3 -m tpu_perf.run --target BM1684X --list default_cases.txt --devices 0

具体参数说明可以通过以下命令获得:

python3 -m tpu_perf.run --help

精度验证

首先,在『docker 工具链环境中』进行数据集准备和模型编译。

准备量化和测试 LMDB

使用 auto_cali 进行模型量化时,可以选择使用图片集或 LMDB 数据集来对模型进行量化。事实上,如果指定了图片集, auto_cali 将根据预处理参数自动生成 LMDB 数据集,供量化使用;由于批量量化时往往有多个模型使用一样的图片集与预处理,这里我们使用 tpu_perf 工具先批量地生成 LMDB 数据集,然后调用 auto_cali 进行量化。

# 安装 tpu_perf 工具
cd /workspace/tpu_perf
pip3 install --upgrade path/to/tpu_perf-X.Y.Z-py3-none-manylinux2014_x86_64.whl

cd /workspace/model-zoo
python3 -m tpu_perf.make_lmdb --target BM1684X --list default_cases.txt

执行该命令会根据各个模型的配置生成量化和测试的预处理后 lmdb 数据集。

--target 用于指定芯片型号,目前支持 BM1684BM1684X

tpu_perf 所有的命令都可以指定运行的 case 列表文件,这里使用 default_cases.txt 。可以通过指定 full_cases.txt 运行完整的 case 列表(时间可能比较长),或自定义列表文件。如果不指定列表, tpu_perf 会遍历当前目录寻找 config.yaml 文件,一一执行。

工具配置默认使用 200 张的图片集进行量化,如果想要选用其他的图片集可以将图片放到 dataset/ILSVRC2012/caliset 目录,并通过 config.yaml 中的 cali_set 字段指定量化集数量。具体可以查看 dataset 目录下的预处理实现。

脚本执行时间可能会比较长,请耐心等待。

模型量化和编译

# Env setup
cd /workspace/tpu-nntc_vx.y.z-<hash>-<date>
source scripts/envsetup.sh

cd /workspace/model-zoo
python3 -m tpu_perf.build --target BM1684X --list default_cases.txt

--target 用于指定芯片型号,目前支持 BM1684BM1684X

该命令会根据各个模型的配置对模型进行量化和编译。如果模型比较多,该脚本执行时间会比较长,请耐心等待。

精度实测需要在 docker 外面的运行环境中进行,先退出工具链 docker 环境:

exit

精度测试

由于数据集和模型生成在 docker 中默认以 root 用户执行,所以需要首先将生成目录所属人改成当前用户。

# 安装 tpu_perf 工具
pip3 install --upgrade path/to/tpu_perf-X.Y.Z-py3-none-manylinux2014_<arch>.whl

cd path/to/sophon/model-zoo
sudo chown -R $(whoami):$(whoami) data
sudo chown -R $(whoami):$(whoami) output

然后可以使用 tpu_perf 工具运行测试:

python3 -m tpu_perf.precision_benchmark --target BM1684X --list default_cases.txt

--target 用于指定芯片型号,目前支持 BM1684BM1684X

各类精度数据在 output 目录中的各个 csv 文件可以获得。

对于多设备id的测试环境,可以通过 --devices 参数指定在某个id上测试,如:

python3 -m tpu_perf.precision_benchmark --target BM1684X --list default_cases.txt --devices 0

具体参数说明可以通过以下命令获得:

python3 -m tpu_perf.precision_benchmark --help

FAQ

此章节列出一些tpu_perf安装、使用中可能会遇到的问题及解决办法。

invalid command ‘bdist_wheel’

tpu_perf编译之后安装,如提示如下图错误,由于没有安装wheel工具导致。

../_images/invalid-bdist_wheel.png

则先运行:

pip3 install wheel

再安装whl包

not a supported wheel

tpu_perf编译之后安装,如提示如下图错误,由于pip版本导致。

../_images/not-support-wheel.png

则先运行:

pip3 install --upgrade pip

再安装whl包

no module named ‘xxx’

安装运行model-zoo所需的依赖时,如提示如下图错误,由于pip版本导致。

../_images/no-module-named-skbuild.png

则先运行:

pip3 install --upgrade pip

再安装运行 model-zoo 所需的依赖

精度测试因为内存不足被kill

对于YOLO系列的模型精度测试,可能需要4G左右的内存空间。SOC环境如果存在内存不足被kill的情况,可以参考SOPHON BSP 开发手册的板卡预制内存布局章节扩大内存。