开源模型部署实战


模型下载

原本从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
}'

文章作者: Wanheng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Wanheng !
评论
  目录