在之前的文章中,我们介绍了如何使用ollama部署qwen3,一般而言,ollama适合个人部署使用,在面对企业级的模型部署时,一般更建议使用vLLM
vLLM(高效大语言模型推理库)是一个专为大语言模型(LLMs)优化推理速度的开源框架,由斯坦福大学系统研究组开发。其核心目标是通过创新的软件和算法设计,大幅提升 LLM 在生成文本时的吞吐量和效率,尤其适用于处理高并发的推理请求。
从各种基准测试数据来看,同等配置下,使用VLLM 框架与 Transformer 等传统推理库相比,其吞吐量可以提高个数量级,这归功于以下几个特性:
- 高级 GPU优化:利用CUDA和 PyTorch 最大限度地提高 GPU 利用率,从而实现更快的推理速度。 0llama 其实是对 CPU-GPU 的混合应用,但 vllm 是针对纯 GPU 的优化。
- 高级内存管理:通过 PagedAttention 算法实现对 KV cache 的高效管理,减少内存浪费,从而优化大模型的运行效率。
- 批处理功能:支持连续批处理和异步处理,从而提高多个并发请求的吞吐量
- 安全特性:内置 API密钥支持和适当的请求验证,不像其他完全跳过身份验证的框架
- 易用性:vLLM 与 HuggingFace 模型无缝集成,支持多种流行的大型语言模型,并兼容 0penAI 的 API 服务。
VLLM的安装仍旧依赖于python环境,因此建议在虚拟环境下进行安装,如下创建并启动虚拟环境
conda create --name vllm python=3.11
conda activate vllm
然后使用pip直接安装vllm即可
pip install bitsandbytes>=0.45.3
pip install --upgrade vllm
不同于ollama,vllm部署模型需要依赖于模型的源权重文件,可参考以下配置选择自己的模型
模型名称 | 显存需求(推理) | 推荐 CPU | 推荐 GPU | 推荐内存 |
---|---|---|---|---|
Qwen3-0.6B | 1GB+ | Xeon W-2400 系列 | GTX 1050 | 4GB+ |
Qwen3-1.7B | 2GB+ | Xeon W-2400 系列 | GTX 1660 | 8GB+ |
Qwen3-4B | 8GB+ | Xeon W-2400 系列 | RTX 3090 | 16GB+ |
Qwen3-8B | 14GB+ | Xeon W-2400 系列 | RTX 4080 | 16GB+ |
Qwen3-14B | 24GB+ | Xeon W-3400 系列 | RTX 3090*2 | 32GB+ |
Qwen3-32B | 58GB+ | Xeon W-3400 系列 | RTX 3090 * 4 | 64GB+ |
Qwen3-30B-A3B | 55GB+ | Xeon W-3400 系列 | RTX 3090 * 4 | 64GB+ |
Qwen3-235B-A22B | 350GB+ | EPYC 7002 系列 | H204/A1008 | 512GB+ |
这里为方便做测试,仅下载Qwen3-1.7B使用,下载方式直接使用官网提供的下载方式即可
Qwen3-1.7B · 模型库
Qwen3的模型都通过modelscope进行管理,在下载前,请先通过如下命令安装ModelScope
pip install modelscope
下载完整模型库
modelscope download --model unsloth/Qwen3-1.7B
CUDA_VISIBLE_DEVICES=3 vllm serve Qwen3-1.7B --host 0.0.0.0 --port 8080 --gpu-memory-utilization 0.4 --max-model-len 32768 --enable-reasoning --reasoning-parser deepseek_r1
以下是相关参数说明,更多使用详见官网vLLM - Qwen
- CUDA_VISIBLE_DEVICES=3,设置仅使用第 3 块 GPU(从 0 开始计数),如果使用多卡启动,可使用该参数
vllm serve
:启动 vLLM 推理服务,基于 HTTP 协议提供模型 API。--host 0.0.0.0
:允许从任意 IP 地址访问服务(生产环境建议限制为特定 IP)。--port 8080
:服务监听的端口号,可自定义(需确保端口未被占用)。--gpu-memory-utilization 0.4
:
- 限制 GPU 内存使用率为 40%(默认 90%),避免内存溢出。
- 适用场景:GPU 显存不足(如 Qwen3-1.7B 通常需 2-4GB 显存,此配置留足缓冲)。
- vllm启动模型前会进行前置检查,其中一项检查就是保证显卡有足够的显存,默认情况下vllm认为显存空闲率为90%才能启动模型,但Qwen3-1.7b不需要这么多的显存,因此添加该参数进行限制
--max-model-len 32768
:
- 设置模型支持的最大序列长度为 32768 tokens(约 24000 汉字)。
- 适用场景:处理长文本对话、文档分析等需要长上下文的任务。
--enable-reasoning
:
- 启用模型的推理能力,支持结构化输出(如工具调用、逻辑推理步骤)。
- 原理:通过特殊 prompt 引导模型生成符合特定格式的响应(如 JSON、Markdown)。
--reasoning-parser deepseek_r1
:
- 指定使用 DeepSeek R1 解析器处理推理输出。
- 作用:将模型生成的自然语言转换为可执行的工具调用指令(如调用 Python 函数、API)。
不同于ollama,使用vllm部署启动的模型,需要显示使用api进行调用,如下所示
from openai import OpenAI
openai_api_key = "EMPTY" # 由于使用的是本地服务,key可以为空或任意值
openai_api_base = "http://10.126.56.41:8080/v1"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base
)
prompt = "在单词\"strawberry\"中,总共有几个R?"
messages = [
{"role": "user", "content": prompt}
]
# 确认模型名称与实际目录一致
response = client.chat.completions.create(
model="Qwen3-1.7B",
messages=messages
)
print(response.choices[0].message.content)
需要说明一点的是
# 确认模型名称与实际目录一致
response = client.chat.completions.create(
model="Qwen3-1.7B",
messages=messages
)
上述调用模型的代码中model参数的值(即模型路径)必须要与vllm serve启动时使用的模型路径一致,否则会出现报错找不到模型文件,假如上述代码修改为
# 确认模型名称与实际目录一致
response = client.chat.completions.create(
model="./Qwen3-1.7B",
messages=messages
)
哪怕二者都表示相对路径,但是调用代码的模型路径与vllm加载模型的路径不一致,也会报错,如下所示
openai.NotFoundError: Error code: 404 - {'object': 'error', 'message': 'The model `./Qwen3-1.7B` does not exist.', 'type': 'NotFoundError', 'param': None, 'code': 404}
以下是脚本启动后的结果