使用 Vulkan 後端構建和執行 ExecuTorch¶
ExecuTorch Vulkan 委派是用於 ExecuTorch 的原生 GPU 委派。
如何使用部分 GPU 委派匯出 Llama3.2-1B 參數模型
如何在 Android 上執行部分委派模型
請依照 設定 ExecuTorch
也建議您閱讀 ExecuTorch Vulkan Delegate 並依照該頁面中的範例
先決條件¶
請注意,以下所有步驟都應從 ExecuTorch 儲存庫的根目錄執行,並假定您已完成設定 ExecuTorch 的步驟。
同時假定已安裝 Android NDK 和 Android SDK,並且已設定以下環境變數範例。
export ANDROID_NDK=<path_to_ndk>
# Select an appropriate Android ABI for your device
export ANDROID_ABI=arm64-v8a
# All subsequent commands should be performed from ExecuTorch repo root
cd <path_to_executorch_root>
# Make sure adb works
adb --version
將 Llama3.2-1B 模型降低至 Vulkan¶
注意
產生的模型將僅部分委派給 Vulkan 後端。 特別是,只有二元算術運算符(aten.add
、aten.sub
、aten.mul
、aten.div
),矩陣乘法運算符(aten.mm
、aten.bmm
)和線性層(aten.linear
)將通過 Vulkan Delegate 在 GPU 上執行。 模型的其餘部分將使用 Portable 運算符執行。
目前正在積極開發對 LLaMA 模型的操作符支持;請查看 ExecuTorch 儲存庫的 main
分支,以獲取最新的功能。
首先,從 Llama 網站獲取 Llama3.2-1B
模型的 consolidated.00.pth
、params.json
和 tokenizer.model
檔案。
下載檔案後,可以使用 export_llama
腳本將 Llama 模型部分降低至 Vulkan。
# The files will usually be downloaded to ~/.llama
python -m examples.models.llama.export_llama \
--disable_dynamic_shape --vulkan -kv --use_sdpa_with_kv_cache -d fp32 \
--model "llama3_2" \
-c ~/.llama/checkpoints/Llama3.2-1B/consolidated.00.pth \
-p ~/.llama/checkpoints/Llama3.2-1B/params.json \
--metadata '{"get_bos_id":128000, "get_eos_ids":[128009, 128001]}'
執行腳本後,應該已建立 vulkan_llama2.pte
檔案。
將 tokenizer 二進制檔案和 vulkan_llama2.pte
推送到您的 Android 裝置上
adb push ~/.llama/tokenizer.model /data/local/tmp/
adb push vulkan_llama2.pte /data/local/tmp/
在 Android 上構建並運行 LLaMA 運行器二進制檔案¶
首先,構建並安裝 ExecuTorch 庫,然後使用 Android NDK 工具鏈構建 LLaMA 運行器二進制檔案。
./install_requirements.sh --clean
(mkdir cmake-android-out && \
cmake . -DCMAKE_INSTALL_PREFIX=cmake-android-out \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=$ANDROID_ABI \
-DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
-DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
-DEXECUTORCH_BUILD_EXTENSION_TENSOR=ON \
-DEXECUTORCH_BUILD_VULKAN=ON \
-DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON \
-DEXECUTORCH_BUILD_KERNELS_CUSTOM=ON \
-DPYTHON_EXECUTABLE=python \
-Bcmake-android-out && \
cmake --build cmake-android-out -j16 --target install)
# Build LLaMA Runner library
(rm -rf cmake-android-out/examples/models/llama && \
cmake examples/models/llama \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=$ANDROID_ABI \
-DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
-DEXECUTORCH_BUILD_KERNELS_CUSTOM=ON \
-DCMAKE_INSTALL_PREFIX=cmake-android-out \
-DPYTHON_EXECUTABLE=python \
-Bcmake-android-out/examples/models/llama && \
cmake --build cmake-android-out/examples/models/llama -j16)
最後,將 llama 運行器二進制檔案推送並運行到您的 Android 裝置上。 請注意,您的裝置必須具有足夠的 GPU 記憶體才能執行模型。
adb push cmake-android-out/examples/models/llama/llama_main /data/local/tmp/llama_main
adb shell /data/local/tmp/llama_main \
--model_path=/data/local/tmp/vulkan_llama2.pte \
--tokenizer_path=/data/local/tmp/tokenizer.model \
--prompt "Hello"
請注意,由於降低的圖中存在大量委派 blobs,目前模型推論將非常緩慢,這需要為每個子圖在 GPU 之間進行傳輸。 隨著更多的模型可以降低到 Vulkan delegate,並且支持量化等技術,預計性能將會大幅提高。