• 文档 >
  • 在 Xtensa HiFi4 DSP 上构建和运行 ExecuTorch
快捷方式

在 Xtensa HiFi4 DSP 上构建和运行 ExecuTorch

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

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

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

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

您将在本教程中学到的内容
  • 在本教程中,您将学习如何导出针对 Xtensa HiFi4 DSP 的具有线性运算的量化模型。

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

我们建议您在本教程之前完成的教程

注意

本教程的 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

    • 将此 SDK 下载到您的 Linux 机器,解压缩并记下您存储它的路径。您稍后需要它。

  • Xtensa 编译器

    • 将其下载到您的 Linux 机器。这是为 HiFi4 DSP 构建 ExecuTorch 所必需的。

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

设置开发者环境

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

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

注意

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

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

工作树描述

工作树是

executorch
├── backends
│   └── cadence
│       ├── aot
│       ├── ops_registration
│       ├── tests
│       ├── utils
│       ├── hifi
│       │   ├── kernels
│       │   ├── operators
│       │   └── third-party
│       │       └── hifi4-nnlib
│       └── [other cadence DSP families]
│           ├── kernels
│           ├── operators
│           └── third-party
│               └── [any required lib]
└── examples
    └── cadence
        ├── models
        └── operators

AoT(预先编译)组件:

AoT 文件夹包含将模型导出到 ExecuTorch .pte 文件所需的所有 python 脚本和函数。在我们的例子中,export_example.py 是一个 API,它接受一个模型 (nn.Module) 和代表性输入,并通过量化器(来自 quantizer.py)运行它。然后,一些编译器 Pass(也在 quantizer.py 中定义)会将算子替换为芯片上支持和优化的自定义算子。计算事物所需的任何算子都应在 ops_registrations.py 中定义,并在其他文件夹中具有相应的实现。

算子:

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

内核:

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

构建

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

简单模型:

第一个简单模型旨在测试本教程的所有组件是否正常工作,并且仅执行加法运算。生成的文件名为 add.pte

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

量化算子:

另一个更复杂的模型是自定义算子,包括

  • 一个量化的 线性 运算。该模型在 此处 定义。线性是大多数自动语音识别 (ASR) 模型的支柱。

  • 一个量化的 conv1d 运算。该模型在 此处 定义。卷积在唤醒词和许多去噪模型中都很重要。

在这两种情况下,生成的文件都名为 CadenceDemoModel.pte

cd executorch
python3 -m examples.cadence.operators.quantized_<linear,conv1d>_op

小型模型:RNNT 预测器:

torchaudio RNNT-emformer 模型是一种自动语音识别 (ASR) 模型,由三个不同的子模型组成:编码器、预测器和连接器。预测器 是一系列基本运算(嵌入、ReLU、线性、层归一化),可以使用以下命令导出

cd executorch
python3 -m examples.cadence.models.rnnt_predictor

生成的文件名为 CadenceDemoModel.pte

运行时

构建 DSP 固件镜像 在此步骤中,您将构建 DSP 固件镜像,该镜像由示例 ExecuTorch 运行器以及从上一步生成的程序组成。加载到 DSP 上的此镜像将运行此程序包含的模型。

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

# Directory in which the Xtensa toolchain was installed
export XTENSA_TOOLCHAIN=/home/user_name/cadence/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 repo,其中包含 HiFi4 DSP 的优化内核和原语,使用 git clone [email protected]:foss-xtensa/nnlib-hifi4.git

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

  • 上一步生成的程序

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

cd executorch
./install_requirements.sh --clean
mkdir cmake-out
# prebuild and install executorch library
cmake -DCMAKE_TOOLCHAIN_FILE=<path_to_executorch>/backends/cadence/cadence.cmake \
    -DCMAKE_INSTALL_PREFIX=cmake-out \
    -DCMAKE_BUILD_TYPE=Debug \
    -DPYTHON_EXECUTABLE=python3 \
    -DEXECUTORCH_BUILD_EXTENSION_RUNNER_UTIL=ON \
    -DEXECUTORCH_BUILD_HOST_TARGETS=ON \
    -DEXECUTORCH_BUILD_EXECUTOR_RUNNER=OFF \
    -DEXECUTORCH_BUILD_PTHREADPOOL=OFF \
    -DEXECUTORCH_BUILD_CPUINFO=OFF \
    -DEXECUTORCH_BUILD_FLATC=OFF \
    -DFLATC_EXECUTABLE="$(which flatc)" \
    -Bcmake-out .

cmake --build cmake-out -j<num_cores> --target install --config Debug
# build cadence runner
cmake -DCMAKE_BUILD_TYPE=Debug \
    -DCMAKE_TOOLCHAIN_FILE=<path_to_executorch>/examples/backends/cadence.cmake \
    -DCMAKE_PREFIX_PATH=<path_to_executorch>/cmake-out \
    -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)" \
    -DNN_LIB_BASE_DIR=<path_to_nnlib_cloned_in_step_2> \
    -Bcmake-out/examples/cadence \
    examples/cadence

cmake --build cmake-out/examples/cadence -j8 -t cadence_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(在所有平台(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 模型中出现的典型运算,可以通过创建一个新测试并将所需的算子/内核添加到 operatorskernels 来扩展到完整的 ASR 模型。

可以按照相同的结构创建其他模型,始终假设算子和内核可用。

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

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

查看教程

资源

查找开发资源并获得问题解答

查看资源