简介
Xorbits Inference (Xinference) 是一个开源平台,用于简化各种 AI 模型的运行和集成。借助 Xinference,您可以使用任何开源 LLM、嵌入模型和多模态模型在云端或本地环境中运行推理,并创建强大的 AI 应用。
帮助文档:https://inference.readthedocs.io/zh-cn/latest/models/index.html
配置项
# 修改存储目录(模型及日志文件)
export XINFERENCE_HOME=/tmp/xinference
# 可以使用的显卡(使用nvidia-smi查看)
export CUDA_VISIBLE_DEVICES=0,1,2,3,4
# 从modelscopde下载模型
export XINFERENCE_MODEL_SRC=modelscope
# 设置token(部分模型需要授权)
export HUGGING_FACE_HUB_TOKEN=your_token_here
# 模型缓存目录,默认值是~/.cache/modelscope/hub
export MODELSCOPE_CACHE=<model_saved_path>
运维
# 查看支持的某种类型所有模型(LLM/embedding/image/audio/rerank)
xinference registrations -t LLM
# 查看在运行的模型
xinference list
# 终止某个模型
xinference terminate --model-uid "my-llama-2"
# 重启
ps -ef | grep xinference | grep -v grep | awk '{print $2}' | xargs kill -9
ps -ef | grep xinference | grep -v grep | wc -l
vLLM加速
LLM 是一个支持高并发的高性能大模型推理引擎。当满足以下条件时,Xinference 会自动选择 vllm 作为引擎来达到更高的吞吐量:
- 模型格式为
pytorch
,gptq
或者awq
。 - 当模型格式为
pytorch
时,量化选项需为none
。 - 当模型格式为
gptq
或awq
时,量化选项需为Int4
。 - 操作系统为 Linux 并且至少有一个支持 CUDA 的设备
- 自定义模型的
model_family
字段和内置模型的model_name
字段在 vLLM 的支持列表中。
基于Docker部署
1. 安装docker & nvidia gpu toolkit
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动docker
sudo systemctl start docker
# 安装gpu toolkit: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
sudo yum install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# 关闭ecc可以提升速度和可用显存,需要重启
nvidia-smi -e 0
2. 安装python
- 升级openSSL
# 检查openSSL version>=1.1.1
openssl version
# 升级openSSL
sudo yum install -y gcc make perl-core zlib-devel
curl -L https://www.openssl.org/source/openssl-3.2.1.tar.gz -o openssl-3.2.1.tar.gz
tar -zxf openssl-3.2.1.tar.gz
cd openssl-3.2.1
./config --prefix=/usr/local/openssl-3.2.1
make
sudo make install
# 备份
sudo mv /usr/bin/openssl /usr/bin/openssl_old
sudo mv /usr/include/openssl /usr/include/openssl_old
# 安装与更新动态链接库缓存
sudo ln -sf /usr/local/openssl-3.2.1/bin/openssl /usr/bin/openssl
sudo ln -sf /usr/local/openssl-3.2.1/include/openssl /usr/include/openssl
sudo ldconfig /usr/local/openssl-3.2.1/lib64
# 校验
openssl version
- 安装python
sudo yum install bzip2-devel openssl-devel readline-devel sqlite-devel ncurses-devel tk-devel libuuid-devel
curl -L https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz -o Python-3.12.2.tar.xz
tar -xf Python-3.12.2.tar.xz
cd Python-3.12.2
./configure --prefix=/usr/local/python3
make
make install
# 设置软链
ln -sf /usr/local/python3/bin/python3 /usr/bin/python3
# centos yum不支持python3,不能加这个软链
ln -sf /usr/bin/python3 /usr/bin/python
make clean
3. 安装conda(可选)
wget https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-x86_64.sh
chmod +x Miniconda3-py312_24.1.2-0-Linux-x86_64.sh
./Miniconda3-py312_24.1.2-0-Linux-x86_64.sh -b -f -p /usr/local/conda
ln -s /usr/local/conda/bin/conda /usr/bin/conda
# 初始化
conda init
4.从ModelScope下载模型(可选)
执行MODELSCOPE_CACHE=/data/modelscope/hub
改变缓存目录,默认值是~/.cache/modelscope/hub
mkdir -p /data/modelscope/hub
cd /data/modelscope/hub
pip install modelscope
python
from modelscope import snapshot_download
model_dir = snapshot_download('qwen/Qwen1.5-32B-Chat-AWQ', cache_dir='/data/modelscope/hub')
5. 启动xinference
# 拉取镜像,速度慢可以使用镜像站:docker.nju.edu.cn/xprobe/xinference:v0.10.1
# 阿里云使用它的容器镜像服务加速
docker pull xprobe/xinference:v0.10.1
# 启动,所有卡可以用 --gpus all
docker run -d -e XINFERENCE_MODEL_SRC=modelscope -e MODELSCOPE_CACHE=/data/modelscope/hub -v /data:/data -p 9997:9997 --shm-size=16g --gpus '"device=0,1"' xprobe/xinference:v0.10.1 xinference-local -H 0.0.0.0 --log-level debug
6. 进入xinference启动模型,也可以用页面启动
docker exec -it <containerId> /bin/bash
nvidia-smi
xinference launch -u qwen1.5-chat-32b -n qwen1.5-chat -f awq -s 32 -q Int4 -r 1 --n-gpu 2 --max_model_len 32768 --gpu_memory_utilization 0.9 --enforce_eager True
# 检查
xinference list
直接部署
# 1. 安装
pip install "xinference[all]"
# 2. 启动
# 默认情况下,Xinference 会使用 <HOME>/.xinference 作为主目录来存储一些必要的信息,比如日志文件和模型文件
xinference-local --host 0.0.0.0 --port 9997
# 3. 使用命令行运行模型(不指定-u/--model-uid会随机生成一个)
# -u --model-uid 不指定会自动生成一个唯一id(默认跟模型名一样)
# -n --model-name 模型名
# -f model format
# -s 模型大小(billions)
# -e --endpoint xinference地址
# -r --replica 副本数
# --n-gpu 使用多少个gpu
# 在使用具体的加速框架时,可以增加对应的参数,如vllm支持的--max_model_len 8192
xinference launch -u my-llama-2 -n llama-2-chat -s 13 -f pytorch -r 1 --n-gpu 2 --gpu-idx 3,4
内置模型以及调用示例:https://inference.readthedocs.io/zh-cn/latest/models/builtin/llm/index.html
调用
curl -X 'POST' \
'http://127.0.0.1:9997/v1/chat/completions' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"model": "my-llama-2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "What is the largest animal?"
}
]
}'
自定义模型
参考文档:https://inference.readthedocs.io/zh-cn/latest/models/custom.html
vim codeqwen1_5.json
{
"version": 1,
"context_length": 65536,
"model_name": "codeqwen1.5",
"model_lang": [
"en"
],
"model_ability": [
"generate"
],
"model_family": "llama-2",
"model_specs": [
{
"model_format": "pytorch",
"model_size_in_billions": "7",
"quantizations": [
"4-bit",
"8-bit",
"none"
],
"model_uri": "file:///data/modelscope/hub/qwen/CodeQwen1___5-7B"
}
]
}
启动
xinference register --model-type LLM --file codeqwen1_5.json --persist
xinference launch -u codeqwen1.5 -n codeqwen1.5 -f pytorch -s 7 -q none -r 1 --n-gpu 2 --max_model_len 65536 --gpu_memory_utilization 0.95 --enforce_eager True
# 取消注册模型
xinference unregister -n codeqwen1.5-7b
调试
Embedding模型
import os
from xinference.client import Client
client = Client(os.environ.get("XINFERENCE_ENDPOINT","http://localhost:9997"))
model = client.get_model("bge-m3")
input_text = "What is the capital of China?"
model.create_embedding(input_text)