在 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 執行時環境,其中包含在 Xtensa HiFi4 DSP 上運行上一步中產生的量化模型所需的核心。
注意
本教學的 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 所需的。
對於具有最佳化核心的情況,請使用 nnlib 儲存庫。
設定開發者環境¶
步驟 1. 為了能夠成功安裝上述所有軟體元件,使用者需要完成以下連結的 NXP 教學。 雖然教學本身會逐步引導 Windows 設定,但大多數步驟也可以轉換為 Linux 安裝。
注意
在繼續進行下一節之前,使用者應該能夠成功地從上述教學中刷寫 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 中定義,並在其他資料夾中具有相應的實作。
運算子:
運算子資料夾包含兩種運算子:來自 ExecuTorch 可攜式函式庫 的現有運算子和定義自訂運算的新的運算子。 前者只是將運算子分派到相關的 ExecuTorch 實作,而後者則充當介面,設定自訂核心計算輸出所需的一切。
核心:
核心資料夾包含將在 HiFi4 晶片上運行的最佳化核心。 它們使用 Xtensa 內部函式以低功耗提供高效能。
建置¶
在此步驟中,您將從不同的模型產生 ExecuTorch 程式。 然後,您將在執行時建置步驟中使用此程式 (.pte
檔案) 將此程式烘焙到 DSP 映像中。
簡單模型:
第一個簡單模型旨在測試本教學的所有元件是否正常工作,並且只做一個加法運算。 產生的檔案稱為 add.pte
。
cd executorch
python3 -m examples.portable.scripts.export --model_name="add"
量化運算子:
另一個更複雜的模型是自訂運算子,包括
在這兩種情況下,產生的檔案都稱為 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 儲存庫,其中包含針對 HiFi4 DSP 優化的核心和基本元件,使用 git clone git@github.com: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
區段中。
注意
只要二進位檔是使用 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 ...