模型下载
原本从huggingface下载原文件,但是由于自己的VPN不稳定,一直下载中断.所以选了其他方法
git clone https://github.com/LetheSec/HuggingFace-Download-Accelerator.git
cd HuggingFace-Download-Accelerator
python3 hf_download.py --model baichuan-inc/Baichuan2-13B-Chat --save_dir ../
模型部署
模型部署直接用vllm,启动一个API服务. 没用过的可以看一下这个vllm文档
This guide shows how to use vLLM to:
- run offline batched inference on a dataset;
- build an API server for a large language model;
- start an OpenAI-compatible API server.
1. 安装vllm
部署采用docker来部署,所以需要先安装docker
docker部署的好处就是不用担心环境问题. vllm 提供了官方镜像,直接拉取即可
docker pull vllm/vllm-openai:latest
2. 启动服务
启动服务,这里我用的是单卡的A100,所以只启动一个服务.如果是多卡的话,可以启动多个服务,然后用负载均衡来分配请求
如果是单卡的话 可以直接docker run
来启动一个服务
docker run \
--runtime nvidia \
--gpus "device=1" \
-v /data0/models/baichuan2/model:/root/model/baichuan2 \
--env "NVIDIA_VISIBLE_DEVICES=1" \
--env "VLLM_API_KEY=xxx" \
-p 5051:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model /root/model/baichuan2 \
--served-model-name baichuan2-13b \
--chat-template /root/model/baichuan2/template_baichuan.jinja \
--gpu-memory-utilization 0.5 \
--max-model-len 4096 \
--trust-remote-code
这里说明一下参数:
--runtime nvidia
使用nvidia的runtime--gpus "device=1"
使用第二块GPU 编号为1的-v /data0/models/baichuan2/model:/root/model/baichuan2
将模型挂载到容器中 使用的时候要替换对应的模型位置--env "NVIDIA_VISIBLE_DEVICES=1"
使用第二块GPU 编号为1的--env "VLLM_API_KEY=xxxx"
这个是vllm的API key,设置了请求API的时候 就要带上api key-p 5051:8000
将容器的8000端口映射到5051端口--ipc=host
使用host的ipc
vllm 参数--model /root/model/baichuan2
模型的路径--served-model-name baichuan2-13b
模型的名字--chat-template /root/model/baichuan2/template_baichuan.jinja
模板的路径--gpu-memory-utilization 0.5
使用GPU的内存比例 不要太大 不然 Out of memory--max-model-len 4096
模型的最大长度--trust-remote-code
信任远程代码 如果你的模型不是从huggingface下载的话,需要加上这个参数
3. 测试服务
启动服务之后,可以用curl来测试一下服务是否正常
curl --location 'http://127.0.0.1:5051/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer A0cO1CSPLawGmgJb6rqTK9fBl5XEthVv' \
--data '{
"model": "baichuan2-13b",
"messages": [
{
"role": "user",
"content": "你可以帮我做什么呀?"
}
],
"top_p": 1,
"stream": false
}'
输出结果
{
"id": "cmpl-3e3f5588193c4905be95d56227279016",
"object": "chat.completion",
"created": 4512519,
"model": "baichuan2-13b",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "作为一个大语言模型,我可以通过自然语言交互的方式为你提供以下服务:\n1. 提供知识:我可以回答各领域的问题,并提供准确的信息和知识,帮你解决问题或获取所需要的信息\n2. 文本生成:我可以创作不同体裁的内容,激发你的灵感\n3. 语言翻译:如果需要将一种语言翻译成另外一种语言,我可以为你提供翻译服务\n4. 语言理解:我可以用于语言理解相关的任务,例如文本分析、情感分析、摘要抽取、分类、聚类等\n5. 代码编写和解释:我还可以生成相关问题的代码或者解释相关代码的问题\n请问你需要什么帮助吗?"
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 7,
"total_tokens": 138,
"completion_tokens": 131
}
}
3. docker-compose部署
如果部署多个服务的话,可以用docker-compose来部署,这样可以方便的管理多个服务
version: '3.8'
services:
baichuan_vllm_openai1:
image: vllm/vllm-openai:latest
command: --model /root/model/baichuan2 --served-model-name baichuan2-13b --chat-template /root/model/baichuan2/template_baichuan.jinja --gpu-memory-utilization 0.5 --max-model-len 4096 --trust-remote-code
environment:
- NVIDIA_VISIBLE_DEVICES=6
- VLLM_API_KEY=xxx
volumes:
- /data0/models/baichuan2/model:/root/model/baichuan2
ports:
- "5051:8000"
deploy:
resources:
reservations:
devices:
- driver: nvidia
capabilities: [gpu]
device_ids: ['6']
baichuan_vllm_openai2:
image: vllm/vllm-openai:latest
command: --model /root/model/baichuan2 --served-model-name baichuan2-13b --chat-template /root/model/baichuan2/template_baichuan.jinja --gpu-memory-utilization 0.5 --max-model-len 4096 --trust-remote-code
environment:
- NVIDIA_VISIBLE_DEVICES=7
- VLLM_API_KEY=xxx
volumes:
- /data0/models/baichuan2/model:/root/model/baichuan2
ports:
- "5052:8000"
deploy:
resources:
reservations:
devices:
- driver: nvidia
capabilities: [gpu]
device_ids: ['7']
负载均衡
如果部署多个服务的话,可以用nginx来做负载均衡
upstream baichuan {
server 192.168.191.56:5051;
server 192.168.191.56:5052;
}
server {
location /models/baichuan {
rewrite ^/models/baichuan(.*)$ $1 break;
proxy_pass http://baichuan;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 负载均衡配置
proxy_next_upstream http_502 http_503 http_504;
proxy_set_header Connection "";
}
...
}
负载均衡之后,可以用curl来测试一下服务是否正常
curl --location 'http://nigixhost/models/baichuan/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer A0cO1CSPLawGmgJb6rqTK9fBl5XEthVv' \
--data '{
"model": "baichuan2-13b",
"messages": [
{
"role": "user",
"content": "你可以帮我做什么呀?"
}
],
"top_p": 1,
"stream": false
}'