在docker中使用vLLM部署大模型
目录
- 首次在docker中安装vllm
- 从已有镜像加载vllm
- 使用vllm部署不同量化方式的大模型
- QwQ-32B-AWQ
- QwQ-32B-GPTQ-Int4
- QwQ-32B-GPTQ-Int8
- 最终测试结果
- 使用vllm部署多模态大模型
首次在docker中安装vllm
- 首先用docker启动一个容器,需求是将模型所在目录挂在到容器某个路径下,设置gpu的使用数量,设置端口
docker run -dit --gpus all --ipc=host --name vLLM -p 3001:80 -v /mnt/d0/checkpoints:/models python:3.11
- 在新建的容器内部安装vllm
#进入新建容器内部
docker exec -it vLLM bash
#安装vllm
pip install vllm==0.7.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
- 启动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服务是否启动成功
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匹配
从已有镜像加载vllm
如果之前在别的服务器上安装过vllm就可以直接打包移植,就不需要再安装了
- 从已有的tar加载docker镜像,里面已经安装好了vllm
docker load -i vllm.tar
- 加载好镜像之后,采用下面的命令启动一个容器,可以将宿主机有模型的路径挂载到容器中的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
- 启动容器之后,直接从vscode中进入容器内部,也可以在终端执行下面的命令
docker exec -it vLLM bash
- 然后启动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” 的值就可以了,因为那个编码太长了,贴一张图片作为例子