解压测试包 ++++++++++ .. code :: shell mkdir -p sophon/model-zoo tar -xvf path/to/model-zoo_.tar.bz2 --strip-components=1 -C sophon/model-zoo cd sophon/model-zoo 测试包的目录结构如下: .. code :: ├── 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`` 目录中: .. code :: shell cd path/to/sophon/model-zoo tar xvf path/to/ILSVRC2012_img_val.tar -C dataset/ILSVRC2012/ILSVRC2012_img_val COCO (可选) ----------- 如果精度测试用到了 coco 数据集(如yolo等用coco训练的网络),请按照如下步骤下载解压: .. code :: shell 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 服务: .. code :: shell # for ubuntu 操作系统 sudo apt install nfs-kernel-server # for centos 操作系统 sudo yum install nfs-utils 在 ``/etc/exports`` 中添加共享目录: .. code :: /path/to/sophon *(rw,sync,no_subtree_check,no_root_squash) ``*`` 表示所有人都可以访问该共享目录,也可以配置成特定网段或 IP 可访问,如 ``192.168.43.0/24`` 。 然后执行如下命令使配置生效: .. code :: shell sudo exportfs -a sudo systemctl restart nfs-kernel-server 另外,需要为 dataset 目录下的图片添加读取权限: .. code :: shell chmod -R +r path/to/sophon/model-zoo/dataset 安装客户端并挂载该共享目录: .. code :: shell mkdir sophon # for ubuntu 操作系统 sudo apt-get install -y nfs-common # for centos 操作系统 sudo yum install nfs-utils # 再执行以下操作 sudo mount -t nfs :/path/to/sophon ./sophon 这样便可以在远端测试环境访问测试目录。测试其余的操作与 x86 pcie 基本一致,请参考下文进行操作;运行环境命令执行位置的差别,已经在执行处添加说明。 准备运行环境 ++++++++++++ 安装运行 ``model-zoo`` 所需的依赖: .. code :: # 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 安装: .. code :: shell pip3 install setuptools wheel 编译依赖 protoc 请使用如下方法安装: .. code :: shell # for ubuntu 操作系统 sudo apt-get install -y protobuf-compiler # for centos 操作系统 sudo yum install protobuf-compiler 然后,获取 tpu_perf 源码并解压,然后执行编译。命令如下: .. code :: shell 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 时可以连接互联网或手动安装依赖包。 .. code :: shell cd .. pip3 install --upgrade python/dist/tpu_perf-X.Y.Z-py3-none-manylinux2014_.whl 请注意,如果在非 x86 环境编译 tpu_perf,请在非 x86 和工具链环境『host 系统』上分别下载编译一次,获得两个安装包分别供两个机器使用。 准备工具链编译环境 ++++++++++++++++++ 建议在 docker 环境使用工具链软件,最新版本的 docker 可以参考 `官方教程 `_ 进行安装。安装完成后,执行下面的脚本将当前用户加入 docker 组,获得 docker 执行权限。 .. code :: shell sudo usermod -aG docker $USER newgrp docker 下一步,从 docker hub 拉取 docker 镜像: .. code :: shell docker pull sophgo/tpuc_dev:v2.1 然后,在测试包目录解压工具链开发包。最新的工具链开发包可以从官网获得。 .. code :: shell cd path/to/sophon tar xvf tpu-nntc_vx.y.z--.tar.gz # 可选,将 tpu_perf 安装包拷贝到工作目录 cp path/to/tpu_perf-X.Y.Z-py3-none-manylinux2014_x86_64.whl ./ 接下来,启动 docker 容器,并将目录映射到 docker 中。 .. code :: shell docker run -td -v $(pwd):/workspace --name nntc sophgo/tpuc_dev:v2.1 bash 执行如下命令可以进入 docker 环境: .. code :: shell docker exec -it nntc bash 一个例子 ++++++++ 这里以 resnet50 网络为例,把性能与精度测试的流程完整地执行一遍,方便用户对测试流程有完整的了解。 首先,在『docker 工具链环境中』进行模型编译: .. code :: shell # Env setup cd /workspace/tpu-nntc_vx.y.z-- 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 环境: .. code :: shell exit 注:运行环境指SOC或带PCIE板卡的服务器并已安装好libsophon,以下皆同。 可以使用 ``bmrt_test`` 工具验证模型的推理时间 .. code :: shell cd path/to/sophon/model-zoo bmrt_test --bmodel output/resnet50/resnet50_batch1/compilation.bmodel --devid 10 ``--devid`` 用于在多设备id的测试环境下指定在某个id上测试。 该命令执行后将打印出模型的关键性能参数。 接下来运行精度测试程序在数据集上验证 bmodel 精度: .. code :: shell 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 工具链环境中』进行模型编译: .. code :: shell # Env setup cd /workspace/tpu-nntc_vx.y.z-- 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 环境: .. code :: shell exit 由于模型生成在 docker 中默认以 root 用户执行,所以需要首先将 output 目录所属人改成当前用户 .. code :: shell cd path/to/sophon/model-zoo sudo chown -R $(whoami):$(whoami) output 然后,安装并使用 tpu_perf 工具运行模型,生成性能数据: .. code :: shell pip3 install --upgrade path/to/tpu_perf-X.Y.Z-py3-none-manylinux2014_.whl python3 -m tpu_perf.run --target BM1684X --list default_cases.txt ``--target`` 用于指定芯片型号,目前支持 ``BM1684`` 和 ``BM1684X`` 。 性能数据在 ``output/stats.csv`` 中可以获得。 对于多设备id的测试环境,可以通过 ``--devices`` 参数指定在某个id上测试,如: .. code :: shell python3 -m tpu_perf.run --target BM1684X --list default_cases.txt --devices 0 具体参数说明可以通过以下命令获得: .. code :: shell python3 -m tpu_perf.run --help 精度验证 ++++++++ 首先,在『docker 工具链环境中』进行数据集准备和模型编译。 准备量化和测试 LMDB ------------------- 使用 ``auto_cali`` 进行模型量化时,可以选择使用图片集或 LMDB 数据集来对模型进行量化。事实上,如果指定了图片集, ``auto_cali`` 将根据预处理参数自动生成 LMDB 数据集,供量化使用;由于批量量化时往往有多个模型使用一样的图片集与预处理,这里我们使用 ``tpu_perf`` 工具先批量地生成 LMDB 数据集,然后调用 ``auto_cali`` 进行量化。 .. code :: shell # 安装 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 目录下的预处理实现。 脚本执行时间可能会比较长,请耐心等待。 模型量化和编译 -------------- .. code :: shell # Env setup cd /workspace/tpu-nntc_vx.y.z-- source scripts/envsetup.sh cd /workspace/model-zoo python3 -m tpu_perf.build --target BM1684X --list default_cases.txt ``--target`` 用于指定芯片型号,目前支持 ``BM1684`` 和 ``BM1684X`` 。 该命令会根据各个模型的配置对模型进行量化和编译。如果模型比较多,该脚本执行时间会比较长,请耐心等待。 精度实测需要在 docker 外面的运行环境中进行,先退出工具链 docker 环境: .. code :: shell exit 精度测试 -------- 由于数据集和模型生成在 docker 中默认以 root 用户执行,所以需要首先将生成目录所属人改成当前用户。 .. code :: shell # 安装 tpu_perf 工具 pip3 install --upgrade path/to/tpu_perf-X.Y.Z-py3-none-manylinux2014_.whl cd path/to/sophon/model-zoo sudo chown -R $(whoami):$(whoami) data sudo chown -R $(whoami):$(whoami) output 然后可以使用 tpu_perf 工具运行测试: .. code :: shell python3 -m tpu_perf.precision_benchmark --target BM1684X --list default_cases.txt ``--target`` 用于指定芯片型号,目前支持 ``BM1684`` 和 ``BM1684X`` 。 各类精度数据在 output 目录中的各个 csv 文件可以获得。 对于多设备id的测试环境,可以通过 ``--devices`` 参数指定在某个id上测试,如: .. code :: shell python3 -m tpu_perf.precision_benchmark --target BM1684X --list default_cases.txt --devices 0 具体参数说明可以通过以下命令获得: .. code :: shell python3 -m tpu_perf.precision_benchmark --help FAQ +++ 此章节列出一些tpu_perf安装、使用中可能会遇到的问题及解决办法。 invalid command 'bdist_wheel' ----------------------------- tpu_perf编译之后安装,如提示如下图错误,由于没有安装wheel工具导致。 .. image :: ../_static/invalid-bdist_wheel.png 则先运行: .. code :: shell pip3 install wheel 再安装whl包 not a supported wheel --------------------- tpu_perf编译之后安装,如提示如下图错误,由于pip版本导致。 .. image :: ../_static/not-support-wheel.png 则先运行: .. code :: shell pip3 install --upgrade pip 再安装whl包 no module named 'xxx' --------------------- 安装运行model-zoo所需的依赖时,如提示如下图错误,由于pip版本导致。 .. image :: ../_static/no-module-named-skbuild.png 则先运行: .. code :: shell pip3 install --upgrade pip 再安装运行 model-zoo 所需的依赖 精度测试因为内存不足被kill -------------------------- 对于YOLO系列的模型精度测试,可能需要4G左右的内存空间。SOC环境如果存在内存不足被kill的情况,可以参考SOPHON BSP 开发手册的板卡预制内存布局章节扩大内存。