找回密码
 立即注册
首页 业界区 业界 离线环境下的AI模型部署实战:基于Xinference搭建嵌入、 ...

离线环境下的AI模型部署实战:基于Xinference搭建嵌入、重排与语音处理平台

盗衍 2025-7-17 10:04:39
1. 引言:为什么选择离线部署

在当今AI技术快速发展的时代,许多企业面临着数据安全与合规性的严格要求,特别是在金融、医疗和政府等领域,离线部署AI模型成为刚需。本文将详细介绍如何利用Xinference框架在完全离线的环境中部署四种核心AI能力:文本嵌入(Embedding)、重排序(Reranker)、语音识别(STT)和语音合成(TTS)。
2. 方案概述

离线部署方案具有以下特点:

  • ​​全流程离线​​:服务部署完全脱离互联网;
  • ​​一键式部署​​:通过脚本自动化完成复杂配置;
  • ​​资源可控​​:精确分配GPU资源,避免冲突;
  • ​​模型灵活管理​​:支持按需插拔不同模型。
3. 准备工作

3.1 资源下载(联网机器)

首先需要在可联网的机器上准备所需资源:
  1. 拉取Xinference官方镜像
  2. docker pull xprobe/xinference:latest
  3. # 保存为离线包
  4. docker save xprobe/xinference:latest -o xinference-image.tar
  5. # 下载所需模型(登录魔塔,根据需求搜索模型,搜索后点击目标模型,右侧下载模型)
  6. modelscope download --model maidalun/bce-embedding-base_v1
  7. modelscope download --model maidalun/bce-reranker-base_v1
  8. modelscope download --model iic/CosyVoice-300M
  9. modelscope download --model iic/SenseVoiceSmall
复制代码
模型会默认下载到/root/.cache/modelscope/hub/models/路径下:
  1. ├── iic/CosyVoice-300M
  2. ├── iic/SenseVoiceSmall
  3. ├── maidalun/bce-embedding-base_v1
  4. └── maidalun/bce-reranker-base_v1
复制代码
3.2 离线包目录结构规划
  1. model_services/
  2. ├── docker/
  3. │   ├── images/xinference-image.tar
  4. │   └── docker-compose.yaml
  5. ├── models/
  6. │   ├── bce-embedding-base_v1
  7. │   ├── bce-reranker-base_v1
  8. │   ├── CosyVoice-300M
  9. │   └── SenseVoiceSmall
  10. ├── config.ini
  11. └── install.sh 
复制代码
3.2.1. 配置文件(config.ini)
  1. [XINFERENCE]
  2. # 指定Xinference服务可用的GPU设备ID(逗号分隔多个ID,如"0,1")
  3. # 注意:实际GPU编号需与服务器物理设备一致,可通过`nvidia-smi -L`查看
  4. XINFERENCE_GPUS="0,1"  
  5. # 模型挂载路径
  6. MODELS_VOLUMES_DIRECTORY=/data/docker_models
  7. [EMBEDDING]
  8. # 是否启用嵌入模型自动安装(true/true)
  9. EMBEDDING_INSTALL_ENABLE=true
  10. # 嵌入模型运行时绑定的GPU设备编号
  11. # 必须存在于XINFERENCE_GPUS定义的可用设备列表中
  12. # 示例:若XINFERENCE_GPUS="1",则此处只能填1
  13. EMBEDDING_GPU=0
  14. [RERANKER]
  15. # 是否启用重排序模型自动安装(true/true)
  16. RERANKER_INSTALL_ENABLE=true
  17. # 重排序模型绑定的GPU设备编号
  18. # 需与XINFERENCE_GPUS定义的设备一致
  19. RERANKER_GPU=0
  20. [TTS]
  21. # 是否启用语音合成(TTS)模型安装(true/true)
  22. TTS_INSTALL_ENABLE=true
  23. # TTS模型绑定的GPU设备编号
  24. # 若与嵌入模型共用GPU,需确保总显存不超限
  25. TTS_GPU=0
  26. [STT]
  27. # 是否启用语音识别(STT)模型安装(true/true)
  28. STT_INSTALL_ENABLE=true
  29. # STT模型绑定的GPU设备编号
  30. # 语音识别通常需要更多显存,建议独占GPU
  31. STT_GPU=1
复制代码
关键配置说明​​:

  • GPU分配策略:语音识别模型通常需要更多显存,建议独占GPU
  • 模型路径:确保容器内外的路径映射正确
  • 启用标志:可灵活控制哪些模型需要加载
