Qwen3-Embedding国产化部署

admin13小时前河内机器人2

1. 背景

  • 最近一直在做ToG的项目,其中用到了语义检索,研发环境使用A40和vllm,即可轻松部署Qwen3-Embedding-8B,但客户环境要求国产化环境,因此探索Qwen3-Embedding-8B如何在国产化环境部署。

  • 实不相瞒,本来以为仅需半天搞定的事情,我居然耗费了3天半的时间(汗颜....),究其原因,主要是包含如下几个方面:

    • 研发环境没有国产化系统及显卡,也没有相关的部署经验,

    • 网上针对特定的300I Duo部署Qwen3-Embedding-8B的教程几乎没找到,多的是910系列。但客户只有Altas 300I Duo的环境。

    • 最初两天一直在探索vllm-ascend进行部署,结果现阶段版本仍不支持。

    • 最后一天转向MIS-TEI,才终于看到曙光。

  • 下面教程就是部署成功的完整流程,各位看官如有同样环境,无脑借鉴即可,省心省力。

2. 系统环境

  • 操作系统: 麒麟Kylin V10 (Sword)

  • 显卡型号: 8卡Altlas 300I Duo

  • 驱动版本: Ascend-hdk-310p-npu-driver_25.5.1_linux-aarch64.run

  • 固件版本: Ascend-hdk-310p-npu-firmware_7.8.0.6.201.run

  • CANN版本: Ascend-cann_8.5.0_linux-aarch64.run

  • 优化算子版本: Ascend-cann-310p-ops_8.5.0_linux-aarch64.run

3. 驱动安装

# 1. 创建用户及用户组sudo groupadd HwHiAiUser 
sudo useradd -g HwHiAiUser -d /home/HwHiAiUser -m -s /bin/bash HwHiAiUser# 2. 安装驱动(等待几分钟)sudo ./Ascend-hdk-310p-npu-driver_25.5.1_linux-aarch64.run --full --install-for-all --force
reboot # 重启npu-smi info # 驱动验证# 3. 安装固件sudo ./Ascend-hdk-310p-npu-firmware_7.8.0.6.201.run --full
reboot# 4. CANN驱动安装sudo ./Ascend-cann_8.5.0_linux-aarch64.run --install# 5. 安装优化算子驱动sudo ./Ascend-cann-310p-ops_8.5.0_linux-aarch64.run --install# 6. 设置驱动环境变量source /usr/local/Ascend/ascend-toolkit/set_env.shecho 'source /usr/local/Ascend/ascend-toolkit/set_env.sh' >> ~/.bashrc# 7. 验证驱动是否成功npu-smi info
python3 -c "import acl; print('ACL Load OK')"

4. Docker部署及TEI镜像拉取

# 联网环境进行拉取docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/mis-tei:7.3.0-300I-Duo-aarch64# 镜像打包及传输docker save swr.cn-south-1.myhuaweicloud.com/ascendhub/mis-tei:7.3.0-300I-Duo-aarch64 -o mis-tei.tar# 客户环境加载docker load -i mis-tei.tar# 模型下载Qwen3-Embedding-8B,直接通过ModelScope进行下载,此处省略其过程

5. 容器启动

  • 这块耗费的时间比较长,因为存在各种报错,最终才形成稳定版本

# 1. 编写/data/models/start_tei.sh的脚本#!/bin/bashsource /usr/local/Ascend/ascend-toolkit/set_env.shexport LD_PRELOAD=/usr/local/lib/python3.11/site-packages/scikit_learn.libs/libgomp-d22c30c5.so.1.0.0:/usr/lib/aarch64-linux-gnu/libgomp.so.1export PYTHONPATH=/usr/local/Ascend/mxRag-7.3.0/ops/transformer_adapter:$PYTHONPATHexport RAG_SDK_HOME=/usr/local/Ascend/mxRag-7.3.0export LD_LIBRARY_PATH=/usr/local/Ascend/nnal/atb/8.5.0/atb/cxx_abi_0/lib:/usr/local/Ascend/mxRag-7.3.0/ops/lib:$LD_LIBRARY_PATHPORT=${PORT:-8080}UDS_PATH=${UDS_PATH:-/tmp/text-embeddings-inference-server}DEVICE_ID=${ASCEND_VISIBLE_DEVICES:-0}export ASCEND_VISIBLE_DEVICES=$DEVICE_IDexport NPU_VISIBLE_DEVICES=$DEVICE_IDexport RANK=0export LOCAL_RANK=0exec /home/HwHiAiUser/.cargo/bin/text-embeddings-router \
  --model-id /home/HwHiAiUser/model/ \
  --hostname 0.0.0.0 \
  --port $PORT \
  --uds-path $UDS_PATH \
  --auto-truncate \
  --dtype float16 \
  --max-batch-tokens 16384  
