使用高通 AI 引擎直连后端构建和运行 Llama 3 8B Instruct¶
本教程演示了如何将 Llama 3 8B Instruct 导出到高通 AI 引擎直连后端,并在高通设备上运行模型。
先决条件¶
如果尚未通过以下步骤设置您的 ExecuTorch 存储库和环境 设置 ExecuTorch 来设置存储库和开发环境。
阅读 使用高通 AI 引擎直连后端构建和运行 ExecuTorch 页面 以了解如何在高通设备上使用高通 AI 引擎直连后端导出和运行模型。
按照 executorch llama 的自述文件 了解如何在移动设备上通过 ExecuTorch 运行 llama 模型。
具有 16GB RAM 的高通设备
我们正在不断优化内存使用,以确保与内存较低的设备兼容。
高通 AI 引擎直连 SDK 的版本为 2.26.0 或更高版本。
说明¶
步骤 1:从 Spin Quant 中准备模型的检查点和优化矩阵¶
对于 Llama 3 分词器和检查点,请参考 https://github.com/meta-llama/llama-models/blob/main/README.md 以获取有关如何下载
tokenizer.model
、consolidated.00.pth
和params.json
的更多说明。要获取优化矩阵,请参考 GitHub 上的 Spin Quant。您可以在量化模型部分下载优化的旋转矩阵。请选择 **LLaMA-3-8B/8B_W4A16KV16_lr_1.5_seed_0**。
步骤 2:使用高通 AI 引擎直连后端导出到 ExecuTorch¶
在设备上部署大型语言模型(如 Llama 3)会带来以下挑战
模型大小太大,无法容纳在设备内存中进行推理。
模型加载和推理时间过长。
量化难度大。
为了解决这些挑战,我们实施了以下解决方案
使用
--pt2e_quantize qnn_16a4w
对激活和权重进行量化,从而减小磁盘上的模型大小,并缓解推理期间的内存压力。使用
--num_sharding 8
将模型分成多个子部分。执行图转换,将运算转换为或分解为更适合加速器的运算。
使用
--optimized_rotation_path <path_to_optimized_matrix>
应用 Spin Quant 的 R1 和 R2 以提高精度。使用
--calibration_data "<|start_header_id|>system<|end_header_id|..."
确保在 Llama 3 8B Instruct 的量化过程中,校准包括提示模板中的特殊标记。有关提示模板的更多详细信息,请参考 meta llama3 instruct 的模型卡片。
要使用高通 AI 引擎直连后端导出 Llama 3 8B Instruct,请确保以下事项
主机具有超过 100GB 的内存(RAM + 交换空间)。
整个过程需要几个小时。
# Please note that calibration_data must include the prompt template for special tokens.
python -m examples.models.llama2.export_llama -t <path_to_tokenizer.model>
llama3/Meta-Llama-3-8B-Instruct/tokenizer.model -p <path_to_params.json> -c <path_to_checkpoint_for_Meta-Llama-3-8B-Instruct> --use_kv_cache --qnn --pt2e_quantize qnn_16a4w --disable_dynamic_shape --num_sharding 8 --calibration_tasks wikitext --calibration_limit 1 --calibration_seq_length 128 --optimized_rotation_path <path_to_optimized_matrix> --calibration_data "<|start_header_id|>system<|end_header_id|>\n\nYou are a funny chatbot.<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nCould you tell me about Facebook?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n"
步骤 3:在具有高通 SoC 的 Android 智能手机上调用运行时¶
为 Android 构建带有高通 AI 引擎直连后端的 executorch
cmake \ -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake" \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-23 \ -DCMAKE_INSTALL_PREFIX=cmake-android-out \ -DCMAKE_BUILD_TYPE=Release \ -DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \ -DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \ -DEXECUTORCH_BUILD_EXTENSION_TENSOR=ON \ -DEXECUTORCH_BUILD_QNN=ON \ -DQNN_SDK_ROOT=${QNN_SDK_ROOT} \ -DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \ -DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON \ -DEXECUTORCH_BUILD_KERNELS_CUSTOM=ON \ -Bcmake-android-out . cmake --build cmake-android-out -j16 --target install --config Release
为 Android 构建 llama 运行器
cmake \
-DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK_ROOT}"/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-23 \
-DCMAKE_INSTALL_PREFIX=cmake-android-out \
-DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=python \
-DEXECUTORCH_BUILD_QNN=ON \
-DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
-DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON \
-DEXECUTORCH_BUILD_KERNELS_CUSTOM=ON \
-Bcmake-android-out/examples/models/llama2 examples/models/llama2
cmake --build cmake-android-out/examples/models/llama2 -j16 --config Release
通过 adb shell 在 Android 上运行 *先决条件*:确保您通过手机的开发者选项启用了 USB 调试
3.1 连接您的 Android 手机
3.2 我们需要将所需的 QNN 库推送到设备。
# make sure you have write-permission on below path.
DEVICE_DIR=/data/local/tmp/llama
adb shell mkdir -p ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtp.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnSystem.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpV69Stub.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpV73Stub.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpV75Stub.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/hexagon-v69/unsigned/libQnnHtpV69Skel.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/hexagon-v73/unsigned/libQnnHtpV73Skel.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/hexagon-v75/unsigned/libQnnHtpV75Skel.so ${DEVICE_DIR}
3.3 将模型、分词器和 llama 运行器二进制文件上传到手机
adb push <model.pte> ${DEVICE_DIR}
adb push <tokenizer.model> ${DEVICE_DIR}
adb push cmake-android-out/lib/libqnn_executorch_backend.so ${DEVICE_DIR}
adb push cmake-out-android/examples/models/llama2/llama_main ${DEVICE_DIR}
3.4 运行模型
adb shell "cd ${DEVICE_DIR} && ./llama_main --model_path <model.pte> --tokenizer_path <tokenizer.model> --prompt \"<|start_header_id|>system<|end_header_id|>\n\nYou are a funny chatbot.<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nCould you tell me about Facebook?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n\" --seq_len 128"
您应该看到以下消息
<|start_header_id|>system<|end_header_id|>\n\nYou are a funny chatbot.<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nCould you tell me about Facebook?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\nHello! I'd be delighted to chat with you about Facebook. Facebook is a social media platform that was created in 2004 by Mark Zuckerberg and his colleagues while he was a student at Harvard University. It was initially called "Facemaker" but later changed to Facebook, which is a combination of the words "face" and "book". The platform was initially intended for people to share their thoughts and share information with their friends, but it quickly grew to become one of the
未来计划¶
提高 Llama 3 Instruct 的性能
减少推理期间的内存压力,以支持 12GB 高通设备
支持更多 LLM
常见问题解答¶
如果您在重现本教程时遇到任何问题,请在 ExecuTorch 存储库上提交一个 GitHub 问题,并使用 #qcom_aisw
标签