高通 Gen AI 推理扩展 (GENIE)(4):嵌入教程和Engine
本博客介绍与 GenieEmbedding 功能相关的教程
目标型号:BGE-Large
设置
- python
如果使用 QNN GenAiTransformer 后端,还请确保遵循此处的 Python 设置: <QNN_SDK_ROOT>/docs/QNN/general/setup.html 。此外, qnn-genai-transformer-composer 工具将需要安装特定版本的软件包,如下表所述。

- Linux
可以通过调用 <QNN_SDK_ROOT>/bin/envsetup.sh 脚本来设置用户环境。
在 Linux 主机上打开命令 shell 并运行:
# Replace <QNN_SDK_ROOT> with path where QNN SDK was installed
source <QNN_SDK_ROOT>/bin/envsetup.sh
这将设置/更新以下环境变量:
- QNN_SDK_ROOT
- PYTHON PATH
- PATH
- LD_LIBRARY_PATH
${QNN_SDK_ROOT} 表示 Qualcomm® AI Engine Direct SDK 根目录的完整路径。
- Windows
用户环境可以通过调用 <QNN_SDK_ROOT>/bin/envsetup.ps1 脚本来设置。
首先,以管理员身份打开 Developer PowerShell for VS2022 。
Set-ExecutionPolicy RemoteSigned
然后,执行以下脚本。
# Replace <QNN_SDK_ROOT> with path where QNN SDK was installed
> & "<QNN_SDK_ROOT>\bin\envsetup.ps1"
这将设置/更新以下环境变量:
- QNN_SDK_ROOT
- PATH
- PYTHON PATH
${QNN_SDK_ROOT} 表示 Qualcomm® AI Engine Direct SDK 根目录的完整路径。
目标后端:QNN HTP
有关字段和内容的详细信息,请参阅 Genie Embedding JSON 配置字符串 他们的意思是。示例 model_config 可以在以下位置找到 ${QNN_SDK_ROOT}/examples/Genie/configs/bge/bge-large-htp.json 。请注意,分词器路径和上下文二进制字段需要根据您的实际准备步骤进行更新。
注意
使用常规 QNN 流获取 BGE 模型所需的上下文二进制文件。
要在 QNN HTP 后端运行,请在 android 上打开命令 shell 并运行以下命令。这假设已经设置了 HTP 架构(例如,ARCH=79)。请对库、二进制文件、分词器和 backend_ext_config 使用上述步骤。
注意
结果将保存在工作目录 output.raw 文件中。
adb shell mkdir -p /data/local/tmp/
adb push <path to bge-large-htp.json> /data/local/tmp/
# open adb shell
adb shell
export LD_LIBRARY_PATH=/data/local/tmp/
export PATH=$LD_LIBRARY_PATH:$PATH
cd $LD_LIBRARY_PATH
./genie-t2e-run -c <path to bge-large-htp.json>
-p "What is the most popular cookie in the world?"
目标后端:QNN Gen AI Transformer
- 下载模型
从 https://huggingface.co/BAAI/bge-large-en-v1.5 下载 bge-large-en-v1.5
- 模型转换
以下部分演示如何使用 qnn-genai-transformer-composer 的 Changeer-Composer 中。
-
Linux 和 Android 上的模型转换
-
在 Linux 主机上打开命令 shell 并运行:
# Make sure environment is setup as per instructions, or can cd into bin folder on Linux host
cd ${QNN_SDK_ROOT}/bin/x86_64-linux-clang/
./qnn-genai-transformer-composer --outfile <output filename with complete path>.bin
--model <path-to-downloaded-BGE-model-directory>
- 模型配置
有关字段和内容的详细信息,请参阅 Genie Embedding JSON 配置字符串 他们的意思是。示例模型配置可以在以下位置找到: ${QNN_SDK_ROOT}/examples/Genie/configs/bge-large-genaitransformer.json 。请注意,分词器路径和模型箱字段需要根据您的实际准备步骤进行更新。
- 模型执行
以下部分演示了如何使用 QNN GenAITransformer 后端运行模型 精灵-t2e-运行 。
注意
结果将保存在工作目录 output.raw 文件中。
- Linux 上的模型执行
在 Linux 主机上打开命令 shell 并运行:
# Make sure environment is setup as per instructions, or can cd into bin folder on Linux host
cd <QNN_SDK_ROOT>\bin\x86_64-linux-clang
./genie-t2e-run -c <path to bge-large-genaitransformer.json>
-p "Tell me about Qualcomm"
- Android 上的模型执行
在 Linux 主机上打开命令 shell 并运行:
# make sure a test device is connected
adb devices
# push artifacts to device
adb push ${QNN_SDK_ROOT}/bin/aarch64-android/genie-t2e-run /data/local/tmp/
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libGenie.so /data/local/tmp/
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnGenAiTransformer.so /data/local/tmp/
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnGenAiTransformerCpuOpPkg.so /data/local/tmp/
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnGenAiTransformerModel.so /data/local/tmp/
adb push <path to tokenizer.json> /data/local/tmp/
adb push <path to bge-large-genaitransformer.json> /data/local/tmp/
adb push <path to model bin file, e.g. <path-to-downloaded-BGE-model-directory>/model.bin> /data/local/tmp/
# open adb shell
adb shell
export LD_LIBRARY_PATH=/data/local/tmp/
export PATH=$LD_LIBRARY_PATH:$PATH
cd $LD_LIBRARY_PATH
./genie-t2e-run -c <path to bge-large-genaitransformer.json>
-p "Tell me about Qualcomm"
Genie Engine
Genie Engine API 提供了一种实例化独立引擎的方法,该引擎稍后可以绑定到活动对话。这有助于在活动对话框中切换引擎。
可以通过在 <ENGINE_TYPE>genie-t2t-run 中使用“–allow_engine_switch , ”来练习发动机切换。切换引擎后,将按给定提示查询对话框。
注意
目前,引擎切换仅在多引擎对话框中受支持,并且只能切换“草稿”引擎。
有关如何执行引擎切换 API 的示例
// Create Dialog Config
GenieDialogConfig_Handle_t dialogConfigHandle = NULL;
GenieDialogConfig_createFromJson(dialogConfigStr, &dialogConfigHandle);
// Create Dialog
GenieDialog_Handle_t dialogHandle = NULL;
GenieDialog_create(dialogConfigHandle, &dialogHandle);
// Create Engine Config
GenieEngineConfig_Handle_t engineConfigHandle = NULL;
GenieEngineConfig_createFromJson(engineConfigStr, &engineConfigHandle);
//Create Engine
GenieEngine_Handle_t engineHandle = NULL;
GenieEngine_create(engineConfigHandle, &engineHandle);
//Get old Engine from Dialog, If not called, then the engine will be unloaded when switching occurs.
GenieEngine_Handle_t dialogEngineHandle = NULL;
std::string engineType = "draft";
// Every call to getEngine API will increase the internal reference count of the engine and Engine will only
// be freed once reference count reached zero.
GenieDialog_getEngine(dialogHandle, engineType.c_str(), &dialogEngineHandle);
// Bind Engine Handle to active Dialog
GenieDialog_bindEngine(dialogHandle, engineType.c_str(), engineHandle);
// In case dialog had previous query, need to flush the KV cache also.
GenieDialog_reset(dialogHandle);
// Run Dialog Query API
GenieDialog_query(dialogHandle, promptStr, GenieDialog_SentenceCode_t::GENIE_DIALOG_SENTENCE_COMPLETE, queryCallback);
// Free engine Handle, this will not free engine if ref count is non zero even after the call.
GenieEngine_free(engineHandle);
// Free old Dialog engine, as it is not associated with the dialog anymore.
GenieEngine_free(dialogEngineHandle);
// Free Dialog
GenieDialog_free(dialogHandle);
更多推荐



所有评论(0)