安装 Rust

建议安装 Rust 的最新版本 1.75.0,安装命令如下

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

TEI 的安装

1、下载 TEI 的 github 仓库

git clone https://github.com/huggingface/text-embeddings-inference.git && cd text--embeddings-inference

2、安装cargo install时所用依赖

root@localhost:~/BAAI/text-embeddings-inference-1.5.0# apt install pkg-config libssl-dev

3、gcc g++ 的版本要>=12

ubuntu 20.04中apt的gcc和g++最高版本为9,所以采用下下策,编译安装gcc和g++

# 下载 GCC 源码
root@localhost:~/BAAI/text-embeddings-inference-1.5.0# wget http://ftp.gnu.org/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz
root@localhost:~/BAAI/text-embeddings-inference-1.5.0# tar -xzf gcc-12.2.0.tar.gz
root@localhost:~/BAAI/text-embeddings-inference-1.5.0# cd gcc-12.2.0

# 安装依赖
root@localhost:~/BAAI/text-embeddings-inference-1.5.0# sudo apt install build-essential libgmp3-dev libmpfr-dev libmpc-dev

# 配置和编译
root@localhost:~/BAAI/text-embeddings-inference-1.5.0# ./configure --disable-multilib --enable-languages=c,c++
root@localhost:~/BAAI/text-embeddings-inference-1.5.0# make -j$(nproc)
root@localhost:~/BAAI/text-embeddings-inference-1.5.0# sudo make install

#验证是否编译成功
root@localhost:~/BAAI/text-embeddings-inference-1.5.0# /usr/local/bin/gcc --version
gcc (GCC) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

root@localhost:~/BAAI/text-embeddings-inference-1.5.0# /usr/local/bin/g++ --version
g++ (GCC) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

4、设置环境变量

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
export CARGO_TARGET_DIR=/root/BAAI/text-embeddings-inference-1.5.0/target

5、安装TEI 项目相关依赖

ln -sf /root/.cargo/bin/cargo /usr/bin/
cargo install --path router -F candle

6、部署 Rerank 模型

ln -sf /root/.cargo/bin/text-embeddings-router /usr/bin/
nohup text-embeddings-router --model-id BAAI/bge-reranker-v2-m3 --port 38080 > output.log 2>&1 &

部署完成后查看API相关信息

http://10.84.3.243:38080/docs/

测试

curl -X 'POST' \
  'http://localhost:38080/rerank' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "query": "What is Deep Learning?",
  "texts": [
    "Deep Learning is ...",
    "hello"
  ]
}'

7、部署Embedding 模型

nohup text-embeddings-router --model-id BAAI/bge-m3 --port 38081 > output.log 2>&1 &

8、部署chat模型

nohup text-embeddings-router Qwen/Qwen2.5-72B-Instruct --port 38082 > output.log 2>&1 &

使用ollama安装chat模型

1、一键安装ollama

curl -fsSL https://ollama.com/install.sh | sh

2、手动安装ollama

2.1、下载并解压安装包

curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz
sudo tar -C /usr -xzf ollama-linux-amd64.tgz

2.2、创建启动用户

sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama
sudo usermod -a -G ollama $(whoami)

2.3、加入systemd管理

cat > /etc/systemd/system/ollama.service << EOF
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=$PATH"

[Install]
WantedBy=default.target
EOF

2.4、启动服务

sudo systemctl daemon-reload
sudo systemctl enable ollama

2.5、部署qwen2.5:72b

ollama run qwen2.5:72b

3、Kubernetes中使用ollama部署Chat模型

3.1、ollama的deployment 文件

必须事先在 Kubernetes 中开启 GPU 支持

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ollama-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
  storageClassName: csi-cephfs-sc
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ollama
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ollama
  template:
    metadata:
      labels:
        app: ollama
    spec:
      containers:
      - name: ollama
        image: registry.cn-shanghai.aliyuncs.com/qwx_images/ollama:0.4.7
        resources:
          limits:
            nvidia.com/gpu: '2'
        ports:
        - containerPort: 11434
        #stdin: true
        #tty: true
        #securityContext:
        #  privileged: true
        volumeMounts:
        - name: ollama-volume
          mountPath: /root/.ollama
      volumes:
      - name: ollama-volume
        persistentVolumeClaim:
          claimName: ollama-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: ollama-service
