> 技术文档 > 在docker中使用vLLM部署大模型_docker部署vllm

在docker中使用vLLM部署大模型_docker部署vllm


目录

  • 首次在docker中安装vllm
  • 从已有镜像加载vllm
  • 使用vllm部署不同量化方式的大模型
    • QwQ-32B-AWQ
    • QwQ-32B-GPTQ-Int4
    • QwQ-32B-GPTQ-Int8
    • 最终测试结果
  • 使用vllm部署多模态大模型

首次在docker中安装vllm

  1. 首先用docker启动一个容器,需求是将模型所在目录挂在到容器某个路径下,设置gpu的使用数量,设置端口
 docker run -dit --gpus all --ipc=host --name vLLM -p 3001:80 -v /mnt/d0/checkpoints:/models python:3.11
  1. 在新建的容器内部安装vllm
#进入新建容器内部docker exec -it vLLM bash#安装vllmpip install vllm==0.7.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
  1. 启动VLLM服务
vllm serve /models/qwq-32b --host 0.0.0.0 --port 80 --tensor-parallel-size 4 --gpu-memory-utilization 0.9 --max-num-seqs 80 --max-model-len 65536
  1. 检查VLLM服务是否启动成功
curl -X POST \"10.20.25.250:3001/v1/chat/completions\" \\ -H \"Content-Type: application/json\" \\ -d \'{ \"model\": \"/models/qwq-32b\", \"messages\": [ { \"role\": \"user\", \"content\": \"介绍一下你自己\" } ], \"temperature\": 0.3, \"stream\": false }\'

注意,如果在启服务的时候遇到了下面这个错误,需要进入到模型所在的文件夹,找到config.json,修改其中的max_position_embeddings字段和你的max_model_len匹配

在docker中使用vLLM部署大模型_docker部署vllm

从已有镜像加载vllm

如果之前在别的服务器上安装过vllm就可以直接打包移植,就不需要再安装了

  1. 从已有的tar加载docker镜像,里面已经安装好了vllm
docker load -i vllm.tar
  1. 加载好镜像之后,采用下面的命令启动一个容器,可以将宿主机有模型的路径挂载到容器中的models下
docker run -dit --gpus \'\"device=4,5,6,7\"\' --ipc=host --name vLLM -p 3001:80 -v /home/zhangzichao/checkpoints:/models vllm:1.0
  1. 启动容器之后,直接从vscode中进入容器内部,也可以在终端执行下面的命令
docker exec -it vLLM bash 
  1. 然后启动vllm服务
vllm serve /models/qwq-32b --host 0.0.0.0 --port 80 --tensor-parallel-size 4 --gpu-memory-utilization 0.9 --max-num-seqs 80 --max-model-len 65536

使用vllm部署不同量化方式的大模型

QwQ-32B-AWQ

官方模型地址
用的是10.20.25.250这台服务器,找到一个安装了modelscope的conda环境,然后进入checkpoints文件夹,执行下载命令

 modelscope download --model Qwen/QwQ-32B-AWQ --local_dir ./QwQ-32B-AWQ

然后进入vllm的容器中,启动大模型服务

vllm serve /models/QwQ-32B-AWQ --host 0.0.0.0 --port 80 --tensor-parallel-size 4 --gpu-memory-utilization 0.9 --max-num-seqs 128 --max-model-len 65536

测试结果

配置 最大请求数 单用户最大上下文 模型每张卡上所需显存 KVcache每张卡上所需显存 二者之和 GPU利用率 实测上下文长度 能成功的最大请求数 4*4090 128 102400(100k) 5.92GB 6.25GB 12.17GB 0.8(18.91GB) 4*4090 256 102400(100k) 6.62GB 6.25GB 12.87GB 0.8(18.91GB) 4*4090 256 204800(200k) 6.62GB 12.50GB 19.12GB 0.81(19.15GB) 512 256最后卡住了 4*4090 256 131072(128k) 6.64GB 8.00GB 14.64GB 0.8(18.91GB) 512 256

QwQ-32B-GPTQ-Int4

由于GPTQ的量化方式官方没有,所以用的是第三方量化模型 第三方模型地址

