Qualcomm TensorFlow Lite SDK 工具快速入门指南(3)
4.5 使用 Linux 工作站生成 TFLite SDK
使用 Linux 工作站无需容器即可启用 TFLite SDK 工作流程。此过程是使用容器的替代方法。
要同步和构建 Qualcomm TFLite SDK,请执行以下操作:
-
在主机文件系统上创建一个目录以同步 Qualcomm TFLite SDK 工作区。例如:
$mkdir <tflite-sdk-workspace> $cd <tflite-sdk-workspace>
-
从 CodeLinaro 获取 Qualcomm TFLite SDK 源代码:
$ repo init -u https://git.codelinaro.org/clo/le/sdktflite/tflite/manifest.git --repo-branch=qc/stable --repo-url=git://git.quicinc.com/tools/repo.git -m TFLITE.SDK.1.0.r1-00200-TFLITE.0.xml -b release && repo sync -qc --no-tags -j8 && repo sync -qc --no-tags -j8
-
使用以下条目编辑/tflite-tools/targets/le-tflite-tools-builder.json中存在的 JSON 配置文件 :
{ "Image": "tflite-tools-builder", "Device_OS": "le", "Additional_tag": "", "TFLite_Version": "2.11.1", "Delegates": { "Hexagon_delegate": "OFF", "Gpu_delegate": "ON", "Xnnpack_delegate": "ON" }, "TFLite_rsync_destination": "<not applicable>", "SDK_path": "<path-to-workspace>/build-qti-distro-fullstack-perf/tmp- glibc/deploy/sdk>", "SDK_shell_file": "<sdk-shell-filename not containing *-ext-*>", "Base_Dir_Location": "<Absolute path to TfLiteSDK sync directory>" }
有关 json 配置文件中提到的条目的更多信息,请参阅位于/tflite-tools/的Docker.md自述文件 。
笔记
对于 QCS8550,不支持 Hexagon DSP delegate。
-
获取脚本以设置环境:
$ cd <tflite-sdk-workspace>/tflite-tools $ source ./scripts/host/host_env_setup.sh
-
构建 Qualcomm TFLite SDK。
$ tflite-tools-setup targets/le-tflite-tools-builder.json
-
在同一 Linux shell 中运行以下实用程序命令,以从TFLite_rsync_destination收集 TFLite SDK 工件。
$ tflite-tools-host-get-rel-package targets/le-tflite-tools-builder.json $ tflite-tools-host-get-dev-package targets/le-tflite-tools-builder.json
-
根据操作系统安装工件。
-
对于 Windows 平台,在 PowerShell 上,使用以下脚本:
PS C:> adb root PS C:> adb disable-verity PS C:> adb reboot PS C:> adb wait-for-device PS C:> adb root PS C:> adb remount PS C:> adb shell mount -o remount,rw / PS C:> adb shell “mkdir -p /tmp” PS C:> adb push <tflite package> /tmp
如果包是 ipk(对于 QCS8550.LE.1.0),请使用以下命令:
PS C:> adb shell “opkg --force-depends --force-reinstall --force-overwrite install /tmp/<tflite package>”
-
对于Linux平台,使用以下脚本:
$ adb root $ adb disable-verity $ adb reboot $ adb wait-for-device $ adb root $ adb remount $ adb shell mount -o remount,rw / $ adb shell “mkdir -p /tmp” $ adb push <tflite package> /tmp
如果包是 ipk(对于 QCS8550.LE.1.0):
$ adb shell “opkg --force-depends --force-reinstall --force-overwrite install /tmp/<tflite package>”
-
4.6 生成用于 QIM SDK 构建的 Qualcomm TFLite SDK 工件
要使用生成的工件在 QIM SDK 中启用 Qualcomm TFLite SDK GStreamer 插件,请执行以下操作:
-
完成Sync and build Qualcomm TFLite SDK中的过程,然后运行以下命令:
$ tflite-tools-host-get-dev-tar-package ./targets/le-tflite-tools- builder.json
生成一个 tar 文件。它包含 Qualcomm TFLite SDK,位于“TFLite_rsync_destination”提供的路径中
-
要启用 Qualcomm TFLite SDK GStreamer 插件,请使用 tar 文件作为 QIM SDK 构建的 JSON 配置文件中的参数。
有关编译 QIM SDK 的信息,请参阅Qualcomm 智能多媒体 SDK (QIM SDK) 快速入门指南(80-50450-51)。
5. 增量构建 Qualcomm TFLite SDK
如果您是首次构建 Qualcomm TFLite SDK,请参阅构建 Qualcomm TFLite SDK 工具 - 开发人员工作流程。相同的构建环境可以重复用于增量开发。
开发人员可以使用图中提到的帮助程序实用程序(在容器内)来编译修改后的应用程序和插件。
代码修改完成后,在代码目录下执行以下操作:
-
编译修改后的代码:
$ tflite-tools-incremental-build-install
-
打包编译代码:
$ tflite-tools-ipk-rel-pkg
或者
$ tflite-tools-deb-rel-pkg
-
将发布包与主机文件系统同步:
$ tflite-tools-remote-sync-ipk-rel-pkg
或者
$ tflite-tools-remote-sync-deb-rel-pkg
-
准备开发包:
$ tflite-tools-ipk-dev-pkg
编译后的工件位于 JSON 文件中提到的TFLite_rsync_destination文件夹中,可以将其复制到任何目录。
6. 与 QNN 外部 TFLite Delegate 配合使用
TFLite 外部委托允许您使用可信第三方(例如 Qualcomm 的 QNN)提供的库在另一个执行器上运行模型(部分或全部)。该机制可以利用各种设备上的加速器,例如 GPU 或六角形张量处理器 (HTP) 进行推理。这为开发人员提供了一种与默认 TFLite 分离的灵活方法,以加快推理速度。
- 确保使用 Ubuntu 工作站来提取 QNN AI 堆栈。
- 确保您使用 QNN 版本 2.14 与 Qualcomm TFLite SDK 结合使用
Qualcomm TFLite SDK 能够通过 TFLite QNN 外部委托在多个 QNN 后端上运行推理。具有通用表示的 TFLite 模型 flatbuffer可以在 GPU 和 HTP 上运行。
在设备上安装 Qualcomm TFLite SDK 包后,请执行以下操作以在设备上安装 QNN 库。
-
下载适用于 Ubuntu 的 Qualcomm Package Manager 3。
a. 单击https://qpm.qualcomm.com/,然后单击工具。
b. 在左窗格的“搜索工具”字段中,输入QPM。从系统操作系统列表中,选择Linux。
搜索结果显示 Qualcomm 包管理器列表。
c. 选择 Qualcomm Package Manager 3 并下载 Linux debian 软件包。 -
安装适用于 Linux 的 Qualcomm Package Manager 3。使用以下命令:
$ dpkg -i --force-overwrite /path/to/QualcommPackageManager3.3.0.83.1.Linux-x86.deb
-
在 Ubuntu 工作站上下载 Qualcomm ® AI Engine Direct SDK。
单击https://qpm.qualcomm.com/,然后单击工具。
在左窗格的“搜索工具”字段中,输入AI stack。从系统操作系统列表中,选择Linux。
将显示包含各种 AI 堆栈引擎的下拉列表。
单击Qualcomm® AI Engine Direct SDK并下载Linux v2.14.0包。 -
在 Ubuntu 工作站上安装 Qualcomm® AI Engine Direct SDK。
a. 激活许可证:qpm-cli --license-activate qualcomm_ai_engine_direct
b. 安装AI Engine Direct SDK:
$ qpm-cli --extract /path/to/qualcomm_ai_engine_direct.2.14.0.230828.Linux-AnyCPU.qik
-
使用 .push 将库从 Ubuntu 工作站推送到设备adb push。
$ cd /opt/qcom/aistack/qnn/2.14.0.230828 $ adb push ./lib/aarch64-oe-linux-gcc11.2/libQnnDsp.so /usr/lib/ $ adb push ./lib/aarch64-oe-linux-gcc11.2/libQnnDspV66Stub.so /usr/lib/ $ adb push ./lib/aarch64-oe-linux-gcc11.2/libQnnGpu.so /usr/lib/ $ adb push ./lib/aarch64-oe-linux-gcc11.2/libQnnHtpPrepare.so /usr/lib/ $ adb push ./lib/aarch64-oe-linux-gcc11.2/libQnnHtp.so /usr/lib/ $ adb push ./lib/aarch64-oe-linux-gcc11.2/libQnnHtpV68Stub.so /usr/lib/ $ adb push ./lib/aarch64-oe-linux-gcc11.2/libQnnSaver.so /usr/lib/ $ adb push ./lib/aarch64-oe-linux-gcc11.2/libQnnSystem.so /usr/lib/ $ adb push ./lib/aarch64-oe-linux-gcc11.2/libQnnTFLiteDelegate.so /usr/lib/ $ adb push ./lib/hexagon-v65/unsigned/libQnnDspV65Skel.so /usr/lib/rfsa/adsp $ adb push ./lib/hexagon-v66/unsigned/libQnnDspV66Skel.so /usr/lib/rfsa/adsp $ adb push ./lib/hexagon-v68/unsigned/libQnnHtpV68Skel.so /usr/lib/rfsa/adsp $ adb push ./lib/hexagon-v69/unsigned/libQnnHtpV69Skel.so /usr/lib/rfsa/adsp $ adb push ./lib/hexagon-v73/unsigned/libQnnHtpV73Skel.so /usr/lib/rfsa/adsp
7. 测试高通TFLite SDK
Qualcomm TFLite SDK 提供了某些示例应用程序,可用于验证、基准测试并获取开发人员想要评估的模型的准确性。
在设备上安装 Qualcomm TFLite SDK 包后,设备上即可使用运行时来运行这些示例应用程序。
先决条件
在设备上创建以下目录:
$ adb shell "mkdir /data/Models"
$ adb shell "mkdir /data/Lables"
$ adb shell "mkdir /data/profiling"
7.1 标签图像标签
图像是 Qualcomm TFLite SDK 提供的实用程序,它展示了如何加载预先训练和转换的 TensorFlow Lite 模型并使用它来识别图像中的对象。
先决条件:
下载示例模型和图像:
您可以使用任何兼容模型,但以下 MobileNet v1 模型很好地演示了经过训练可识别 1000 个不同对象的模型。
-
获取型号
$ curl https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_2018_02_22/mobilenet_v1_1.0_224.tgz | tar xzv -C /data $ mv /data/mobilenet_v1_1.0_224.tflite /data/Models/
-
获取标签
$ curl https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_1.0_224_frozen.tgz | tar xzv -C /data mobilenet_v1_1.0_224/labels.txt
$ mv /data/mobilenet_v1_1.0_224/labels.txt /data/Labels/
连接到 Qualcomm TFLite SDK docker 容器后,可以在以下位置找到该映像: “/mnt/tflite/src/tensorflow/tensorflow/lite/examples/label_image/testdata/grace_hopper.bmp”
-
将此文件推送到/data/Labels/
-
运行命令:
$ adb shell "label_image -l /data/Labels/labels.txt -i /data/Labels/grace_hopper.bmp -m /data/Models/mobilenet_v1_1.0_224.tflite -c 10 -j 1 -p 1"
7.2 基准测试
Qualcomm TFLite SDK 提供了基准测试工具来计算各种运行时间的性能。
这些基准测试工具当前测量和计算以下重要性能指标的统计数据:
- 初始化时间
- 预热状态推断时间
- 稳态推理时间
- 初始化时的内存使用情况
- 总体内存使用情况
先决条件
将待测试的模型从 TFLite Model Zoo ( https://tfhub.dev/ ) 推送到 /data/Models/。运行以下脚本:
-
XNN包
$ adb shell "benchmark_model --graph=/data/Models/<model file> --enable_op_profiling=true --use_xnnpack=true --num_threads=4 --max_secs=300 --profiling_output_csv_file=/data/profiling/<csv file to dump data>"
-
GPU 代理
$ adb shell "benchmark_model --graph=/data/Models/<model file> --enable_op_profiling=true --use_gpu=true --num_runs=100 --warmup_runs=10 --max_secs=300 --profiling_output_csv_file=/data/profiling/<csv file to dump data>"
-
外部代表
-
QNN 外部委托 GPU:
使用浮点模型运行推理:$ adb shell-command "benchmark_model --graph=/data/Models/<model_fp32>.tflite --external_delegate_path=libQnnTFLiteDelegate.so --external_delegate_options='backend_type:gpu;library_path:/usr/lib/libQnnGpu.so;skel_library_dir:/usr/lib/rfsa/adsp'"
-
QNN 外部委托 HTP:
使用定量模型运行推理:$ adb shell-command "benchmark_model --graph=/data/Models/<model_quant>.tflite --external_delegate_path=libQnnTFLiteDelegate.so --external_delegate_options='backend_type:htp;library_path:/usr/lib/libQnnHtp.so;skel_library_dir:/usr/lib/rfsa/adsp'"
-
7.3 精度工具
Qualcomm TFLite SDK 提供了一个精度工具,用于计算不同运行时间的模型的精度。
-
使用 GPU 委托进行分类
下载测试所需文件的步骤可以在以下位置找到:“/mnt/tflite/src/tensorflow/tensorflow/lite/tools/evaluation/tasks/imagenet_image_classificatio/README.md”
用于运行该工具的二进制文件已经是 SDK 的一部分,因此开发人员无需再次构建它。
$ adb shell "image_classify_run_eval -- model_file=/data/Models/<Model file> --ground_truth_images_path=/data/<Ground truth images path> --ground_truth_labels=/data/<ground truth lables> --model_output_labels=/data/<labels file> --delegate=gpu"
-
使用 XNN 包进行物体检测
$ adb shell "inf_diff_run_eval --model_file=/data/Models/<TFLite Object Detection Model> --delegate=xnnpack"