目录

在 Xtensa HiFi4 DSP 上构建和运行 ExecuTorch

在本教程中,我们将引导您完成为 Xtensa HiFi4 DSP 构建 ExecuTorch 并在其上运行简单模型的过程。

Cadence 既是硬件和软件供应商,也为许多计算工作负载提供解决方案,包括在功率受限的嵌入式设备上运行。Xtensa HiFi4 DSP 是一款数字信号处理器 (DSP),针对运行基于音频的神经网络进行了优化,例如唤醒词检测、自动语音识别 (ASR) 等。

除了芯片之外,HiFi4 神经网络库 (nnlib) 还提供了一组优化的 NN 处理中常用的库函数,我们在此示例中使用这些函数来演示如何加速常见操作。

除了能够在 Xtensa HiFi4 DSP 上运行之外,本教程的另一个目标是演示 ExecuTorch 的便携性及其在 Xtensa HiFi4 DSP 等低功耗嵌入式设备上运行的能力。此工作流程不需要任何委托,它使用自定义运算符和编译器传递来增强模型,使其更适合在 Xtensa HiFi4 DSP 上运行。自定义量化器用于将激活和权重表示为 ,而不是 ,并调用适当的运算符。最后,使用 Xtensa 内联函数优化的自定义内核可提供运行时加速。uint8float

您将在本教程中学到什么:
  • 在本教程中,您将学习如何使用针对 Xtensa HiFi4 DSP 的线性运算导出量化模型。

  • 您还将学习如何编译和部署 ExecuTorch 运行时,以及在 Xtensa HiFi4 DSP 上运行上一步中生成的量化模型所需的内核。

我们建议您在此之前完成教程:

注意

本教程的 linux 部分已在 Ubuntu 22.04 LTS 上设计和测试,需要 glibc 2.34。解决方法可用于其他发行版,但本教程不会介绍。

先决条件(硬件和软件)

为了能够在 Xtensa HiFi4 DSP 上成功构建和运行 ExecuTorch,您需要以下硬件和软件组件。

软件

  • x86-64 Linux 系统(用于编译 DSP 二进制文件)

  • MCUXpresso IDE

    • 此 IDE 在包括 MacOS 在内的多个平台上受支持。您可以在任何支持的平台上使用它,因为您只会使用它来刷写带有您将在本教程后面构建的 DSP 映像的板。

  • J-Link 连接

    • 需要使用固件映像刷新板。您可以在安装MCUXpresso IDE的同一平台上安装它。

    • 注意:根据 NXP 板的版本,可能会安装 JLink 以外的其他探针。在任何情况下,刷写都是使用 MCUXpresso IDE 以类似的方式完成的。

  • MCUXpresso 软件开发工具包

    • 将此 SDK 下载到您的 Linux 计算机,将其解压缩并记下存储它的路径。您稍后会用到它。

  • Xtensa 编译器

    • 将此文件下载到您的 Linux 计算机。这是为 HiFi4 DSP 构建 ExecuTorch 所必需的。

  • 对于具有优化内核的情况,请使用 nnlib 存储库

设置 Developer Environment

步骤 1.为了能够成功安装上面指定的所有软件组件,用户需要完成下面链接的 NXP 教程。尽管本教程本身介绍了 Windows 设置,但大多数步骤也转换为 Linux 安装。

关于设置电路板和开发环境的 NXP 教程

注意

在继续下一部分之前,用户应该能够成功刷写上述教程中dsp_mu_polling_cm33示例应用程序,并注意到 UART 控制台上的输出指示 Cortex-M33 和 HiFi4 DSP 正在相互通信。

步骤 2。确保您已完成本页顶部链接的 ExecuTorch 设置教程。

工作树描述

工作树为:

examples/xtensa/
├── aot
├── kernels
├── ops
├── third-party
└── utils

AoT(提前)组件

AoT 文件夹包含将模型导出到 ExecuTorch 文件所需的所有 python 脚本和函数。在我们的例子中,export_example.py 定义了一个模型和一些示例输入(设置为 1 向量),并通过量化器(来自 quantizer.py)运行它。然后,一些编译器传递(也在 quantizer.py 中定义)将 Operator 替换为在芯片上支持和优化的自定义 Operator。任何计算事物所需的运算符都应该在 meta_registrations.py 中定义,并在其他文件夹中有相应的实现。.pte

运算符

operators 文件夹包含两种类型的运算符:ExecuTorch 可移植库中的现有运算符和定义自定义计算的新运算符。前者只是简单地将 Operator 分派给相关的 ExecuTorch 实现,而后者充当接口,设置自定义内核计算输出所需的一切。