3.2.2. Docker编排文件(docker-compose.yaml)
  1. version: "3.3"
  2. services:
  3.   xinference:
  4.     image: xprobe/xinference:latest
  5.     container_name: xinference
  6.     restart: unless-stopped
  7.     command: ["xinference-local", "-H", "0.0.0.0"]  # 启动命令
  8.     ports:
  9.       - "9997:9997"  # 默认API端口
  10.     healthcheck:
  11.       test: ["CMD", "curl", "-f", "http://localhost:9997"]
  12.       interval: 10s
  13.       timeout: 5s
  14.       retries: 10
  15.       start_period: 30s
  16.     environment:
  17.       - XINFERENCE_GPUS=${XINFERENCE_GPUS:-"0"}  # 从环境变量读取GPU ID,默认使用GPU 0
  18.     volumes:
  19.       - ${MODELS_VOLUMES_DIRECTORY}:/root/.xinference/models  # 模型数据持久化
  20.     deploy:
  21.       resources:
  22.         reservations:
  23.           devices:
  24.             - driver: nvidia
  25.               capabilities: [gpu]
  26.               device_ids: ["0,1"]  
复制代码
3.2.3. 自动化部署脚本
  1. #! /bin/bash
  2. #-----------------------------------------------------------
  3. # 模型安装配置脚本
  4. # 1.加载config.ini配置文件
  5. # 2.拷贝模型文件到模型挂载路径
  6. # 3.解压xinference镜像并运行xinference容器
  7. # 4.加载模型
  8. # 5.查看模型状态
  9. #-----------------------------------------------------------
  10. # 加载config.ini配置文件
  11. while IFS='=' read -r key value || [[ -n "$key" ]]; do
  12.     # 修剪 key 和 value 的首尾空格和换行符
  13.     key=$(echo "$key" | tr -d '\r\n' | xargs)
  14.     value=$(echo "$value" | tr -d '\r\n' | xargs)
  15.     # 跳过空行、注释行(以#开头)或段标记(如[section])
  16.     if [[ "$key" = "" || "$key" =~ ^# || "$key" =~ ^\[.*\] ]]; then
  17.         continue
  18.     fi
  19.     export "$key=$value"
  20. done < config.ini
  21. # 创建并验证目标目录
  22. if [ ! -d "${MODELS_VOLUMES_DIRECTORY}" ]; then
  23.     echo "创建模型目录: ${MODELS_VOLUMES_DIRECTORY}"
  24.     mkdir -p "${MODELS_VOLUMES_DIRECTORY}" || {
  25.         echo "错误:无法创建目录 ${MODELS_VOLUMES_DIRECTORY}"
  26.         exit 1
  27.     }
  28. fi
  29. # 拷贝模型文件到模型挂载路径
  30. #cp -r models/* ${MODELS_VOLUMES_DIRECTORY}
  31. # 解压xinference容器镜像
  32. #docker load < docker/images/xinference-image.tar
  33. # 运行xinference容器
  34. docker-compose -f ./docker/docker-compose.yaml up -d
  35. while true; do
  36.   status=$(docker inspect --format='{{.State.Health.Status}}' xinference)
  37.   if [ "$status" = "healthy" ]; then
  38.     break
  39.   fi
  40.   echo "等待Xinference健康状态... 当前状态: $status"
  41.   sleep 10
  42. done
  43. echo "加载模型"
  44. # 函数:检查模型是否已注册
  45. function is_model_registered() {
  46.     local model_name="$1"
  47.     docker exec xinference xinference list | grep -q "$model_name"
  48. }
  49. if [[ "${EMBEDDING_INSTALL_ENABLE}" = "true" ]] ; then
  50.     MODEL_NAME="bce-embedding-base_v1"
  51.     MODEL_TYPE="embedding"
  52.     if ! is_model_registered "$MODEL_NAME"; then
  53.         echo "启动嵌入模型: ${MODEL_NAME}"
  54.         docker exec xinference xinference launch \
  55.             --model-name "$MODEL_NAME" \
  56.             --model-type "$MODEL_TYPE" \
  57.             --model-path "/root/.xinference/models/${MODEL_NAME}" \
  58.             --gpu-idx "$EMBEDDING_GPU"
  59.     fi
  60. fi
  61. if [[ "${RERANKER_INSTALL_ENABLE}" = "true" ]] ; then
  62.     MODEL_NAME="bce-reranker-base_v1"
  63.     MODEL_TYPE="rerank"
  64.     if ! is_model_registered "$MODEL_NAME"; then
  65.         echo "加载重排序模型: ${MODEL_NAME}"
  66.         docker exec xinference xinference launch \
  67.             --model-name "$MODEL_NAME" \
  68.             --model-type "$MODEL_TYPE" \
  69.             --model-path "/root/.xinference/models/${MODEL_NAME}" \
  70.             --gpu-idx "$RERANKER_GPU"
  71.     fi
  72. fi
  73. if [[ "${TTS_INSTALL_ENABLE}" = "true" ]] ; then
  74.     MODEL_NAME="CosyVoice-300M"
  75.     MODEL_TYPE="audio"
  76.     if ! is_model_registered "$MODEL_NAME"; then
  77.         echo "加载TTS模型: ${MODEL_NAME}"
  78.         docker exec xinference xinference launch \
  79.             --model-name "$MODEL_NAME" \
  80.             --model-type "$MODEL_TYPE" \
  81.             --model-path "/root/.xinference/models/${MODEL_NAME}" \
  82.             --gpu-idx "$TTS_GPU"
  83.     fi
  84. fi
  85. if [[ "${STT_INSTALL_ENABLE}" = "true" ]]; then
  86.     MODEL_NAME="SenseVoiceSmall"
  87.     MODEL_TYPE="audio"
  88.     if ! is_model_registered "$MODEL_NAME"; then
  89.         echo "加载STT模型: ${MODEL_NAME}"
  90.         docker exec xinference xinference launch \
  91.             --model-name "$MODEL_NAME" \
  92.             --model-type "$MODEL_TYPE" \
  93.             --model-path "/root/.xinference/models/${MODEL_NAME}" \
  94.             --gpu-idx "$STT_GPU"
  95.     fi
  96.    
  97. fi
  98. echo "查看模型状态"
  99. docker exec xinference xinference list
  100. echo "完成模型注册"
复制代码
3.2.4 压缩离线包
  1. tar -czvf model_services.tar.gz model_services
复制代码
4. 离线服务器部署步骤

4.1 前提条件

确保服务器已安装配置好docker、docker-compose并配置好nvidia-container-runtime。
4.2 传输资源包​​
  1. scp model_services.tar.gz user@offline-server:/data/
复制代码
4.3 解压资源
  1. tar -xzvf model_services.tar.gz -C /data/
复制代码
4.4 ​​修改配置​​

根据实际服务器GPU情况调整config.ini中的设备分配。
注意: xinference上加载的模型并不支持配置显存。
​​执行部署​​:
  1. cd /data/model_services
  2. chmod +x install.sh
  3. ./install.sh
复制代码
脚本执行日志:
  1. [+] Running 1/1
  2. ✔ Container xinference  Running                                                                                                                0.0s
  3. 加载模型
  4. UID                       Type    Name
  5. ------------------------  ------  ---------------
  6. SenseVoiceSmall-Z61fh3ys  audio   SenseVoiceSmall
  7. 启动嵌入模型: bce-embedding-base_v1
  8. Launch model name: bce-embedding-base_v1 with kwargs: {}
  9. Launching model: 100%|██████████ | 100.0%
  10. Model uid: bce-embedding-base_v1
  11. UID                    Type       Name                     Dimensions
  12. ---------------------  ---------  ---------------------  ------------
  13. bce-embedding-base_v1  embedding  bce-embedding-base_v1           768
  14. UID                       Type    Name
  15. ------------------------  ------  ---------------
  16. SenseVoiceSmall-Z61fh3ys  audio   SenseVoiceSmall
  17. 加载重排序模型: bce-reranker-base_v1
  18. Launch model name: bce-reranker-base_v1 with kwargs: {}
  19. Launching model: 100%|██████████ | 100.0%
  20. ........
  21. 加载TTS模型: CosyVoice-300M
  22. Launch model name: CosyVoice-300M with kwargs: {}
  23. Launching model: 100%|██████████ | 100.0%
  24. Launching model: 100%|██████████ | 100.0%
  25. Model uid: CosyVoice-300M
  26. .......
  27. 查看模型状态
  28. UID                    Type       Name                     Dimensions
  29. ---------------------  ---------  ---------------------  ------------
  30. bce-embedding-base_v1  embedding  bce-embedding-base_v1           768
  31. UID                   Type    Name
  32. --------------------  ------  --------------------
  33. bce-reranker-base_v1  rerank  bce-reranker-base_v1
  34. UID                       Type    Name
  35. ------------------------  ------  ---------------
  36. SenseVoiceSmall  audio   SenseVoiceSmall
  37. CosyVoice-300M   audio   CosyVoice-300M
  38. 完成模型注册
复制代码
5. 服务验证与测试

5.1 基础检查
  1. # 检查容器状态
  2. docker ps | grep xinference
  3. # 查看模型列表
  4. docker exec xinference xinference list
复制代码
5.2 API接口测试

文本嵌入测试​​:
  1. curl -X POST "http://localhost:9997/v1/embeddings" \
  2.   -H "Content-Type: application/json" \
  3.   -d '{"model": "bce-embedding-base_v1", "input": "测试文本"}'
复制代码
5.3 xinference图形化界面测试

1.png

点击语音识别模型行Actions按钮,测试语音识别:
2.png

6、总结

通过本文介绍的方案,企业可以在完全离线的环境中快速部署一套功能完整的AI能力平台。该方案不仅保证了数据的安全性,还通过灵活的配置满足了不同场景的需求。Xinference框架的轻量级特性使其成为离线部署的理想选择,而我们的自动化脚本则大大降低了部署复杂度。
未来,随着模型技术的进步,我们可以通过同样的方式无缝升级模型版本,持续提升业务系统的AI能力,而无需改变整体架构。

来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册