Cadence Xtensa 后端¶
本教程将引导您完成针对 Xtensa HiFi4 DSP 构建 ExecuTorch 并运行简单模型的设置过程。
Cadence 既是硬件供应商也是软件供应商,为多种计算工作负载提供解决方案,包括在功耗受限的嵌入式设备上运行。 Xtensa HiFi4 DSP 是一种数字信号处理器 (DSP),针对运行基于音频的神经网络进行了优化,例如唤醒词检测、自动语音识别 (ASR) 等。
除了芯片之外,HiFi4 神经网络库 (nnlib) 提供了一套在神经网络处理中常用的优化库函数,我们在本示例中利用这些函数来演示如何加速常见操作。
除了能够在 Xtensa HiFi4 DSP 上运行之外,本教程的另一个目标是展示 ExecuTorch 的可移植性及其在 Xtensa HiFi4 DSP 等低功耗嵌入式设备上运行的能力。此工作流程不需要任何 delegate,它使用自定义 operator 和编译器 passes 来增强模型,使其更适合在 Xtensa HiFi4 DSP 上运行。使用自定义 quantizer 将激活和权重表示为 uint8
而非 float
,并调用适当的 operator。最后,使用 Xtensa intrinsics 优化的自定义 kernel 提供了运行时加速。
在本教程中,您将学习如何导出针对 Xtensa HiFi4 DSP 的包含线性操作的量化模型。
您还将学习如何编译和部署 ExecuTorch 运行时以及在 Xtensa HiFi4 DSP 上运行上一步生成的量化模型所需的 kernel。
注意
本教程的 Linux 部分是在 Ubuntu 22.04 LTS 上设计和测试的,需要 glibc 2.34。其他发行版也有变通方法,但本教程将不予介绍。
先决条件(硬件和软件)¶
为了能够在 Xtensa HiFi4 DSP 上成功构建和运行 ExecuTorch,您需要以下硬件和软件组件。
软件¶
x86-64 Linux 系统(用于编译 DSP 二进制文件)
-
此 IDE 支持包括 MacOS 在内的多种平台。您可以在任何受支持的平台上使用它,因为您仅将其用于将本教程后面构建的 DSP 映像刷写到开发板。
-
用于将固件映像刷写到开发板。您可以将其安装在安装 MCUXpresso IDE 的同一平台上。
注意:根据 NXP 开发板的版本不同,可能安装了 JLink 以外的其他调试探针。无论如何,都可以使用 MCUXpresso IDE 以类似的方式进行刷写。
-
将此 SDK 下载到您的 Linux 机器,解压并记下存储路径。您稍后将需要它。
-
将其下载到您的 Linux 机器。构建用于 HiFi4 DSP 的 ExecuTorch 需要它。
对于使用优化 kernel 的情况,需要 nnlib 仓库。
设置开发环境¶
步骤 1. 为了能够成功安装上面指定的所有软件组件,用户需要按照下面链接的 NXP 教程进行操作。虽然教程本身介绍了 Windows 设置,但大多数步骤也适用于 Linux 安装。
注意
在继续进行下一部分之前,用户应该能够成功刷写上述教程中的 dsp_mu_polling_cm33
示例应用程序,并在 UART 控制台(默认波特率为 115200)上看到输出,表明 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(来自 quantizer.py)运行它。然后,在 quantizer.py 中定义的几个编译器 passes 将使用芯片上支持和优化的自定义 operator 替换现有 operator。任何用于计算的 operator 都应该在 ops_registrations.py 中定义,并在其他文件夹中有相应的实现。
Operator:
operators 文件夹包含两种 operator:来自 ExecuTorch 可移植库的现有 operator 和定义自定义计算的新 operator。前者只是将 operator 分派到相关的 ExecuTorch 实现,而后者充当接口,设置自定义 kernel 计算输出所需的一切。
Kernel:
kernels 文件夹包含将在 HiFi4 芯片上运行的优化 kernel。它们使用 Xtensa intrinsics 在低功耗下提供高性能。
构建¶
在此步骤中,您将从不同的模型生成 ExecuTorch program。然后,您将在运行时构建步骤中使用此 Program(`.pte` 文件)将其嵌入到 DSP 映像中。
简单模型:
第一个简单模型旨在测试本教程的所有组件是否正常工作,它只执行一个加法操作。生成的文件名为 add.pte
。
cd executorch
python3 -m examples.portable.scripts.export --model_name="add"
量化 Operator:
另一个更复杂的模型是自定义 operator,包括
在这两种情况下,生成的文件都命名为 CadenceDemoModel.pte
。
cd executorch
python3 -m examples.cadence.operators.quantized_<linear,conv1d>_op
小型模型:RNNT predictor:
torchaudio RNNT-emformer 模型是一种自动语音识别 (ASR) 模型,由三个不同的子模型组成:一个 encoder、一个 predictor 和一个 joiner。predictor 是一系列基本 ops(embedding、ReLU、linear、layer norm),可以使用以下方法导出:
cd executorch
python3 -m examples.cadence.models.rnnt_predictor
生成的文件命名为 CadenceDemoModel.pte
。
运行时¶
构建 DSP 固件映像 在此步骤中,您将构建包含示例 ExecuTorch runner 和上一步生成的 Program 的 DSP 固件映像。此映像加载到 DSP 后,将运行此 Program 包含的模型。
步骤 1. 配置指向您在上一步中安装的 Xtensa toolchain 所需的环境变量。需要设置的三个环境变量包括:
# 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 仓库(包含用于 HiFi4 DSP 的优化 kernel 和 primitives),使用命令 git clone git@github.com:foss-xtensa/nnlib-hifi4.git
。
步骤 3. 运行 CMake 构建。要运行 CMake 构建,您需要以下路径:
上一步生成的 Program
NXP SDK 根目录的路径。这应该已经在设置开发环境部分安装过了。这是包含
boards
、components
、devices
等文件夹的目录。
cd executorch
./install_executorch.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 \
-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> \
-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
部分。
注意
只要二进制文件是使用 Linux 上的 Xtensa toolchain 构建的,刷写开发板并在芯片上运行只需使用 MCUXpresso IDE 即可完成,该 IDE 可在所有平台(Linux、MacOS、Windows)上使用。
步骤 2. 清理您的工作区
步骤 3. 点击“调试您的项目”,这将使用您的二进制文件刷写开发板。
在连接到您的开发板的 UART 控制台(默认波特率为 115200)上,您应该看到类似于以下的输出:
> screen /dev/tty.usbmodem0007288234991 115200
Executed model
Model executed successfully.
First 20 elements of output 0
0.165528 0.331055 ...