一、Docker部署
vllm的优势
1. 环境隔离:Docker通过容器隔离技术为VLLM提供独立的运行环境,避免系统库版本冲突和依赖错误问题。
2. 便捷的跨平台迁移:使用Docker部署的VLLM容器可以轻松迁移到不同的服务器、数据中心或云平台上,大大降低了环境搭建和维护的成本。
3. 轻松扩展:借助容器化,VLLM可以轻松进行水平扩展,通过在多节点上运行多个容器实例实现高并发的推理服务。
4. 统一管理:容器化部署后,可以使用Docker Compose、Kubernetes等容器编排工具进行自动化管理,包括负载均衡、故障转移等操作,极大地简化了多实例部署的管理难度。
二、环境准备
01.Nvidia显卡驱动、CUDA、nvidia-container安装
参考文章:显卡驱动、CUDA、NVIDIA Container Toolkit内网安装教程
02.Docker环境安装
参考文章:Docker 和 Docker Compose 内网离线安装教程
注意:在进行VLLM容器化部署之前,需要确保已在服务器上安装了Docker 和
Nvidia显卡驱动、CUDA、nvidia-container。
三、vllm内网离线部署Qwen3-32B
系统环境:
操作系统:Ubuntu22.04
Docker:28.0.4
Docker-Compose:v2.34.0
显卡驱动:550.144.03
CUDA:12.4
显卡:NVIDIA RTX A5000 * 4
01.拉取vllm/vllm-openai镜像
vllm官方地址:https://github.com/vllm-project/vllm.git
在能联网的机器上拉取vllm/vllm-openai镜像,然后导出镜像,再导入到内网的服务器上,我导入的目录是 /data (根据个人习惯导入对应的目录即可),对应的操作命令如下:
# 1. docker拉取vllm/vllm-openai镜像, 20G 需要等一会。
docker pull vllm/vllm-openai
# 2. 从联网的机器上导出镜像
docker save -o vllm-openai-image.tar vllm/vllm-openai:latest
# 3. 将压缩包vllm-openai-image.tar 上传到 /data 目录
cd /data
# 4. docker加载上传的本地镜像包
docker load < vllm-openai-image.tar
# 5. 查看docker 镜像
docker images
到这一步vllm/vllm-openai镜像就安装成功了。
02.下载Qwen/Qwen3-32B模型文件
常用模型下载地址:
Hugging Face Hub:全球最大的开源模型和数据集托管平台,提供大量 GGUF 格式等多种类型的大模型下载。网址为https://huggingface.co/,国内镜像为https://hf-mirror.com/,访问镜像网站速度更快。
ModelScope 魔搭社区:由阿里云开源的大模型社区,支持 GGUF 格式模型的下载和在线推理。网址是https://www.modelscope.cn/models,可通过 SDK 或 git 进行下载。
GitCode:全新上线了国产模型专区,是国产大模型的汇聚地,为开发者提供便捷获取各类优质模型的途径,网址为https://gitcode.net/。
我是在魔塔社区下载的模型源文件:
下载命令:魔塔社区提供多种下载方式,我是用git下载的:
#Git下载
#请确保 lfs 已经被正确安装
git lfs install
git clone https://www.modelscope.cn/Qwen/Qwen3-32B.git
先在联网的电脑上把模型下载到本地,然后复制模型文件到内网的服务器的/data/目录中,如下:
03.vllm内网部署Qwen/Qwen3-32B
直接运行下面命令即可将Qwen/Qwen3-32B模型运行起来,注意模型文件的路径需要换成自己的,模型的参数根据自己的显卡情况进行调参。
docker run -d --privileged --gpus all --restart unless-stopped --network host -v /data/Qwen3-32B:/app/model --shm-size 32G --name vllm-qwen3 vllm/vllm-openai:latest --model /app/model --served-model-name qwen3:32b --dtype half --kv-cache-dtype=fp8_e4m3 --calculate-kv-scales --port 8008 --tensor-parallel-size 4 --trust-remote-code --max-model-len 32000 --max-num-batched-tokens 64000 --max-num-seqs 4 --gpu-memory-utilization 0.95 --api-key OPENWEBUl123 --reasoning-parser deepseek_r1
格式化后的脚本:
docker run -d --privileged --gpus all \
--restart unless-stopped --network host \
-v /data/DeepSeek-R1-Distill-Qwen-32B:/app/model \
--shm-size 32G \
--name vllm-deepseek vllm/vllm-openai:latest \
--model /app/model \
--served-model-name vllm-qwen3 \
--dtype half \
--kv-cache-dtype=fp8_e4m3 \
--calculate-kv-scales \
--port 8006 \
--tensor-parallel-size 4 \
--trust-remote-code \
--max-model-len 16000 \
--max-num-batched-tokens 32000 \
--max-num-seqs 8 \
--gpu-memory-utilization 0.85 \
--api-key OPENWEBUl123 \
--enable-reasoning \
--reasoning-parser deepseek_r1
运行成功后,查看容器日志(我这里用的是8008端口,APIKey用的是OPENWEBUl123,需要换成自己的:
docker logs -f vllm-qwen3
看见下面日志,则模型启动成功。
docker run
命令中关于 vLLM 部署的各个参数:
容器运行参数:
1.-d:让容器在后台运行,也就是以守护进程模式启动。
2.--privileged:赋予容器近乎宿主机的 root 权限,这样容器才能访问特殊设备,比如 GPU。
3.--gpus all:使容器能够使用宿主机上的所有 GPU 资源。
4.--restart unless-stopped:设定容器的重启策略,除非手动停止,否则容器会在各种情况下自动重启。
5.--network host:容器会直接使用宿主机的网络栈,这样容器内的服务可以通过宿主机的 IP 地址直接访问。
6.-v /data/Qwen3-32B:/app/model:将宿主机的/data/Qwen3-32B目录挂载到容器内的/app/model目录,方便容器读取模型文件。
7.--shm-size 32G:把容器的共享内存大小增加到 32GB,这对多进程间的高效通信很有帮助。
8.--name vllm-qwen3:给运行的容器命名为vllm-qwen3,便于后续的管理和操作。
vLLM 服务参数:
9.--model /app/model:指定容器内模型文件所在的路径,也就是之前挂载的目录。
10.--served-model-name qwen3:32b:设置对外提供服务时模型的名称。
11.--dtype half:将模型参数的数据类型设置为半精度浮点数(FP16),以此来减少内存占用。
12.--kv-cache-dtype=fp8_e4m3:使用 E4M3 格式的 FP8 数据类型来存储键值缓存,进一步优化内存使用。
13.--calculate-kv-scales:开启对键值缓存动态缩放因子的计算,有助于提升量化的精度。
14.--port 8008:设置服务监听的端口为 8008。
15.--tensor-parallel-size 4:将模型在 4 个 GPU 上进行张量并行处理,加快推理的速度。
16.--trust-remote-code:允许执行模型附带的自定义代码,使用时需要注意安全问题。
17.--max-model-len 32000:把模型支持的最大输入长度限制为16000 个 token。
18.--max-num-batched-tokens 64000:设置批处理时允许的最大 token 数量为 32000,这影响着吞吐量。
19.--max-num-seqs 8:限制同时处理的最大序列数为 8。
20.--gpu-memory-utilization 0.95:将 GPU 内存的使用率上限设置为 95%,防止出现内存溢出的情况。
21.--api-key OPENWEBUl123:设置 API 访问的密钥为OPENWEBUl123,用于身份验证。
22.--enable-reasoning:开启推理功能,这可能涉及到多轮对话或者复杂问题的解决。
23.--reasoning-parser deepseek_r1:指定使用 DeepSeek-R1 模型的推理解析器,用于处理特定格式的推理任务。
其他vllm参数:
1. 推理性能优化
# 启用 PagedAttention 优化内存碎片
--swap-space 20 # 每个 GPU 分配 20GB 磁盘交换空间
--gpu-memory-utilization 0.9 # 提高 GPU 内存使用率上限
# 批处理优化
--max-num-batched-tokens 64000 # 增大批处理 token 数量
--max-num-seqs 16 # 增加并发处理的序列数
--continuous-batching # 启用连续批处理,动态调整批大小
# 量化优化
--quantization awq # 使用 AWQ 量化进一步压缩模型
--quantization int8 # 使用 INT8 量化替代 FP16
2. 模型加载与初始化
# 模型加载优化
--model-cache /cache/models # 指定模型缓存路径,加速重启
--download-dir /data/models # 指定模型下载目录
# 权重加载方式
--load-format pt # 直接加载 PyTorch 权重
--load-format safetensors # 加载 safetensors 格式权重(更快)
3. 网络与 API 配置
# API 服务配置
--host 0.0.0.0 # 监听所有网络接口
--workers 2 # 启动多个工作进程(需配合 --no-huggingface-available)
--timeout 300 # 设置请求超时时间(秒)
# 安全增强
--cors-allow-origins "*" # 允许跨域请求
--api-version 2 # 使用 OpenAI API v2 兼容模式
4. 日志与监控
# 日志配置
--log-level info # 日志级别:debug, info, warning, error
--log-file /var/log/vllm.log # 日志输出文件
# 性能监控
--trace # 启用性能追踪
--trace-output /data/trace.json # 输出追踪结果
5. 特定模型优化
# DeepSeek 模型专用优化
--disable-logits-warper # 禁用 logits 调整(部分模型需要)
--rope-scaling linear # 启用 RoPE 缩放以支持更长上下文
--rope-factor 2.0 # 设置 RoPE 缩放因子
# 大模型优化
--pipeline-parallel-size 2 # 结合张量并行与流水线并行
API调用示例:
vLLM 提供实现了 OpenAI Completions API, Chat API 等接口的 HTTP 调用服务,调用服务时,可使用官方 OpenAI Python 客户端或任意 HTTP 客户端:
from openai import OpenAI
client = OpenAI(
base_url="http://ip:8008/v1",
api_key="OPENWEBUl123",
)
completion = client.chat.completions.create(
model="qwen3:32b",
messages=[
{"role": "user", "content": "你是谁?"}
]
)
print(completion.choices[0].message)
提示:
vLLM支持部分OpenAI未包含的参数(如top_k
),可通过在请求的extra_body
参数中传递,例如:extra_body={"top_k": 50}
。
重要信息:
默认情况下,服务器会加载 Hugging Face 模型仓库中的generation_config.json
文件(若存在)。这意味着某些采样参数的默认值可能被模型创建者推荐的配置覆盖。如需禁用此行为,请在启动服务时添加--generation-config vllm
参数。