> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 SNPE 或 QNN 运行 AI 模型

> 在 Qualcomm Dragonwing IoT 平台上，使用 SNPE 或 QNN 在 CPU、GPU 或 HTP 上对转换后的 AI 模型运行推理。

<Tabs>
  <Tab title="Neural Processing Engine">
    ## 使用 Neural Processing Engine 部署模型

    模型 DLC（量化或非量化）可以通过支持 SNPE 的应用（使用 SNPE C/C++ API 编写的应用）进行部署。SNPE 提供加载 DLC、选择运行模型的运行时以及执行推理等 API。

    SNPE 提供预构建的 [snpe-net-run](https://docs.qualcomm.com/doc/80-63442-10/topic/SNPE_general_tools.html#snpe-net-run) 工具（使用 C API 编写的应用），可以加载任意模型 DLC 并在给定的输入上运行。

    * **模型文件：** 由 SNPE 转换器工具或 `snpe-dlc-graph-prepare` 工具（如果在 HTP 上运行）生成的 DLC 模型文件。
    * **输入列表：** 文本文件，类似量化期间使用的 `input_list.txt` 文件，只不过此列表中的输入 raw 文件用于推理。为简单起见，本示例将量化时使用的同一输入列表用于推理。
    * **运行时：** 用户必须选择特定运行时以在目标设备上运行模型。可用的运行时选项包括 CPU、GPU 和 DSP（HTP）。

    <Note>
      有关更多详细信息，请参见 `snpe-net-run --help`。
    </Note>

    ### 运行 SNPE .dlc：x86 主机

    可以使用 `snpe-net-run` 工具运行转换后的 SNPE .dlc，该工具以 .dlc 和输入列表作为参数。在 x86 上运行 SNPE DLC 纯粹是出于调试目的。

    例如，以下命令加载 `inception_v3.dlc` 模型并在 x86 CPU 上运行该模型。输出文件生成在 `/output_x86/` 中。

    <Note>
      SNPE 中的默认运行时是 CPU。使用 `snpe-net-run` 执行模型时，无需指定 CPU 运行时。
    </Note>

    ```shell theme={null}
    ${QAIRT_ROOT}/bin/x86_64-linux-clang/snpe-net-run --container ~/models/inception_v3.dlc --input_list ~/models/input_list.txt --output_dir ~/models/output_x86
    ```

    <Frame>
      <img src="https://mintcdn.com/qualcomm-prod/WwC9kmcnKl9Ef7de/Key-Documents/AI-Developer-Workflow/_images/snpe-run-host.png?fit=max&auto=format&n=WwC9kmcnKl9Ef7de&q=85&s=6ef09339329645d36fee43c493672696" width="55%" data-path="Key-Documents/AI-Developer-Workflow/_images/snpe-run-host.png" />
    </Frame>

    ### 准备在目标设备上运行 SNPE 模型

    要在目标设备上运行模型，`snpe-net-run` 需要模型 .dlc、SNPE 运行时库和输入列表，以运行推理并生成输出。

    <Note>
      在目标设备上运行之前，请确保已将 SNPE SDK 二进制文件和库推送到目标设备。
    </Note>

    使用来自 `${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2` 和 `${QAIRT_ROOT}/bin/aarch64-oe-linux-gcc11.2` 的产物

    为 Qualcomm 评估套件使用正确的 DSP Hexagon 架构库：

    * **IQ-8275：** 使用 v75 库
    * **IQ-9075：** 使用 v73 库
    * **Qualcomm Dragonwing™ RB3 Gen 2：** 使用 v68 库

    | 文件                                             | 源位置                                             |
    | ---------------------------------------------- | ----------------------------------------------- |
    | snpe-net-run                                   | `${QAIRT_ROOT}/bin/aarch64-oe-linux-gcc11.2`    |
    | libSNPE.so                                     | `${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2/`   |
    | libSnpeHtpPrepare.so                           | `${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2`    |
    | libSnpeHtpV68Stub.so                           | `${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2`    |
    | libSnpeHtpV68Skel.so                           | `${QAIRT_ROOT}/lib/hexagon-<dsp-arch>/unsigned` |
    | Inception\_v3\_quantized\_with\_htp\_cache.dlc | `~/models`                                      |
    | Inception\_v3.dlc                              | `~/models`                                      |
    | input\_list.txt                                | `~/models`                                      |
    | Inception V3 示例输入图像                            | `/tmp/RandomInputsForInceptionV3`               |

    需要在主机上执行以下 `scp` 命令，将 SNPE SDK 库和二进制文件复制到设备。

    <Note>
      对于 IQ-8275，将 `<dsp-arch>` 替换为 `75`；对于 IQ-9075，替换为 `73`；对于 Qualcomm Dragonwing™ RB3 Gen 2，替换为 `68`。
    </Note>

    ```shell theme={null}
    scp ${QAIRT_ROOT}/bin/aarch64-oe-linux-gcc11.2/snpe-net-run \
        ${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2/libSNPE.so \
        ${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2/libSnpeHtpV<dsp-arch>Stub.so \
        ${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2/libSnpeHtpPrepare.so \
        ${QAIRT_ROOT}/lib/hexagon-v<dsp-arch>/unsigned/libSnpeHtpV<dsp-arch>Skel.so \
        root@[ip-addr]:/opt/
    ```

    ```shell theme={null}
    scp ~/models/inception_v3.dlc \
        ~/models/inception_v3_quantized_with_htp_cache.dlc \
        ~/models/input_list.txt \
        root@[ip-addr]:/opt/
    ```

    ```shell theme={null}
    scp -r /tmp/RandomInputsForInceptionV3 root@[ip-addr]:/tmp/
    ```

    ```shell theme={null}
    ssh root@[ip-addr]
    ```

    ```shell theme={null}
    cd /opt
    ```

    上述步骤已为模型执行准备好设备。以下各节详细介绍如何在可用的运行时上运行模型。

    ### 运行 SNPE .dlc：基于 Arm 的 CPU

    在执行模型之前设置环境变量，确保运行模型时可以访问 SNPE 二进制文件和库。

    <Note>
      SNPE 中的默认运行时是 CPU。使用 `snpe-net-run` 执行模型时，无需指定 CPU 运行时。
    </Note>

    ```shell theme={null}
    export LD_LIBRARY_PATH=/opt:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/opt/:$PATH
    ```

    ```shell theme={null}
    snpe-net-run --container inception_v3.dlc --input_list input_list.txt --output_dir output_cpu
    ```

    <Frame>
      <img src="https://mintcdn.com/qualcomm-prod/WwC9kmcnKl9Ef7de/Key-Documents/AI-Developer-Workflow/_images/snpe-run-cpu.png?fit=max&auto=format&n=WwC9kmcnKl9Ef7de&q=85&s=1ec08606f802e1f8ab58819c3ab29c12" width="55%" data-path="Key-Documents/AI-Developer-Workflow/_images/snpe-run-cpu.png" />
    </Frame>

    ### 运行 SNPE DLC：GPU

    要在 GPU 运行时上运行模型，请使用 `inception_v3.dlc` 并将输出保存在 `output_gpu` 中。

    在目标设备的终端中，运行以下命令以启用 GPU 委托和后端：

    ```shell theme={null}
    ln -sf /usr/lib/libOpenCL.so.1 /usr/lib/libOpenCL.so
    export OCL_ICD_FILENAMES=/usr/lib/libOpenCL_adreno.so.1
    ```

    <Note>
      要在 GPU 上运行，请使用 `--use_gpu` 命令行参数指定运行时。
    </Note>

    ```shell theme={null}
    export LD_LIBRARY_PATH=/opt:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/opt:$PATH
    ```

    ```shell theme={null}
    snpe-net-run --container inception_v3.dlc --input_list input_list.txt --output_dir output_gpu --use_gpu
    ```

    ### 运行 SNPE DLC：HTP

    要在 HTP 后端上运行模型，请使用 `inception_v3_quantized_with_htp_cache.dlc` 并将输出保存在 `output_htp` 中。

    <Note>
      要在 HTP 上运行，请使用 `--use_dsp` 命令行参数指定运行时。
    </Note>

    ```shell theme={null}
    export LD_LIBRARY_PATH=/opt:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/opt:$PATH
    ```

    ```shell theme={null}
    export ADSP_LIBRARY_PATH="/opt;/usr/lib/rfsa/adsp;/dsp"
    ```

    ```shell theme={null}
    snpe-net-run --container inception_v3_quantized_with_htp_cache.dlc --input_list input_list.txt --output_dir output_htp --use_dsp
    ```

    <Frame>
      <img src="https://mintcdn.com/qualcomm-prod/WwC9kmcnKl9Ef7de/Key-Documents/AI-Developer-Workflow/_images/snpe-run-htp.png?fit=max&auto=format&n=WwC9kmcnKl9Ef7de&q=85&s=7df1cf021e3e505010f97a4b138a2ae0" width="55%" data-path="Key-Documents/AI-Developer-Workflow/_images/snpe-run-htp.png" />
    </Frame>

    ### 验证输出

    对于输入到 `snpe-net-run` 的每个输入 raw 文件（通过 input\_list 文件），都会生成一个输出文件夹，其中包含以 raw 文件形式保存的输出张量，其大小将与模型的输出层匹配，如下图所示。

    <Note>
      使用 [Netron](https://netron.app/) 工具可视化模型。
    </Note>

    <Frame>
      <img src="https://mintcdn.com/qualcomm-prod/WwC9kmcnKl9Ef7de/Key-Documents/AI-Developer-Workflow/_images/snpe-validate-output.png?fit=max&auto=format&n=WwC9kmcnKl9Ef7de&q=85&s=cf5904d6d40ef92c2f223bad379bb182" width="55%" data-path="Key-Documents/AI-Developer-Workflow/_images/snpe-validate-output.png" />
    </Frame>

    在 `inception_v3` 示例中，输出 raw 文件是一个二进制文件，包含 1000 个分类类别的概率。

    我们使用 Python 脚本将文件读取为 NumPy 数组，以执行后处理和输出验证。以下示例检查 HTP 预测是否与 CPU 预测相同。

    1. 将输出文件从目标设备复制到主机，以便验证输出。

       ```shell theme={null}
       scp -r root@<ip-addr of the target device>:/opt/output_cpu <path>
       ```

       ```shell theme={null}
       scp -r root@<ip-addr of the target device>:/opt/output_htp <path>
       ```

           <Note>
             在以下（`compare.py`）Python 脚本中使用上述命令中的 `<path>`。
           </Note>

    2. 将端侧推理的输出复制到主机后，准备一个脚本来加载保存在 `output_htp` 和 `output_cpu` 中的输出张量以进行比较。

       在本示例中，`output_htp` 和 `output_cpu` 都被复制到 `~/models` 目录。

       以下示例脚本用于比较所使用的某个示例输入的输出。可以使用 `numpy.fromfile(…)` API 将 `snpe-net-run` 的输出加载到 NumPy `ndarrays` 中。

           <Note>
             默认情况下，`snpe-net-run` 以 **float32** 格式将输出张量保存到 NumPy 文件中。
           </Note>

       ```python theme={null}
       # python postprocessing script (compare.py)

       import numpy as np

       htp_output_file_path = "<path>/output_htp/Result_1/875.raw"
       cpu_output_file_path = "<path>/output_cpu/Result_1/875.raw"

       htp_output = np.fromfile(htp_output_file_path, dtype=np.float32)
       htp_output = htp_output.reshape(1,1000)

       cpu_output = np.fromfile(cpu_output_file_path, dtype=np.float32)
       cpu_output = cpu_output.reshape(1,1000)

       # np.argmax gives the cls_id with highest probability from tensor.

       cls_id_htp = np.argmax(htp_output)
       cls_id_cpu = np.argmax(cpu_output)

       # Let's compare CPU output vs HTP output

       print("Cpu prediction {} \n Htp Prediction {}".format(cls_id_cpu, cls_id_htp))
       ```

    **输出：**

    ```
    (qairt) ██████████: ~$ python compare.py

    CPU prediction 794
    HTP prediction 21
    ```

    ### 使用 SNPE API 部署

    SNPE SDK 提供 C/C++ API，用于创建/开发在所选硬件（CPU、GPU 或 HTP）上加速运行模型的应用。请参见演示 SNPE C/C++ API 的[示例应用](https://docs.qualcomm.com/doc/80-63442-10/topic/usergroup8.html)。

    ### 使用 Qualcomm 智能多媒体 SDK（IM SDK）部署

    为了在构建完整用例管道（从摄像头获取流、预处理图像、执行推理等）时改善开发者体验，SNPE 已作为插件（`qtimlsnpe`）集成到 Qualcomm IM SDK 中。

    该插件基于 SNPE C API 开发，提供 SNPE 功能（加载和运行模型）。借助 `qtimlsnpe` 插件，您可以在 Qualcomm IM SDK 管道中使用转换后的模型 DLC 来实现用例。

    有关如何使用 Qualcomm IM SDK 部署 SNPE DLC 的说明，请参见 [Qualcomm IM SDK 概述](../topic/develop-your-own-application-im-sdk)。
  </Tab>

  <Tab title="AI Engine Direct">
    ## 使用 AI Engine Direct 部署模型

    模型 .so（量化或非量化）可以通过支持 QNN 的应用（使用 QNN C/C++ API 编写的应用）进行部署。QNN 提供动态加载模型 .so 并使用所选后端在硬件上运行模型的 API。

    QNN 提供预构建工具（[qnn-net-run](https://docs.qualcomm.com/doc/80-63442-10/topic/general_tools.html#qnn-net-run)），可动态加载此模型 .so，并使用提供的输入在所选后端上执行推理。

    对于 CPU、GPU 或 HTP 执行，`qnn-net-run` 需要以下参数：

    * **模型文件：** 由 `qnn-model-lib-generator` 生成的 .so 文件
    * **后端文件：** 目标后端的 .so 文件
      * CPU 后端使用 `libQnnCpu.so`。
      * GPU 后端使用 `libQnnGpu.so`。
      * HTP 后端使用 `libQnnHtp.so`。
    * **输入列表：** 文本文件，类似量化期间使用的 input\_list.txt 文件，只不过此列表中的输入 raw 文件用于推理。为简单起见，本示例将量化时使用的同一输入列表用于推理。

    ### 运行 QNN .so：x86 主机

    可以使用 `qnn-net-run` 工具运行转换后的 QNN .so，该工具以模型 .so、后端库 .so 和输入列表作为参数。

    例如，以下命令加载 `libinception_v3.so` 模型并在 x86 CPU 上运行该模型。输出文件生成在 `~/models/output_x86/` 中。

    ```shell theme={null}
    ${QAIRT_ROOT}/bin/x86_64-linux-clang/qnn-net-run --model ~/models/libs/x86_64-linux-clang/libinception_v3.so --backend ${QAIRT_ROOT}/lib/x86_64-linux-clang/libQnnCpu.so --input_list ~/models/input_list.txt --output_dir ~/models/output_qnn_x86
    ```

    ### 准备在目标设备上运行 QNN 模型

    要在目标设备上运行模型，`qnn-net-run` 需要模型 .so、QNN 二进制文件和运行时库，以及输入列表，以运行推理并生成输出。

    <Note>
      在目标设备上运行之前，请确保已将 QNN SDK 二进制文件和运行时库推送到目标设备。
    </Note>

    使用来自 `${QAIRT_ROOT}/bin/aarch64-oe-linux-gcc11.2` 和 `${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2` 的产物

    为 Qualcomm 评估套件使用正确的 DSP Hexagon 架构库：

    * **IQ-8275：** 使用 v75 库
    * **IQ-9075：** 使用 v73 库
    * **Qualcomm Dragonwing™ RB3 Gen 2：** 使用 v68 库

    | 文件                             | 源位置                                                       |
    | ------------------------------ | --------------------------------------------------------- |
    | qnn-net-run                    | `${QAIRT_ROOT}/bin/aarch64-oe-linux-gcc11.2`              |
    | libQnnHtp.so                   | `${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2/libQnnHtp.so` |
    | libQnnCpu.so                   | `${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2/libQnnCpu.so` |
    | libQnnGpu.so                   | `${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2/libQnnGpu.so` |
    | libQnnHtpPrepare.so            | `${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2`              |
    | libQnnHtpV68Stub.so            | `${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2`              |
    | libinception\_v3\_quantized.so | `~/models/libs/aarch64-oe-linux-gcc11.2`                  |
    | libinception\_v3.so            | `~/models/libs/aarch64-oe-linux-gcc11.2`                  |
    | libQnnHtpV68Skel.so            | `${QAIRT_ROOT}/lib/hexagon-<dsp-arch>/unsigned`           |
    | libqnnhtpv68.cat               | `${QAIRT_ROOT}/lib/hexagon-<dsp-arch>/unsigned`           |
    | libQnnSaver.so                 | `${QAIRT_ROOT}/lib/hexagon-<dsp-arch>/unsigned`           |
    | libQnnSystem.so                | `${QAIRT_ROOT}/lib/hexagon-<dsp-arch>/unsigned`           |

    在主机上运行以下 `scp` 命令，将 QNN SDK 库和二进制文件复制到设备。

    <Note>
      对于 IQ-8275，将 `<dsp-arch>` 替换为 `75`；对于 IQ-9075，替换为 `73`；对于 Qualcomm Dragonwing™ RB3 Gen 2，替换为 `68`。
    </Note>

    ```shell theme={null}
    scp ${QAIRT_ROOT}/bin/aarch64-oe-linux-gcc11.2/qnn-* \
        ${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2/libQnn*.so \
        ${QAIRT_ROOT}/lib/hexagon-v<dsp-arch>/unsigned/* \
        root@[ip-addr]:/opt/
    ```

    ```shell theme={null}
    scp ~/models/libs/aarch64-oe-linux-gcc11.2/* ~/models/input_list.txt root@[ip-addr]:/opt/
    ```

    ```shell theme={null}
    scp -r /tmp/RandomInputsForInceptionV3 root@[ip-addr]:/tmp/
    ```

    ```shell theme={null}
    ssh root@[ip-addr]
    ```

    ```shell theme={null}
    cd /opt/
    ```

    上述步骤已为模型执行准备好设备。以下各节详细介绍如何在可用的运行时上运行模型。

    ### 运行 QNN .so：基于 Arm 的 CPU

    在基于 Arm 的 CPU 上运行模型时，`qnn-net-run` 需要模型 .so、后端 .so 库和输入列表，以运行推理并生成输出。

    对于 RB3Gen2 目标设备，.so 必须使用 `aarch64-oe-linux-gcc11.2` 工具链交叉编译。

    例如，以下命令将输出文件写入 `/opt/output_cpu/`。

    ```shell theme={null}
    export LD_LIBRARY_PATH=/opt/:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/opt:$PATH
    ```

    ```shell theme={null}
    qnn-net-run --model libinception_v3.so --backend libQnnCpu.so --input_list input_list.txt --output_dir output_cpu
    ```

    ### 在 GPU 上运行 QNN 模型

    在目标设备的终端中，运行以下命令以启用 GPU 委托和后端：

    ```shell theme={null}
    ln -sf /usr/lib/libOpenCL.so.1 /usr/lib/libOpenCL.so
    export OCL_ICD_FILENAMES=/usr/lib/libOpenCL_adreno.so.1
    ```

    在 Adreno GPU 上执行模型时，`qnn-net-run` 需要模型 .so、后端 .so 库（`libQnnGpu.so`）和输入列表，以运行推理并生成输出。

    例如，以下命令将输出文件写入 `/opt/output_gpu/`。

    ```shell theme={null}
    export LD_LIBRARY_PATH=/opt/:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/opt:$PATH
    ```

    ```shell theme={null}
    qnn-net-run --model libinception_v3.so --backend libQnnGpu.so --input_list input_list.txt --output_dir output_gpu
    ```

    ### 在 HTP 后端上运行 QNN 模型

    要在 HTP 后端上运行模型，请使用 `libquantized_inception_v3.so` 库和 `libQnnHtp.so` 后端库，并将输出保存在 `output_htp` 目录中。

    ```shell theme={null}
    export LD_LIBRARY_PATH=/opt/:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/opt:$PATH
    ```

    ```shell theme={null}
    export ADSP_LIBRARY_PATH="/opt/;/usr/lib/rfsa/adsp;/dsp"
    ```

    ```shell theme={null}
    qnn-net-run --model libinception_v3_quantized.so --backend libQnnHtp.so --input_list input_list.txt --output_dir output_htp
    ```

    ### 验证输出

    对于输入到 `qnn-net-run` 的每个 raw 输入文件（通过 input\_list 文件），都会生成一个输出文件夹，其中包含 raw 输出文件，其大小与模型的输出层匹配，如下图所示。

    <Frame>
      <img src="https://mintcdn.com/qualcomm-prod/WwC9kmcnKl9Ef7de/Key-Documents/AI-Developer-Workflow/_images/qnn-validate-output.png?fit=max&auto=format&n=WwC9kmcnKl9Ef7de&q=85&s=73eb80fcefd55073188178853484808a" width="55%" data-path="Key-Documents/AI-Developer-Workflow/_images/qnn-validate-output.png" />
    </Frame>

    在此 `inception_v3` 示例中，raw 输出文件是一个二进制文件，包含 1000 个分类类别的概率。

    您可以使用 Python 脚本将文件读取为 NumPy 数组，以执行后处理和输出验证。以下示例脚本检查 HTP 预测是否与 CPU 预测相同。

    ```shell theme={null}
    scp -r root@<ip-addr of the target device>:/opt/output_cpu <path>
    ```

    ```shell theme={null}
    scp -r root@<ip-addr of the target device>:/opt/output_htp <path>
    ```

    <Note>
      在以下 Python 脚本中使用上述命令中的 `<path>`。
    </Note>

    将 `qnn-net-run` 工具的输出从设备复制到主机后，创建一个简单的 Python 脚本，加载 CPU 和 HTP 执行的输出并使用 NumPy 进行比较。

    ```python theme={null}
    #python postprocessing script (compare.py)

    import numpy as np

    htp_output_file_path = "<path>/output_htp/Result_1/_875.raw"
    cpu_output_file_path = "<path>/output_cpu/Result_1/_875.raw"

    htp_output = np.fromfile(htp_output_file_path, dtype=np.float32)
    htp_output = htp_output.reshape(1,1000)

    cpu_output = np.fromfile(cpu_output_file_path, dtype=np.float32)
    cpu_output = cpu_output.reshape(1,1000)

    cls_id_htp = np.argmax(htp_output)
    cls_id_cpu = np.argmax(cpu_output)

    # Let's compare CPU output vs HTP output
    print("CPU prediction {} \n HTP prediction {}".format(cls_id_cpu, cls_id_htp))
    ```

    **输出：**

    ```
    (qairt) ██████████: ~$ python compare.py

    CPU prediction 794
    HTP prediction 21
    ```

    ### 使用 QNN API 部署

    Qualcomm AI Engine Direct SDK 提供 C/C++ API，用于创建/开发可加载编译后的 .so 模型并在所选后端（CPU、GPU 或 HTP）上加速运行的应用。请参见演示 QNN C/C++ API 的[示例应用](https://docs.qualcomm.com/doc/80-63442-10/topic/sample_app.html)。

    ### 使用 Qualcomm IM SDK 部署

    为了在构建完整用例管道（从摄像头获取流、预处理图像、执行推理等）时改善开发者体验，QNN 已作为 `qtimlqnn` 插件集成到 Qualcomm IM SDK 中。

    该插件基于 QNN C API 开发，提供动态加载和运行模型的能力。借助 `qtimlqnn` 插件，开发者可以在 Qualcomm IM SDK 管道中使用其转换和编译后的模型库来实现用例。

    有关如何使用 Qualcomm IM SDK 部署 QNN 模型的说明，请参见 [Qualcomm IM SDK 概述](../topic/develop-your-own-application-im-sdk)。
  </Tab>
</Tabs>
