Qwen3-Embedding國產(chǎn)化部署

歡迎關(guān)注公眾號(hào):愛學(xué)習(xí)的妮妮qiang

1. 背景

  • 最近一直在做ToG的項(xiàng)目,其中用到了語義檢索,研發(fā)環(huán)境使用A40和vllm,即可輕松部署Qwen3-Embedding-8B,但客戶環(huán)境要求國產(chǎn)化環(huán)境,因此探索Qwen3-Embedding-8B如何在國產(chǎn)化環(huán)境部署。
  • 實(shí)不相瞞,本來以為僅需半天搞定的事情,我居然耗費(fèi)了3天半的時(shí)間(汗顏....),究其原因,主要是包含如下幾個(gè)方面:
    • 研發(fā)環(huán)境沒有國產(chǎn)化系統(tǒng)及顯卡,也沒有相關(guān)的部署經(jīng)驗(yàn),
    • 網(wǎng)上針對(duì)特定的300I Duo部署Qwen3-Embedding-8B的教程幾乎沒找到,多的是910系列。但客戶只有Altas 300I Duo的環(huán)境。
    • 最初兩天一直在探索vllm-ascend進(jìn)行部署,結(jié)果現(xiàn)階段版本仍不支持。
    • 最后一天轉(zhuǎn)向MIS-TEI,才終于看到曙光。
  • 下面教程就是部署成功的完整流程,各位看官如有同樣環(huán)境,無腦借鑒即可,省心省力。

2. 系統(tǒng)環(huán)境

  • 操作系統(tǒng): 麒麟Kylin V10 (Sword)
  • 顯卡型號(hào): 8卡Altlas 300I Duo
  • 驅(qū)動(dòng)版本: 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
  • 優(yōu)化算子版本: Ascend-cann-310p-ops_8.5.0_linux-aarch64.run

3. 驅(qū)動(dòng)安裝

# 1. 創(chuàng)建用戶及用戶組
sudo groupadd HwHiAiUser 
sudo useradd -g HwHiAiUser -d /home/HwHiAiUser -m -s /bin/bash HwHiAiUser

# 2. 安裝驅(qū)動(dòng)(等待幾分鐘)
sudo ./Ascend-hdk-310p-npu-driver_25.5.1_linux-aarch64.run --full --install-for-all --force
reboot # 重啟
npu-smi info # 驅(qū)動(dòng)驗(yàn)證

# 3. 安裝固件
sudo ./Ascend-hdk-310p-npu-firmware_7.8.0.6.201.run --full
reboot

# 4. CANN驅(qū)動(dòng)安裝
sudo ./Ascend-cann_8.5.0_linux-aarch64.run --install

# 5. 安裝優(yōu)化算子驅(qū)動(dòng)
sudo ./Ascend-cann-310p-ops_8.5.0_linux-aarch64.run --install

# 6. 設(shè)置驅(qū)動(dòng)環(huán)境變量
source /usr/local/Ascend/ascend-toolkit/set_env.sh
echo 'source /usr/local/Ascend/ascend-toolkit/set_env.sh' >> ~/.bashrc

# 7. 驗(yàn)證驅(qū)動(dòng)是否成功
npu-smi info
python3 -c "import acl; print('ACL Load OK')"

4. Docker部署及TEI鏡像拉取

# 聯(lián)網(wǎng)環(huán)境進(jìn)行拉取
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

# 客戶環(huán)境加載
docker load -i mis-tei.tar

# 模型下載Qwen3-Embedding-8B,直接通過ModelScope進(jìn)行下載,此處省略其過程

5. 容器啟動(dòng)

  • 這塊耗費(fèi)的時(shí)間比較長,因?yàn)榇嬖诟鞣N報(bào)錯(cuò),最終才形成穩(wěn)定版本
# 1. 編寫/data/models/start_tei.sh的腳本
#!/bin/bash
source /usr/local/Ascend/ascend-toolkit/set_env.sh

export 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.1
export PYTHONPATH=/usr/local/Ascend/mxRag-7.3.0/ops/transformer_adapter:$PYTHONPATH
export RAG_SDK_HOME=/usr/local/Ascend/mxRag-7.3.0
export 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_PATH

PORT=${PORT:-8080}
UDS_PATH=${UDS_PATH:-/tmp/text-embeddings-inference-server}
DEVICE_ID=${ASCEND_VISIBLE_DEVICES:-0}

export ASCEND_VISIBLE_DEVICES=$DEVICE_ID
export NPU_VISIBLE_DEVICES=$DEVICE_ID

export RANK=0
export LOCAL_RANK=0

exec /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. 編寫啟動(dòng)容器的腳本:此處8張卡上默認(rèn)都啟動(dòng)了兩個(gè)進(jìn)程,總計(jì)16個(gè)進(jìn)程(顯卡資源需監(jiān)測利用率)
for i in $(seq 0 15); do
  docker stop tei-$i 2>/dev/null
  docker rm tei-$i 2>/dev/null
done

for 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 5
done

6. nginx負(fù)載均衡轉(zhuǎn)發(fā)

# 1. 鏡像拉取
docker pull docker.1ms.run/nginx:latest

# 2. nginx配置文件
mkdir -p /data/nginx/logs
cat > /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容器啟動(dòng)
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. 效果測試

# 效果測試,需要對(duì)比研發(fā)環(huán)境與客戶環(huán)境兩個(gè)Embedding模型輸出向量的差異性。
# 經(jīng)實(shí)驗(yàn)測試,二者的精度在小數(shù)點(diǎn)后第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目前只是實(shí)驗(yàn)性質(zhì)支持300I Duo,且大多數(shù)均是針對(duì)Qwen3系列文本生成模型,而非嵌入模型。
  • 啟動(dòng)容器,底層的各種算子不兼容。預(yù)計(jì)未來,開源社區(qū)會(huì)逐步支持,v0.14.0版本已開始逐步支撐300I Duo。

9. 參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容