# 2. 编写启动容器的脚本:此处8张卡上默认都启动了两个进程,总计16个进程(显卡资源需监测利用率)for i in $(seq 0 15); do
  docker stop tei-$i 2>/dev/null
  docker rm tei-$i 2>/dev/nulldonefor i in $(seq 0 15); do
  DEVICE=$((i % 8)) 
  PORT=$((8080 + i))
  UDS="/tmp/tei-server-$i"

  docker run -u root -d \
    -e ENABLE_BOOST=True \
    -e TEI_NPU_DEVICE=$DEVICE \
    -e PORT=$PORT \
    -e UDS_PATH=$UDS \
    --name=tei-$i \
    --net=host \
    --privileged \
    --device=/dev/davinci_manager \
    --device=/dev/hisi_hdc \
    --device=/dev/devmm_svm \
    --device=/dev/davinci$DEVICE \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro \
    -v /usr/local/sbin:/usr/local/sbin:ro \
    -v /data/models/Qwen3-Embedding-8B:/home/HwHiAiUser/model \
    -v /data/models/start_tei.sh:/start_tei.sh \
    -v /etc/hostname:/etc/hostname:ro \
    -v /etc/hosts:/etc/hosts:ro \
    --entrypoint /bin/bash \
    swr.cn-south-1.myhuaweicloud.com/ascendhub/mis-tei:7.3.0-300I-Duo-aarch64 \
    /start_tei.sh  echo "Started tei-$i on Device=$DEVICE PORT=$PORT"
  sleep 5done

6. nginx负载均衡转发

# 1. 镜像拉取docker pull docker.1ms.run/nginx:latest# 2. nginx配置文件mkdir -p /data/nginx/logscat > /data/nginx/tei.conf << 'EOF'upstream tei_cluster {
    least_conn;
    server 10.100.122.3:8080;
    server 10.100.122.3:8081;
    server 10.100.122.3:8082;
    server 10.100.122.3:8083;
    server 10.100.122.3:8084;
    server 10.100.122.3:8085;
    server 10.100.122.3:8086;
    server 10.100.122.3:8087;
    server 10.100.122.3:8088;
    server 10.100.122.3:8089;
    server 10.100.122.3:8090;
    server 10.100.122.3:8091;
    server 10.100.122.3:8092;
    server 10.100.122.3:8093;
    server 10.100.122.3:8094;
    server 10.100.122.3:8095;
    keepalive 32;
}

server {
    listen 8000;

    location / {
        proxy_pass http://tei_cluster;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_read_timeout 120s;
        proxy_connect_timeout 5s;
        proxy_send_timeout 120s;
    }

    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
}
EOF# 3. nginx容器启动docker run -d \
--name=nginx-tei \
--net=host \
-v /data/nginx/tei.conf:/etc/nginx/conf.d/tei.conf:ro \
-v /data/nginx/logs:/var/log/nginx \
docker.1ms.run/nginx:latest

7. 效果测试

# 效果测试,需要对比研发环境与客户环境两个Embedding模型输出向量的差异性。# 经实验测试,二者的精度在小数点后第4位,影响较小curl http://10.100.122.3:8000/embed -X POST -H "Content-Type: application/json" -d '{"inputs": ["hello", "你好"]}'

8. 思考

  • 刚开始使用了vllm-ascend,版本v0.11.0-310p-openeuler,vllm-ascend目前只是实验性质支持300I Duo,且大多数均是针对Qwen3系列文本生成模型,而非嵌入模型。

  • 启动容器,底层的各种算子不兼容。预计未来,开源社区会逐步支持,v0.14.0版本已开始逐步支撑300I Duo。

9. 参考


相关文章

FFmpeg关键结构体深度解析与实战应用

FFmpeg作为开源多媒体处理框架的基石,其核心结构体设计体现了模块化与高效性的完美平衡。本文聚焦五大关键结构体,结合源码分析与实战场景,揭示其在音视频处理管道中的协作机制。一、AVFormatCon...

.NET 10 新功能新增功能介绍:WebSocket 功能增强(一)

在 .NET 10 的更新中,WebSocket 功能得到了显著增强,为开发者提供了更强大、更灵活的实时通信能力。WebSocket 作为一种在单个 TCP 连接上进行全双工通信的协议,在现代 Web...

高光谱成像(四)最小噪声分数变换 MNF

在上一篇中,我们介绍了 PCA ,其通过寻找方差最大的方向来压缩数据维度,在保留主要信息结构的同时减少计算量。同时,我们也提到,PCA 是数据分析和机器学习领域中一种通用的高维数据...

人工智能之编程基础 Python 入门:第六章 基本数据类型(四)

引言:从中文思维到代码的桥梁在人工智能开发中,我们经常需要将自然语言描述转化为可执行的代码。如PandaCoder工具所演示的,当开发者用中文描述"用户管理服务"时,智能助手能自动...

解决 iOS 上 Swiper 滑动图片闪烁问题:原因分析与最有效的修复方式(一)

引言在移动端网页开发中,Swiper 作为一款功能强大且灵活的滑动组件库,广泛应用于图片轮播、内容滑动等场景。然而,许多开发者在 iOS 设备上使用 Swiper 时,都遇到了滑动过程中图片闪烁或白屏...

神秘序列——格雷码序列:数字世界的隐秘语言

在数字通信与计算机科学的浩瀚星空中,格雷码序列犹如一颗低调却璀璨的星辰,以其独特的二进制编码逻辑,悄然支撑着现代技术的精密运转。它不仅是数学与工程的完美交融,更是一把解开数字世界奥秘的钥匙。一、起源:...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。