spec:
  selector:
    app: ollama
  ports:
    - protocol: TCP
      port: 11434
      targetPort: 11434
  type: ClusterIP

3.2部署nvidia/Llama-3.1-Nemotron-70B-Instruct模型

root@master3:~# kubectl exec -it ollama-7bcbd9d78f-dkd6g -n ollama -- ollama run nemotron
pulling manifest 
pulling c147388e9931... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████42 GB                         
pulling 4863fe3335f3... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████1.2 KB                         
pulling 64e1b2889b78... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 7.6 KB                         
pulling a568f2ebc73c... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 4.7 KB                         
pulling 56bb8bd477a5... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   96 B                         
pulling 2b4e98e1c22e... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  562 B                         
verifying sha256 digest 
writing manifest 
success 
>>> #此处可以与其对话,Ctrl+d 退出 进程后台运行

Xinference

Xorbits Inference (Xinference) 是一个开源平台,用于简化各种 AI 模型的运行和集成。借助 Xinference,您可以使用任何开源 LLM、嵌入模型和多模态模型在云端或本地环境中运行推理,并创建强大的 AI 应用。
官方网站:https://inference.readthedocs.io/zh-cn/latest/getting_started/installation.html

Docker

部署CPU版Xinference Server

services:
  xinference:
    image: registry.cn-hangzhou.aliyuncs.com/xprobe_xinference/xinference:v0.16.2-cpu
    ports:
      - "9997:9997"
    environment:
      - XINFERENCE_MODEL_SRC=modelscope  #指定模型仓库,国内的是魔塔库,国外的是huggingface
    command: xinference-local -H 0.0.0.0 --log-level debug

部署GPU版Xinference

准备工作

Xinference 使用 GPU 加速推理,该镜像需要在有 GPU 显卡并且安装 CUDA 的机器上运行。
保证 CUDA 在机器上正确安装。可以使用 nvidia-smi 检查是否正确运行。
镜像中的 CUDA 版本为 12.4 。为了不出现预期之外的问题,请将宿主机的 CUDA 版本和 NVIDIA Driver 版本分别升级到 12.4 和 550 以上。

services:
  xinference:
    image: registry.cn-hangzhou.aliyuncs.com/xprobe_xinference/xinference:v0.16.2
    environment:
      - XINFERENCE_MODEL_SRC=modelscope
    ports:
      - "9998:9997"
    runtime: nvidia
    command: xinference-local -H 0.0.0.0 --log-level debug
    deploy:
      resources:
        limits:
          devices:
            - driver: nvidia
              count: all
    restart: always

Kubernetes Server

Xinference 提供基于原生 Helm 在 Kubernetes 集群中安装的方式。

准备条件

  • 一个可用的 Kubernetes 集群。
  • 在 Kubernetes 中开启 GPU 支持
  • 正确安装 Helm

具体步骤

1、新增 Xinference Helm 仓库

root@master1:~# helm repo add xinference https://xorbitsai.github.io/xinference-helm-charts
"xinference" has been added to your repositories

2、更新仓库索引,查询可安装版本

root@master1:~# helm repo update xinference
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "xinference" chart repository
Update Complete. ⎈Happy Helming!⎈
root@master1:~# helm search repo xinference/xinference --devel --versions
NAME                     CHART VERSION          APP VERSION      DESCRIPTION                             
xinference/xinference    0.0.2-v0.14.4          v0.14.4          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.2-v0.13.3          v0.13.3          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.16.2          v0.16.2          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.16.1          v0.16.1          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.16.0          v0.16.0          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.15.4          v0.15.4          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.15.3          v0.15.3          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.15.2          v0.15.2          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.15.1          v0.15.1          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.15.0          v0.15.0          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.14.4          v0.14.4          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.14.3          v0.14.3          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.14.2          v0.14.2          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.14.1          v0.14.1          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.14.0.post1    v0.14.0.post1    Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.14.0          v0.14.0          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.13.3          v0.13.3          Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.0.4           v0.0.4           Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.0.3           v0.0.3           Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.0.2           v0.0.2           Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-v0.0.1           v0.0.1           Helm charts for Xinference on Kubernetes
xinference/xinference    0.0.1-main             main             Helm charts for Xinference on Kubernetes

