• 文件 >
  • Cadence Xtensa 後端
快捷方式

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 二進位制檔案)

  • MCUXpresso IDE

    • 此 IDE 支援包括 MacOS 在內的多種平臺。您可以在任何受支援的平臺上使用它,因為您僅將其用於將本教程後面構建的 DSP 映像刷寫到開發板。

  • J-Link

    • 用於將韌體映像刷寫到開發板。您可以將其安裝在安裝 MCUXpresso IDE 的同一平臺上。

    • 注意:根據 NXP 開發板的版本不同,可能安裝了 JLink 以外的其他除錯探針。無論如何,都可以使用 MCUXpresso IDE 以類似的方式進行刷寫。

  • MCUXpresso SDK

    • 將此 SDK 下載到您的 Linux 機器,解壓並記下儲存路徑。您稍後將需要它。

  • Xtensa 編譯器

    • 將其下載到您的 Linux 機器。構建用於 HiFi4 DSP 的 ExecuTorch 需要它。

  • 對於使用最佳化 kernel 的情況,需要 nnlib 倉庫

設定開發環境

步驟 1. 為了能夠成功安裝上面指定的所有軟體元件,使用者需要按照下面連結的 NXP 教程進行操作。雖然教程本身介紹了 Windows 設定,但大多數步驟也適用於 Linux 安裝。

NXP 開發板和開發環境設定教程

注意

在繼續進行下一部分之前,使用者應該能夠成功刷寫上述教程中的 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,包括

  • 一個量化的 linear 操作。模型在此處定義:這裡。Linear 是大多數自動語音識別 (ASR) 模型的核心。

  • 一個量化的 conv1d 操作。模型在此處定義:這裡。卷積在喚醒詞和許多去噪模型中很重要。

在這兩種情況下,生成的檔案都命名為 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 根目錄的路徑。這應該已經在設定開發環境部分安裝過了。這是包含 boardscomponentsdevices 等資料夾的目錄。

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 部分。

MCUXpresso IDE

注意

只要二進位制檔案是使用 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 ...

結論和未來工作

在本教程中,您學習瞭如何匯出量化操作、構建 ExecuTorch 執行時並在 Xtensa HiFi4 DSP 晶片上執行此模型。

本教程中的模型(量化 linear)是 ASR 模型中常見的典型操作,可以透過將模型建立為新的測試並將所需的 operator/kernel 新增到 operatorskernels 中來擴充套件到完整的 ASR 模型。

其他模型也可以按照相同的結構建立,前提是 operator 和 kernel 可用。

文件

獲取全面的 PyTorch 開發者文件

檢視文件

教程

獲取面向初學者和高階開發者的深度教程

檢視教程

資源

查詢開發資源並獲得問題解答

檢視資源