解压测试包
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
用于指定芯片型号,目前支持 BM1684
和 BM1684X
。
该命令使用 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
用于指定芯片型号,目前支持 BM1684
和 BM1684X
。
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
用于指定芯片型号,目前支持 BM1684
和 BM1684X
。
性能数据在 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
用于指定芯片型号,目前支持 BM1684
和 BM1684X
。
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
用于指定芯片型号,目前支持 BM1684
和 BM1684X
。
该命令会根据各个模型的配置对模型进行量化和编译。如果模型比较多,该脚本执行时间会比较长,请耐心等待。
精度实测需要在 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
用于指定芯片型号,目前支持 BM1684
和 BM1684X
。
各类精度数据在 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工具导致。
则先运行:
pip3 install wheel
再安装whl包
not a supported wheel
tpu_perf编译之后安装,如提示如下图错误,由于pip版本导致。
则先运行:
pip3 install --upgrade pip
再安装whl包
no module named ‘xxx’
安装运行model-zoo所需的依赖时,如提示如下图错误,由于pip版本导致。
则先运行:
pip3 install --upgrade pip
再安装运行 model-zoo 所需的依赖
精度测试因为内存不足被kill
对于YOLO系列的模型精度测试,可能需要4G左右的内存空间。SOC环境如果存在内存不足被kill的情况,可以参考SOPHON BSP 开发手册的板卡预制内存布局章节扩大内存。