内核

kernels 文件夹包含将在 HiFi4 芯片上运行的优化内核。它们使用 Xtensa 内在函数以低功耗提供高性能。

在此步骤中,您将从不同的模型生成 ExecuTorch 程序。然后,您将在运行时构建步骤中使用此 Program(文件)将此 Program 烘焙到 DSP 映像中。.pte

简单型号

第一个简单模型用于测试本教程的所有组件是否正常工作,并且只执行 add 操作。生成的文件称为 。add.pte

cd executorch
python3 -m examples.portable.scripts.export --model_name="add"

量化线性:

第二个更复杂的模型是量化线性运算。模型在此处定义。线性是大多数自动语音识别 (ASR) 模型的基础。

生成的文件称为 。XtensaDemoModel.pte

cd executorch
python3 -m examples.xtensa.aot.export_example

运行

构建 DSP 固件映像在此步骤中,您将构建 DSP 固件映像,该映像由示例 ExecuTorch 运行程序以及上一步生成的程序组成。此图像加载到 DSP 时,将穿过此程序组成的模型。

步骤 1.配置所需的环境变量,以指向您在上一步中安装的 Xtensa 工具链。需要设置的三个环境变量包括:

# Directory in which the Xtensa toolchain was installed
export XTENSA_TOOLCHAIN=/home/user_name/xtensa/XtDevTools/install/tools
# The version of the toolchain that was installed. This is essentially the name of the directory
# that is present in the XTENSA_TOOLCHAIN directory from above.
export TOOLCHAIN_VER=RI-2021.8-linux
# The Xtensa core that you're targeting.
export XTENSA_CORE=nxp_rt600_RI2021_8_newlib

步骤 2。使用 克隆 nnlib 存储库,其中包含针对 HiFi4 DSP 的优化内核和基元。git clone git@github.com:foss-xtensa/nnlib-hifi4.git

步骤 3。运行 CMake 构建。 为了运行 CMake 构建,您需要以下路径:

  • 在上一步中生成的 Program

  • NXP SDK 根目录的路径。这应该已经在 设置开发人员环境 部分中安装了。这是包含 boards、components、devices 等文件夹的目录。

cd executorch
mkdir cmake-xt
cd cmake-xt
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../examples/xtensa/xtensa.cmake -DMODEL_PATH=<path_to_program_file_generated_in_previous_step> -DNXP_SDK_ROOT_DIR=<path_to_nxp_sdk_root> -DEXECUTORCH_BUILD_FLATC=0 -DFLATC_EXECUTABLE="$(which flatc)" -DEXECUTORCH_BUILD_XTENSA_EXAMPLE=1 -DNN_LIB_BASE_DIR=<path_to_nnlib_cloned_in_step_2>  ..
cd ..
cmake --build cmake-xt -j8 -t xtensa_executorch_example

成功运行上述步骤后,您应该会在它们的 CMake 输出目录中看到两个二进制文件。

> ls cmake-xt/*.bin
cmake-xt/dsp_data_release.bin  cmake-xt/dsp_text_release.bin

在设备上部署和运行

步骤 1.现在,您将获取上一步生成的 DSP 二进制映像,并将其复制到在设置开发人员环境部分创建的 NXP 工作区中。将 DSP 图像复制到下图中突出显示的部分。dsp_binary

MCUXpresso IDE

注意

只要二进制文件是在Linux上使用Xtensa工具链构建的,就只能使用MCUXpresso IDE来刷新电路板并在芯片上运行,该IDE适用于所有平台(Linux、MacOS、Windows)。

步骤 2。清洁您的工作空间

步骤 3。单击 Debug your Project,这将使用二进制文件刷写板。

在连接到开发板的 UART 控制台上(默认波特率为 115200),您应该会看到类似于以下内容的输出:

> screen /dev/tty.usbmodem0007288234991 115200
Executed model
Model executed successfully.
First 20 elements of output 0
0.165528   0.331055 ...

结论和未来工作

在本教程中,您学习了如何导出量化运算、构建 ExecuTorch 运行时并在 Xtensa HiFi4 DSP 芯片上运行此模型。

本教程中的模型是 ASR 模型中出现的典型操作,可以通过在 export_example.py 中创建模型并将所需的运算符/内核添加到运算符内核来扩展到完整的 ASR 模型。

可以按照相同的结构创建其他模型,始终假设 Operator 和 kernel 可用。

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源