找到一个安装了modelscope的conda环境,进入checkpoints文件夹,执行下载命令

modelscope download --model tclf90/qwq-32b-gptq-int4 --local_dir ./qwq-32b-gptq-int4

然后进入vllm的容器中,启动大模型服务

vllm serve /models/qwq-32b-gptq-int4 --host 0.0.0.0 --port 80 --tensor-parallel-size 4 --gpu-memory-utilization 0.9 --max-num-seqs 256 --max-model-len 131072
配置 最大请求数 单用户最大上下文 模型每张卡上所需显存 KVcache每张卡上所需显存 二者之和 GPU利用率 实测上下文长度 能成功的最大请求数 4*4090 256 131072(128k) 6.61GB 8.00GB 14.64GB 0.8(18.91GB) 512 256 4*4090 512 131072(128k) 8.05GB 8.00GB 16.05GB 0.8(18.91GB) 512 512有点卡 4*4090 512 131072(128k) 8.05GB 8.00GB 16.05GB 0.7(16.55GB) 512 512有点卡

QwQ-32B-GPTQ-Int8

第三方模型地址
找到一个安装了modelscope的conda环境,进入checkpoints文件夹,执行下载命令

modelscope download --model tclf90/qwq-32b-gptq-int8 --local_dir ./qwq-32b-gptq-int8

然后进入vllm的容器中,启动大模型服务

vllm serve /models/qwq-32b-gptq-int8 --host 0.0.0.0 --port 80 --tensor-parallel-size 4 --gpu-memory-utilization 0.8 --max-num-seqs 256 --max-model-len 131072
配置 最大请求数 单用户最大上下文 模型每张卡上所需显存 KVcache每张卡上所需显存 二者之和 GPU利用率 实测上下文长度 能成功的最大请求数 4*4090 256 131072(128k) 10.55GB 8.00GB 18.55GB 0.8(18.91GB) 512 256(最后会卡住) 4*4090 128 131072(128k) 9.87GB 8.00GB 18.55GB 0.8(18.91GB) 512 128

最终测试结果

配置 模型 量化方式 上下文 并发量 输出吞吐 单用户最大上下文 4*4090 QWQ-32B 无量化 512 85 1397.36 65536 4*4090 QWQ-32B AWQ 4-bit 512 256 1589.76 131072 4*4090 QWQ-32B GPTQ-Int4 512 256 1507.84 131072 4*4090 QWQ-32B GPTQ-Int8 512 104 1363.02 131072

使用vllm部署多模态大模型

从modelscope上下载模型

modelscope download --model Qwen/Qwen2.5-VL-3B-Instruct --local_dir ./Qwen2.5-VL-3B-Instruct

有了模型之后就可以在docker里启动服务了

vllm serve /models/Qwen2.5-VL-3B-Instruct --host 0.0.0.0 --port 80 --tensor-parallel-size 4 --gpu-memory-utilization 0.9 --max-num-seqs 128 --max-model-len 65536 --limit-mm-per-prompt image=5

这里注意,–limit-mm-per-prompt参数尽量加上,如果不加的话,一个对话里最多只能有一张图片,多了就会报错400,这里我随便设成了5,一个对话中对于5张图片就会报400

启动之后就可以进行测试了,如果你使用网上的图片,curl需要这样写

curl -X POST \"10.20.25.250:3001/v1/chat/completions\" -H \"Content-Type: application/json\" -d \'{ \"model\": \"/models/Qwen2.5-VL-3B-Instruct\", \"messages\": [ { \"role\": \"user\", \"content\":[ {\"type\": \"text\", \"text\": \"这张图像是什么动物?\"}, {\"type\": \"image_url\",\"image_url\": {\"url\": \"https://n.sinaimg.cn/sinacn15/560/w1080h1080/20180513/9ad1-hamfahx6081487.jpg\"}}] } ], \"temperature\": 0.3, \"stream\": false }\'

如果你想用本地的图片进行测试,首先需要转成base64编码,图片转base64这个网站就可以实现,直接把转换内容替换到上面 “url” 的值就可以了,因为那个编码太长了,贴一张图片作为例子
在docker中使用vLLM部署大模型_docker部署vllm