3、安装

helm install xinference xinference/xinference -n xinference --version <helm_charts_version>  --set config.model_src="modelscope" 

4、举例:

helm install xinference xinference/xinference -n xinference --version 0.0.1-v0.16.3  --set config.model_src="modelscope" 

常见的自定义安装配置

1、从 ModelScope 下载模型。

helm install xinference xinference/xinference -n xinference --version <helm_charts_version> --set config.model_src="modelscope"

2、启动 4 个 Xinference worker 节点,每个 worker 管理 4 个 GPU。

helm install xinference xinference/xinference -n xinference --version <helm_charts_version> --set config.worker_num=4 --set config.gpu_per_worker="4"

4、验证是否部署成功

root@master3:~# kubectl get svc -n xinference
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
service-supervisor   ClusterIP   10.233.22.175   <none>        9999/TCP,9997/TCP   8d
service-web          NodePort    10.233.47.18    <none>        9997:32767/TCP      8d
service-worker       ClusterIP   10.233.32.148   <none>        30001/TCP           8d

部署完成后可以访问 web 的svc地址 进行UI操作

deploy-xinference-image

部署模型

安装xinference客户端

pip install xinference

部署模型

Rerank

xinference launch --model-name bge-reranker-v2-m3 --model-type rerank -e http://10.84.3.40:30018

embedding

xinference launch --model-name bge-large-zh-v1.5 --model-type embedding -e http://10.84.3.40:30018

Chat

xinference launch --model-engine ${engine} --model-name qwen2.5-instruct --size-in-billions 0_5 --model-format pytorch --quantization ${quantization} -e http://10.84.3.40:30018
  • Model Format: pytorch
  • Model Size (in billions): 0_5
  • Quantizations: 4-bit, 8-bit, none
  • Engines: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none)
  • Model ID: Qwen/Qwen2.5-0.5B-Instruct
  • Model Hubs: Hugging Face, ModelScope
  • --model-name: 指定部署的模型名称,上方例子的模型名称是bge-reranker-v2-m3
  • --model-type:指定部署的模型类型,上方例子的模型类型是rerank
  • -e:指定Server地址,上方例子的Server地址是http://10.84.3.40:30018
    注意:执行完上方任意一条部署模型指令后都会去ModelScope或Hugging Face下载大模型文件,具体是ModelScope还是Hugging Face需要在环境环境变量中指定XINFERENCE_MODEL_SRC,必须确保网络畅通

Web UI图形化操作

1、部署qwen2.5-instruct
qwen1

qwen2

qwen3

2、验证模型是否部署成功
qwen4

注意:点击部署按钮后,要等一会再验证模型是否部署完成,第一次过程比较慢,可查看xinference-supervisor Pod和xinference-worker的实时日志,看是否有报错,没报错等待即可

自定义模型

xinference launch --model_path <model_file_path> --model-engine <engine> -n qwen1.5-chat -e http://10.84.3.40:30018

部署自定义模型与上方部署方式大部分都一样,唯一区别是需要指定模型文件路径,将下载下来的模型文件存放至worker某个目录下,然后通过--model_path指定绝对路径

  • --model_path:模型文件路径
  • --model-engine:选择加载模型的引擎
  • -n:模型名称

xinference认证系统

Xinference 使用了账号密码的模式构建了一个基于内存的 OAuth2 的身份验证和授权系统。

1、创建授权信息的json文件

在启动 Xinference 时,需要指定所有的验证和授权信息。当前,Xinference 需要一个 JSON 文件,其中包含以下特定字段:

