使用 Vulkan 后端构建和运行 ExecuTorch¶
ExecuTorch Vulkan 委托是 ExecuTorch 的原生 GPU 委托。
如何使用部分 GPU 委托导出 Stories 110M 参数模型
如何在 Android 上执行部分委托模型
先决条件¶
请注意,以下所有步骤都应从 ExecuTorch 存储库中执行 root 目录,并假设您已完成设置 ExecuTorch 的 ExecuTorch 中。
您还应该参阅设置 ExecuTorch LLaMA Android 演示应用教程的先决条件部分,以安装指定版本的 Android NDK 和 Android SDK 的 SDK 中。
# Recommended version is Android NDK r25c.
export ANDROID_NDK=<path_to_ndk>
# Select an appropriate Android ABI
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
将 Stories 110M 模型降低为 Vulkan¶
注意
生成的模型将仅部分委托给 Vulkan 后端。在
特别地,只有二进制算术运算符 (、 、 、 ) 和矩阵乘法运算符 () 才会
通过 Vulkan 委托在 GPU 上执行。模型的其余部分将是
使用 Portable 运算符执行。这是因为 Vulkan 委托仍为
处于开发初期,目前的运维覆盖范围有限。aten.add
aten.sub
aten.mul
aten.div
aten.mm
首先,从 Github 下载和:stories110M.pt
tokenizer.model
wget "https://huggingface.co/karpathy/tinyllamas/resolve/main/stories110M.pt"
wget "https://raw.githubusercontent.com/karpathy/llama2.c/master/tokenizer.model"
接下来,创建 params 文件:
echo '{"dim": 768, "multiple_of": 32, "n_heads": 12, "n_layers": 12, "norm_eps": 1e-05, "vocab_size": 32000}' > params.json
然后,创建一个 tokenizer 二进制文件:
python -m examples.models.llama2.tokenizer.tokenizer -t tokenizer.model -o tokenizer.bin
最后,将文件导出到 ExecuTorch 程序中:stories110M.pt
python -m examples.models.llama2.export_llama -c stories110M.pt -p params.json --vulkan
作为最后一步的结果,应该已经创建了一个文件。vulkan_llama2.pte
将 tokenizer 二进制文件推送到您的 Android 设备上:vulkan_llama2.pte
adb mkdir /data/local/tmp/llama/
adb push tokenizer.bin /data/local/tmp/llama/
adb push vulkan_llama2.pte /data/local/tmp/llama/
在 Android 上构建并运行 LLaMA 运行程序二进制文件¶
首先,构建并安装 ExecuTorch 库,然后构建 LLaMA 运行程序 二进制文件。
(rm -rf 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_MODULE=ON \
-DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
-DEXECUTORCH_BUILD_VULKAN=ON \
-DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=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/llama2 && \
cmake examples/models/llama2 \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=$ANDROID_ABI \
-DCMAKE_INSTALL_PREFIX=cmake-android-out \
-DPYTHON_EXECUTABLE=python \
-Bcmake-android-out/examples/models/llama2 && \
cmake --build cmake-android-out/examples/models/llama2 -j16)
最后,在您的 Android 设备上推送并运行 llama runner 二进制文件。
adb push cmake-android-out/examples/models/llama2/llama_main /data/local/tmp/llama_main
adb shell /data/local/tmp/llama_main \
--model_path=/data/local/tmp/llama/vulkan_llama2.pte \
--tokenizer_path=/data/local/tmp/llama/tokenizer.bin \
--prompt "hi" \--temperature=0
将生成以下输出:
hippo named Hippy lived in a big pond. Hippy was a very happy hippo. He liked to play...
使用 LLaMA Android 演示应用程序运行¶
也可以在 LLaMA 中运行部分委托的 Vulkan 模型 Android 演示应用程序。
首先,对 Android 应用程序设置脚本进行一些修改,以确保 Vulkan 后端是在构建和安装 ExecuTorch 库时构建的:
# Run from executorch root directory. You can also edit this in a code editor
sed -i 's/-DEXECUTORCH_BUILD_XNNPACK=ON/-DEXECUTORCH_BUILD_XNNPACK=ON -DEXECUTORCH_BUILD_VULKAN=ON/g' examples/demo-apps/android/LlamaDemo/setup.sh
然后,按照设置 ExecuTorch LLaMA Android 演示应用程序中的说明,在您的 Android 设备上构建和运行演示应用程序。一旦应用程序
启动时,您可以使用该 App 加载并运行模型。vulkan_llama2.pte