Qwen3-embedding-0.6B 使用指南

Qwen3-Reranker-0.6B 使用指南 - 开发者文档

本项目基于 ai-engine-direct-helper (QAI_AppBuilder)
           https://github.com/quic/ai-engine-direct-helper.git

模型下载地址 (包含对应的上下文二进制文件)
           https://www.aidevhome.com/?id=51

简介

本文档旨在为开发者提供部署和使用 Qwen3-embedding-0.6B 模型进行文本嵌入与相关性判定的详细操作指南。文档涵盖了在 Windows 平台与 Android 平台上的环境配置、模型下载、依赖安装及最终的推理测试流程。

一、 Windows 平台使用

1.1 安装 Python 3.12 AMD 版本

在运行模型前,首先需要安装兼容的 Python 环境。请确保下载并安装 Python 3.12 的 AMD64 (Windows x86-64) 版本。

提示: 安装 Python 时,请务必勾选 Add Python to PATH 选项,以便在命令行中能够直接调用 Python 及 pip 命令。

1.2 下载并解压模型

  1. Qwen3-embeding-0.6b 8380模型下载

获取 Qwen3-embeding-0.6B 模型文件后,请先将压缩包解压到您指定的本地工作目录。解压完成后,打开命令提示符(CMD)或 PowerShell,并使用 cd 命令切换到该模型目录下。

cd /d 您的模型解压目录路径

1.3 安装环境并验证

1.3.1 安装环境

在已进入的模型目录中,请依次运行以下命令来安装相关的运行时依赖。建议先安装 QAI AppBuilder 的底层库,然后再安装其余的环境依赖。

pip install qai_appbuilder-2.38.0-cp312-cp312-win_amd64.whl
# 2. 再安装其他依赖
pip install -r requirements.txt

1.3.2 进行测试

环境配置完成后,您可以通过运行演示脚本来验证嵌入模型是否工作正常。

执行测试命令:

python qwen3_embedding_qnn.py

二、 安卓平台使用

2.1 下载模型

  1. Qwen3-embedding-0.6b 8750模型下载

  2. Qwen3-embedding-0.6b 8850模型下载

每个压缩包下面包括模型、后端库、以及java文件,以及QNN示例推理

  1. 上传文件:将 解压后文件上传到设备,配置环境。

    adb push qwen3-embeding-8750-2.38 /data/local/tmp
    
    cd /data/local/tmp/qwen3-embeding-8750-2.38/qai_libs
    export LD_LIBRARY_PATH=$PWD
    export ADSP_LIBRARY_PATH=$PWD
    cd ..
    chmod +x qnn-net-run
  2. 执行推理

     ./qnn-net-run --retrieve_context qnn_bianry_qwen3_embedding_1_of_1_quantized.serialized.bin  --input_list input_list_qwen3_embedding_1_of_1.txt --output_dir outputdir --backend libQnnHtp.so --config_file HtpConfigFile_API.json --log_level error

2.2 项目编译

注意: 整体的编译后端库流程,请查看项目代码目录:ai-engine-direct-helper-main\samples\android

2.2.1 模型前处理和后处理

基于 Java 的模型前处理和后处理流程封装在压缩包的 Qwen3EmbeddingProcessor.java 文件中,典型调用方式如下:

public class Qwen3EmbeddingProcessor {
    private static final int CONTEXT_LENGTH = 512;
    private static final int HIDDEN_SIZE = 1024;
    private static final int HEAD_DIM = 64;
    private static final double ROPE_THETA = 1000000.0;
    private static final int PAD_TOKEN = 151643;

    // ==================== 前处理 ====================
    // 输入:tokenIds, attentionMask
    // 输出:inputIds, ropeCos, ropeSin, maskFp16
    public float[] preprocessInputIds(int[] tokenIds) {
        float[] inputIds = new float[CONTEXT_LENGTH];
        int pad = CONTEXT_LENGTH - tokenIds.length;
        for (int i = 0; i < pad; i++) inputIds[i] = PAD_TOKEN;
        for (int i = 0; i < tokenIds.length; i++) {
            inputIds[pad + i] = tokenIds[i];
        }
        return inputIds;
    }

    public void buildRoPE(float[] cos, float[] sin) {
        double[] invFreq = new double[HEAD_DIM];
        for (int d = 0; d < HEAD_DIM; d++) {
            invFreq[d] = 1.0 / Math.pow(ROPE_THETA, (double) d / HEAD_DIM);
        }
        for (int pos = 0; pos < CONTEXT_LENGTH; pos++) {
            for (int d = 0; d < HEAD_DIM; d++) {
                double ang = pos * invFreq[d];
                cos[pos * HEAD_DIM + d] = (float) Math.cos(ang);
                sin[pos * HEAD_DIM + d] = (float) Math.sin(ang);
            }
        }
    }

    // ==================== 后处理 ====================
    public float[] extractEmbedding(float[] hiddenStates) {
        float[] embed = new float[HIDDEN_SIZE];
        int offset = (CONTEXT_LENGTH - 1) * HIDDEN_SIZE;
        System.arraycopy(hiddenStates, offset, embed, 0, HIDDEN_SIZE);

        // L2归一化
        double norm = 0;
        for (float v : embed) norm += v * v;
        norm = Math.sqrt(norm);
        if (norm > 1e-12) {
            for (int i = 0; i < HIDDEN_SIZE; i++) embed[i] /= norm;
        }
        return embed;
    }
}

2.2.2 模型调用推理

在 JNI 层,使用 C++ 进行模型初始化与推理的核心代码示例如下:

Java_com_example_DDColor_MainActivity_DDColor(...) {
float* inputBuffer = (float*)env->GetDirectBufferAddress(j_inputBuffer);
float* outputBuffer = (float*)env->GetDirectBufferAddress(j_outputBuffer);
// 1. 指定后端 (例如:libQnnHtp.so 表示在DSP上运行)
std::string backend_lib_path = libs_dir + "/libQnnHtp.so";
std::string system_lib_path = libs_dir + "/libQnnSystem.so";
// 2. 初始化模型
libAppBuilder.ModelInitialize(MODEL_NAME, model_path, backend_lib_path, ...);
// 3. 执行推理
libAppBuilder.ModelInference(MODEL_NAME, ...);
// 4. 拷贝结果
memcpy(outputBuffer, outputBuffers.at(0), outputSize[0]);
// ... 释放资源 ...
return 0;
}