{
    "auth_config": {
        "algorithm": "HS256",
        "secret_key": "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7",
        "token_expire_in_minutes": 30
    },
    "user_config": [
        {
            "username": "user1",
            "password": "secret1",
            "permissions": [
                "admin"
            ],
            "api_keys": [
                "sk-72tkvudyGLPMi",
                "sk-ZOTLIY4gt9w11"
            ]
        },
        {
            "username": "user2",
            "password": "secret2",
            "permissions": [
                "models:list",
                "models:read"
            ],
            "api_keys": [
                "sk-35tkasdyGLYMy", 
                "sk-ALTbgl6ut981w"
            ]
        }
    ]
}

auth_config: 这个字段配置与安全相关的信息。
●algorithm: 用于令牌生成与解析的算法。推荐使用 HS 系列算法,例如 HS256,HS384 或者 HS512 算法。
●secret_key: 用于令牌生成和解析的密钥。可以使用该命令生成适配 HS 系列算法的密钥:openssl rand -hex 32 。
●token_expire_in_minutes: 保留字段,表示令牌失效时间。目前 Xinference 开源版本不会检查令牌过期时间。
注意:三个字段缺一不可
user_config: 这个字段用来配置用户和权限信息。每个用户信息由以下字段组成:
●username: 字符串,表示用户名
●password: 字符串,表示密码
●permissions: 字符串列表,表示该用户拥有的权限。权限描述如上权限部分文档所述。
●api_keys: 字符串列表,表示该用户拥有的 api-key 。用户可以通过这些 api-key ,无需登录步骤即可访问 xinference 接口。这里的 api_key 组成与 OPENAI_API_KEY 相似,总是以 sk- 开头,后跟 13 个数字、大小写字母。

2、启用具有身份验证和授权系统的 Xinference

使用 --auth-config 选项启用具有身份验证和授权系统的 Xinference。例如,本地启动的命令如下所示:

xinference-local -H 0.0.0.0 --auth-config /path/to/your_json_config_file

在kubernetes中需要在启动 supervisor 时指定这个选项:

xinference-supervisor -H <supervisor_ip> --auth-config /path/to/your_json_config_file

示例:
将auth.json通过挂载pvc的方式挂载至Pod中,然后在启动时通过args指定auth.json的路径,使用cofigmap挂载至Pod中也可以

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "7"
    meta.helm.sh/release-name: xinference
    meta.helm.sh/release-namespace: xinference
  generation: 7
  labels:
    app.kubernetes.io/instance: xinference
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: xinference
    app.kubernetes.io/version: v0.16.3
    helm.sh/chart: xinference-v0.16.3
  name: xinference-supervisor
  namespace: xinference
  resourceVersion: "172200892"
  uid: c7f78984-f5dd-4a48-8e8d-c48f7fffe96d
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: xinference-supervisor
      app.kubernetes.io/instance: xinference
      app.kubernetes.io/name: xinference
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: xinference-supervisor
        app.kubernetes.io/instance: xinference
        app.kubernetes.io/name: xinference
    spec:
      containers:
      - args:
        - --port
        - "9997"
        - --host
        - $(POD_IP)
        - --supervisor-port
        - "9999"
        - --auth-config  #新增--auth-config
        - /auth/Qwen2.5-72B-Instruct/auth.json  #指定auth文件路径
        - --log-level
        - debug
        command:
        - xinference-supervisor
        env:
        - name: POD_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.podIP
        - name: XINFERENCE_POD_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.name
        image: registry.cn-hangzhou.aliyuncs.com/xprobe_xinference/xinference:v0.16.3
        imagePullPolicy: IfNotPresent
        name: supervisor
        ports:
        - containerPort: 9997
          name: web
          protocol: TCP
        - containerPort: 9999
          name: oscar
          protocol: TCP
        resources:
          requests:
            cpu: "1"
            memory: 4Gi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /auth
          name: xinference-auth
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: xinference-auth
        persistentVolumeClaim:
          claimName: xinference-auth-pvc
最后修改:2024 年 12 月 04 日
如果觉得我的文章对你有用,请随意赞赏