Vllm部署优化策略及在线推理应用方法
企业级大模型部署推理管理工具:vLLM 部署优化策略及在线推理应用方法
一、vLLM 在线推理概述
在上一节《Part 1. Vllm 框架基础入门与本地私有化部署》中,我们介绍了 vLLM 离线推理的部署及使用方法。离线推理的大模型生命周期为:仅当发生实际调用请求时,模型资源才加载到显存,请求结束后立即卸载。这种模式导致每轮调用都需重新加载模型,响应延迟大,适用于非实时任务,如数据预处理、批量文本生成等。
而对于实时问答、聊天机器人等对实时性要求高的场景,企业级应用需处理数千 QPS,离线推理无法满足需求。此时需掌握 vLLM 的在线推理方法,其是构建大模型应用及高效使用 vLLM 框架启动模型服务进行项目开发的常用且最优方案。
vLLM 在线推理提供遵循 OpenAI API 协议的 http 服务器,实现了 OpenAI 的 Completions API、Chat API 等接口规范,可通过通用接口协议接入其他客户端集成使用,如热门开源项目 Kotaemon、Open webui 等。
二、vLLM 服务器配置参数
(一)离线推理与在线推理的区别
离线推理通过代码调用直接加载、推理、卸载模型,如:
from vllm import LLM
llm = LLM(model="/home/vllm/qwen/Qwen2___5-7B", trust_remote_code=True, max_model_len=4096,)
outputs = llm.generate("你好,请你介绍一下你自己")
print(outputs)
在线推理需先启动 vLLM 模型服务,通过 http 协议访问。启动 Http 服务器使用 vllm serve 命令,可通过 vllm serve --help 查看参数。
(二)核心参数说明
vLLM 使用 FastAPI 托管 http 服务器,其核心参数如下表所示:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
--host |
str |
None |
服务器主机地址。 |
--port |
int |
8000 |
服务器端口,使用 parser.check_port 进行验证。 |
--ssl-keyfile |
str |
None |
SSL 密钥文件路径。 |
--ssl-certfile |
str |
None |
SSL 证书文件路径。 |
--ssl-ca-certs |
str |
None |
CA 证书文件路径。 |
--enable-ssl-refresh |
store_true |
False |
当 SSL 证书文件更改时,刷新 SSL 上下文。 |
--ssl-cert-reqs |
int |
0 |
是否需要客户端证书(参考标准库 ssl 模块)。 |
--root-path |
str |
None |
当应用程序在基于路径的路由代理后面时的 FastAPI root_path。 |
--log-level |
str |
debug |
日志级别。 |
其中,--host 和 --port 是关键参数,决定模型服务的访问地址。例如:
from openai import OpenAI
client = OpenAI(base_url="http://192.168.31.225:8000/v1", api_key="abc",)
completion = client.chat.completions.create(model="Qwen2.5-7B-Instruct", messages=[{"role": "user", "content": "你好,请你介绍一下你自己"},])
print(completion.choices[0].message)
(三)在线推理服务启动参数
在线推理服务启动的基本核心参数如下表所示:
| 参数 | 描述 | 默认值 |
|---|---|---|
--host |
服务器主机地址。 | None |
--port |
服务器端口。 | 8000 |
--api_key |
访问模型服务的 API 密钥。 | None |
--served-model-name |
模型服务启动后通过 http 协议访问的模型名称。 |
无默认值 |
--trust_remote_code |
信任来自 Hugging Face 的远程代码。 | 无默认值 |
--tensor_parallel_size |
张量并行组的数量。 | 1 |
--device |
设备类型,如 cuda、cpu 等。 |
auto |
以 Qwen2.5-7B-Instruct 模型为例,启动命令如下:
vllm serve Qwen2.5-7B-Instruct --served-model-name qwen2.5-7b --api_key zhongyang --host 192.168.31.225 --port 9000 --trust_remote_code --tensor_parallel_size 1 --device cuda
启动成功后,可访问 http://服务器地址:端口/docs 查看 Swagger UI 界面,使用 OpenAI 接口规范访问服务。
三、vLLM 模型推理参数
(一)底层逻辑
离线推理和在线推理共享相同的底层推理引擎 AsyncLLMEngine。当 Http 服务器收到请求时,触发 generate 函数,提供流式和非流式两种生成方式。流式请求在生成新 Token 时立即返回,非流式请求则等待整个文本补全完成后响应。
(二)采样参数
sampling_params 可定义控制响应结果的生成参数,如 temperature、top_p、top_k 等,vLLM 扩展了一些 OpenAI 协议不支持的参数,具体如下表所示:
| 参数 | 描述 |
|---|---|
n |
要返回的输出序列数量。 |
best_of |
从提示生成的输出序列数量,从中返回前 n 个序列。best_of 必须大于或等于 n。 |
presence_penalty |
浮点数,根据新 token 是否出现在已生成文本中对其惩罚,值 > 0 鼓励使用新 token。 |
frequency_penalty |
浮点数,根据新 token 在已生成文本中的频率惩罚,值 > 0 鼓励使用新 token。 |
repetition_penalty |
浮点数,根据新 token 是否在提示和已生成文本中出现惩罚,值 > 1 鼓励使用新 token。 |
temperature |
浮点数,控制采样随机性,较低值使模型更确定,零为贪婪采样。 |
top_p |
浮点数,控制考虑的 top token 累积概率,必须在 (0, 1] 之间。 |
top_k |
整数,控制考虑的 top token 数量,设置为 -1 考虑所有 token。 |
min_p |
浮点数,表示相对于最可能 token 的概率,考虑 token 的最小概率,必须在 [0, 1] 之间。 |
seed |
用于生成的随机种子。 |
stop |
停止生成的字符串列表,生成这些字符串时停止,返回输出不包含停止字符串。 |
stop_token_ids |
停止生成的 token 列表,生成这些 token 时停止,返回输出可能包含停止 token。 |
bad_words |
不允许生成的单词列表。 |
include_stop_str_in_output |
是否在输出文本中包含停止字符串,默认值为 False。 |
ignore_eos |
是否忽略 EOS token,在生成 EOS token 后继续生成 token。 |
max_tokens |
每个输出序列生成的最大 token 数量。 |
min_tokens |
每个输出序列生成的最小 token 数量,直到可以生成 EOS 或 stop_token_ids。 |
logprobs |
每个输出 token 返回的 log 概率数量,设置为 None 时不返回概率。 |
prompt_logprobs |
每个提示 token 返回的 log 概率数量。 |
detokenize |
是否对输出进行反分词,默认值为 True。 |
skip_special_tokens |
是否在输出中跳过特殊 token。 |
spaces_between_special_tokens |
是否在输出中的特殊 token 之间添加空格,默认值为 True。 |
logits_processors |
修改 logits 的函数列表,基于先前生成的 token,并可选地将提示 token 作为第一个参数。 |
truncate_prompt_tokens |
如果设置为整数 k,将仅使用提示的最后 k 个 token(即左截断),默认值为 None。 |
guided_decoding |
如果提供,引擎将根据这些参数构建引导解码 logits 处理器,默认值为 None。 |
logit_bias |
如果提供,引擎将构建一个应用这些 logit 偏置的 logits 处理器,默认值为 None。 |
allowed_token_ids |
如果提供,引擎将构建一个 logits 处理器,仅保留给定 token ids 的分数,默认值为 None。 |
extra_args |
任意额外参数,可供自定义采样实现使用,未被任何树内采样实现使用。 |
在调用时,可通过 extra_body 参数控制模型推理的生成参数,示例如下:
from openai import OpenAI
client = OpenAI(base_url="http://192.168.31.225:9000/v1", api_key="abc",)
completion = client.chat.completions.create(
model="qwen2.5-7b",
messages=[{"role": "user", "content": "你好,请你介绍一下你自己"},],
extra_body={
"temperature": 0.5,
"top_p": 0.9,
"top_k": 10,
"max_tokens": 10,
"repetition_penalty": 1.0,
"length_penalty": 1.0,
"stop": ["\n"]
}
)
print(completion.choices[0].message.content)
四、vLLM 模型启动参数
(一)底层工作原理
vLLM 框架需根据业务需求调整模型推理的启动参数,其底层工作原理涉及 AsyncLLMEngine 引擎的初始化,包括 Create worker、Cache engine、Scheduler 的初始化。Worker 负责 GPU 相关任务,加载模型权重到 GPU 上,可能因显存不足报错。
(二)KV 缓存与显存计算
vLLM 提出 PagedAttention 机制,将 KV 缓存分割为固定大小的块,通过虚拟内存管理解决 GPU 内存碎片化问题。显存计算涉及模型架构参数,如 max_model_len、block_size、num_kv_heads 等,计算公式为:ceil(max_model_len / block_size) * page_size_bytes,其中 page_size_bytes = 2 * block_size * num_kv_heads * head_size * dtype_size。
例如,对于 Qwen2.5-7B 模型,max_model_len = 131072,block_size = 16,计算得出 KV 缓存内存需求约为 7.00 GB。若显存不足,可通过降低 max_model_len、调整 gpu_memory_utilization 等参数解决。
(三)调度器配置参数
调度器配置参数包括 max_num_seqs、max_model_len 等,max_num_seqs 限制并发请求数量,max_model_len 限制序列最大长度。例如,设置 max_model_len = 100000,max_num_seqs = 16,可在有限显存下启动模型。
五、推理类模型的在线推理
vLLM 框架支持 DeepSeek R1 系列、Qwen QwQ 模型和 IBM Granite 3.2 language models 的推理类模型接口兼容,其中只有 QWQ 模型支持 Function Calling 功能。
启动推理模型时,需指定 --enable-reasoning 和 --reasoning-parser deepseek_r1 参数,示例如下:
vllm serve DeepSeek-R1-Distill-Qwen-7B --max_model_len 50000 --served-model-name deepseek-r1:7b --gpu_memory_utilization 0.90 --tensor-parallel-size 2 --api_key muyu --host 192.168.110.131 --port 9000 --trust_remote_code --enable-reasoning --reasoning-parser deepseek_r1
推理模型生成回复时会产生思考过程,可通过 reasoning_content 属性提取。启用流式输出时,添加 stream=True 参数即可。
通过合理配置服务器参数、推理参数和启动参数,结合不同模型的特点,可高效利用 vLLM 框架实现大模型的在线推理,满足实时性和高并发的业务需求。
更多推荐



所有评论(0)