企业级大模型部署推理管理工具:vLLM 部署优化策略及在线推理应用方法

一、vLLM 在线推理概述

在上一节《Part 1. Vllm 框架基础入门与本地私有化部署》中,我们介绍了 vLLM 离线推理的部署及使用方法。离线推理的大模型生命周期为:仅当发生实际调用请求时,模型资源才加载到显存,请求结束后立即卸载。这种模式导致每轮调用都需重新加载模型,响应延迟大,适用于非实时任务,如数据预处理、批量文本生成等。

而对于实时问答、聊天机器人等对实时性要求高的场景,企业级应用需处理数千 QPS,离线推理无法满足需求。此时需掌握 vLLM 的在线推理方法,其是构建大模型应用及高效使用 vLLM 框架启动模型服务进行项目开发的常用且最优方案。

vLLM 在线推理提供遵循 OpenAI API 协议的 http 服务器,实现了 OpenAICompletions APIChat API 等接口规范,可通过通用接口协议接入其他客户端集成使用,如热门开源项目 KotaemonOpen 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 设备类型,如 cudacpu 等。 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 可定义控制响应结果的生成参数,如 temperaturetop_ptop_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 workerCache engineScheduler 的初始化。Worker 负责 GPU 相关任务,加载模型权重到 GPU 上,可能因显存不足报错。

(二)KV 缓存与显存计算

vLLM 提出 PagedAttention 机制,将 KV 缓存分割为固定大小的块,通过虚拟内存管理解决 GPU 内存碎片化问题。显存计算涉及模型架构参数,如 max_model_lenblock_sizenum_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 = 131072block_size = 16,计算得出 KV 缓存内存需求约为 7.00 GB。若显存不足,可通过降低 max_model_len、调整 gpu_memory_utilization 等参数解决。

(三)调度器配置参数

调度器配置参数包括 max_num_seqsmax_model_len 等,max_num_seqs 限制并发请求数量,max_model_len 限制序列最大长度。例如,设置 max_model_len = 100000max_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 框架实现大模型的在线推理,满足实时性和高并发的业务需求。

Logo

免费领 200 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