在从 Hugging Face 下载大模型时,我们下载了什么中,我们聊了下载大模型时,各类文件的作用。今天,我们继续深入,看看如何用 vLLM 搭建在线推理服务,并解决 OpenAI API 升级后的一些兼容性问题。
本文重点:基于 vLLM 提供的 OpenAI API 兼容接口,实现在线推理(Online Inference)。
vLLM 推理服务的基本启动方式
参考 vLLM 官方文档 openai-compatible-server 和 Engine Arguments,我们可以快速启动一个大模型推理服务:
python
python3 -m vllm.entrypoints.openai.api_server \
--host 0.0.0.0 \
--port 8000 \
--dtype float16 \
--served-model-name xxx \
--model path_to_model \
--trust-remote-code \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.9 \
--enable-prefix-caching \
--enable-chunked-prefill \
--task generate \
--allowed-local-media-path /data/llms/images \
--max-model-len 8192 \
--generation-config path_to_model_generation_config
大部分参数的含义都可以直接参考官方文档,这里我们重点关注 --generation-config
这个参数。
这个参数的作用是指定 生成配置文件 ,也就是上一篇文章《从 Hugging Face 下载大模型时,我们下载了什么》中提到的 推理与生成配置 中的 generation_config.json
。
我们以 Qwen2.5 系列模型的 generation_config.json
为例,看看这个文件包含哪些关键参数:
json
{
"bos_token_id": 151643,
"pad_token_id": 151643,
"do_sample": true,
"eos_token_id": [
151645,
151643
],
"repetition_penalty": 1.05,
"temperature": 0.7,
"top_p": 0.8,
"top_k": 20,
"transformers_version": "4.37.0"
}
bos_token_id
、pad_token_id
、eos_token_id
:一些特殊 token 的 ID,可参考tokenizer.json
repetition_penalty
:重复 token 生成的惩罚项,控制文本的重复度temperature
、top_p
、top_k
:控制生成结果的多样性(top_k 与 top_p 一般二选一)
根据 vLLM 文档 Inference Parameters,temperature
、top_p
、top_k
的默认值分别是 1.0、1.0、-1。
OpenAI API 兼容性问题 & 解决方案
在 OpenAI API 最新版本的 Chat Completion 文档中,我们可以看到,一些常见的参数,比如 repetition_penalty
和 top_k
,已经被移除。
那么,问题来了:如果我们的推理服务基于 vLLM,而调用方代码仍然需要使用这些参数,应该怎么办?
解决方案来自 GitHub 讨论:在 API 请求时,使用 extra_body
参数,把不受支持的参数塞进去。
示例代码如下:
python
from openai import OpenAI
client = OpenAI()
client.chat.completions.create(
model='gpt-4',
messages=....,
extra_body={'repetition_penalty': 2},
)
这样,我们就可以在 使用 vLLM 作为推理引擎时,继续兼容 OpenAI API 旧版参数 了。
此外,在测试 Qwen2.5-VL 系列模型时,我发现 调整 top_k
比调整 top_p
更有效 ,可以更明显地影响生成质量。如果你在调优 VL 模型的生成效果时,可以重点关注 top_k
。
总结
- vLLM 提供了兼容 OpenAI API 的推理服务,但
generation_config.json
仍然需要合理配置。 - OpenAI API 升级后,一些老参数(如
repetition_penalty
、top_k
)已被移除,但可以用extra_body
继续传递。 - 在 Qwen2.5-VL 这样的模型中,
top_k
的调整往往比top_p
更有效。
希望这篇文章能帮你更好地理解 vLLM 在 OpenAI API 兼容性上的处理方法。如果你在实际使用过程中遇到了其他问题,欢迎留言交流!
感谢阅读,如果这篇文章对你有所帮助,欢迎关注算法工程笔记公众号!