> ## 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 .dlc 可以使用 `snpe-net-run` 工具运行,该工具以 .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://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/AI-Developer-Workflow-Ubuntu/_images/snpe-run-host.png" width="55%" />
    </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 架构库:

    #### 适用于 Qualcomm 评估套件的 Hexagon 架构库

    | Qualcomm 评估套件                  | Hexagon 架构库 |
    | ------------------------------ | ----------- |
    | IQ-8275                        | v75         |
    | IQ-9075                        | v73         |
    | Qualcomm Dragonwing™ RB3 Gen 2 | v68         |

    <Note>
      对于其他硬件的 Hexagon 架构,请查看此[页面](https://docs.qualcomm.com/nav/home/QNN_general_overview.html?product=924033590759186372#supported-snapdragon-devices)。
    </Note>

    | 文件                                             | 源位置                                             |
    | ---------------------------------------------- | ----------------------------------------------- |
    | 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>
      将 `<dsp-arch>` 替换为:IQ-8275 使用 `75`,IQ-9075 使用 `73`,Qualcomm Dragonwing™ RB3 Gen 2 使用 `68`。
    </Note>

    ```shell theme={null}
    ssh ubuntu@[ip-addr]
    mkdir snpe_artifacts
    exit
    ```

    ```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 \
        ubuntu@[ip-addr]:/home/ubuntu/snpe_artifacts/
    ```

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

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

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

    ```shell theme={null}
    cd /home/ubuntu/snpe_artifacts/
    ```

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

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

    在执行模型之前设置环境变量,以确保 SNPE 二进制文件和库可用于运行模型。

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

    ```shell theme={null}
    export LD_LIBRARY_PATH=/home/ubuntu/snpe_artifacts/:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/home/ubuntu/snpe_artifacts/:$PATH
    ```

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

    <Frame>
      <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/AI-Developer-Workflow-Ubuntu/_images/snpe-run-cpu.png" width="55%" />
    </Frame>

    ### 运行 SNPE DLC:GPU

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

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

    ```shell theme={null}
    export LD_LIBRARY_PATH=/home/ubuntu/snpe_artifacts:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/home/ubuntu/snpe_artifacts:$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=/home/ubuntu/snpe_artifacts:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/home/ubuntu/snpe_artifacts:$PATH
    ```

    ```shell theme={null}
    export ADSP_LIBRARY_PATH="/home/ubuntu/snpe_artifacts/;/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://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/AI-Developer-Workflow-Ubuntu/_images/snpe-run-htp.png" width="55%" />
    </Frame>

    ### 验证输出

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

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

    <Frame>
      <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/AI-Developer-Workflow-Ubuntu/_images/snpe-validate-output.png" width="55%" />
    </Frame>

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

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

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

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

       ```shell theme={null}
       scp -r ubuntu@<ip-addr of the target device>:/home/ubuntu/snpe_artifacts/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 Intelligent Multimedia 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 概述](/zh/AI-Developer-Workflow-Ubuntu/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 .so 可以使用 `qnn-net-run` 工具运行,该工具以模型 .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 架构库:

    #### 适用于 Qualcomm 评估套件的 Hexagon 架构库

    | Qualcomm 评估套件                  | Hexagon 架构库 |
    | ------------------------------ | ----------- |
    | IQ-8275                        | v75         |
    | IQ-9075                        | v73         |
    | Qualcomm Dragonwing™ RB3 Gen 2 | v68         |

    <Note>
      对于其他硬件的 Hexagon 架构,请查看此[页面](https://docs.qualcomm.com/nav/home/QNN_general_overview.html?product=924033590759186372#supported-snapdragon-devices)。
    </Note>

    | 文件                             | 源位置                                                       |
    | ------------------------------ | --------------------------------------------------------- |
    | 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>
      将 `<dsp-arch>` 替换为:IQ-8275 使用 `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/* \
        ubuntu@[ip-addr]:/home/ubuntu/snpe_artifacts/
    ```

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

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

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

    ```shell theme={null}
    cd /home/ubuntu/snpe_artifacts/
    ```

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

    ### 运行 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=/home/ubuntu/snpe_artifacts:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/home/ubuntu/snpe_artifacts:$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 模型

    在 Adreno GPU 上执行模型时,`qnn-net-run` 需要模型 .so、后端 .so 库(`libQnnGpu.so`)以及输入列表来运行推理以生成输出。

    例如,以下命令会将输出文件写入 `/home/ubuntu/snpe_artifacts/output_gpu/`。

    ```shell theme={null}
    export LD_LIBRARY_PATH=/home/ubuntu/snpe_artifacts:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/home/ubuntu/snpe_artifacts:$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=/home/ubuntu/snpe_artifacts:$LD_LIBRARY_PATH
    ```

    ```shell theme={null}
    export PATH=/home/ubuntu/snpe_artifacts:$PATH
    ```

    ```shell theme={null}
    export ADSP_LIBRARY_PATH="/home/ubuntu/snpe_artifacts;/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://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/AI-Developer-Workflow-Ubuntu/_images/qnn-validate-output.png" width="55%" />
    </Frame>

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

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

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

    ```shell theme={null}
    scp -r ubuntu@<ip-addr of the target device>:/home/ubuntu/snpe_artifacts/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 概述](/zh/AI-Developer-Workflow-Ubuntu/topic/develop-your-own-application-im-sdk)。
  </Tab>
</Tabs>
