TellWorldAI 世界档案
问档案English

首页›实践›实践

实践

Qwen2.5-Coder 用 vLLM 部署

用 vLLM 离线推理和 OpenAI 兼容服务部署 Qwen2.5-Coder-7B-Instruct,并用 curl 调用、用自带脚本比较推理吞吐。读完能跑通第一次代码生成。

这篇适合谁

适合想用 Qwen2.5-Coder 写代码、又希望自己搭一个推理服务的开发者。读完你应该能用 vLLM 启动 Qwen2.5-Coder-7B-Instruct,用 curl 发出补全和对话请求,并用 vLLM 自带的脚本比较它和 Transformers 的吞吐。

vLLM 是什么

vLLM 是面向大语言模型的推理和部署系统。它用 PagedAttention 算法管理 KV 缓存,减少显存浪费[1]。它还支持异步处理和连续批处理请求,以提高推理吞吐[1]。vLLM 能和 Hugging Face 模型配合使用,并兼容 OpenAI API 服务器,支持在多块 GPU 之间做分布式推理[1]。

环境准备

测试环境是 Ubuntu 22.04、Python 3.12、CUDA 12.1 和 PyTorch 2.4.0[1]:

----------------
ubuntu 22.04
python 3.12
cuda 12.1
pytorch 2.4.0
----------------

默认你已经装好了带 CUDA 的 PyTorch;如果还没装,需要先自行安装[1]。接下来换成清华的 pip 源加速下载,再安装依赖[1]:

python -m pip install --upgrade pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install modelscope==1.20.0
pip install transformers==4.46.2
pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 --index-url https://download.pytorch.org/whl/cu121
pip install vllm==0.6.3.post1
pip install accelerate==0.26.0

安装顺序照着上面的命令来即可。其中 torch 要指定 cu121 的索引地址,和 CUDA 12.1 对应[1]。

下载模型

模型可以用 modelscope 下载。snapshot_download 的第一个参数是模型名称,local_dir 指定下载目录[1]。Qwen2.5-Coder-7B-Instruct 约 16 GB,示例中的下载大约花了 12 分钟[1]。脚本如下,运行前要把 local_dir 改成你自己的路径[1]:

from modelscope import snapshot_download

snapshot_download('Qwen/Qwen2.5-Coder-7B-Instruct', local_dir='/root/autodl-tmp/Qwen2.5-Coder-7B-Instruct')

离线推理:用 LLM 直接生成

vLLM 的 LLM 类用于离线推理,SamplingParams 用于设置采样参数[1]。只要传入模型名称或路径,vLLM 就会处理模型和分词器的初始化,不必手动加载[1]。下面的函数封装了这一步[1]:

def prepare_model(model_path,  max_tokens=512, temperature=0.8, top_p=0.95, max_model_len=2048):
    # 初始化 vLLM 推理引擎
    llm = LLM(model=model_path, tokenizer=model_path, max_model_len=max_model_len,trust_remote_code=True)
    return llm

采样时,temperature 控制生成文本的多样性,top_p 控制核心采样的概率范围[1]。示例还把 stop_token_ids 设为 [151329, 151336, 151338][1]。

对话模型要先套用聊天模板,示例中的写法是[1]:

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

启动 OpenAI 兼容服务

vLLM 可以直接创建兼容 OpenAI API 的服务器。默认在 http://localhost:8000 启动,一次托管一个模型,并提供模型列表、completions 和 chat completions 接口[1]。completions 适合按提示续写文本,chat completions 适合多轮对话[1]。

启动命令如下[1]:

python -m vllm.entrypoints.openai.api_server --model /root/autodl-tmp/Qwen2.5-Coder-7B-Instruct  --served-model-name Qwen2.5-Coder-7B-Instruct --max-model-len=2048

启动参数里,--host 和 --port 指定地址,--model 指定模型,--served-model-name 指定对外的模型名,--max-model-len 指定最大长度,--chat-template 指定聊天模板[1]。示例中的模型名 Qwen2.5-Coder-7B-Instruct 就是用 --served-model-name 设的,请求时要用同一个名字[1]。

先用 curl 查看模型列表[1]:

curl http://localhost:8000/v1/models

用 curl 测试两种接口

补全接口用 prompt 字段传入提示,max_tokens 限制输出长度,temperature 设为 0 时输出更稳定[1]:

curl http://localhost:8000/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "Qwen2.5-Coder-7B-Instruct",
        "prompt": "帮我写一个用于注册的Servlet",
        "max_tokens": 500,
        "temperature": 0
    }'

对话接口用 messages 数组,每条消息带上 role 和 content[1]:

curl http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "Qwen2.5-Coder-7B-Instruct",
        "messages": [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "你好,你都会什么编程语言?"}
        ]
    }'

服务端在处理请求时会打印日志和统计信息,可以据此观察每次请求的情况[1]。

和 Transformers 比较推理速度

vLLM 自带 benchmark_throughput.py 脚本,可以直接使用,也可以从 GitHub 下载最新版[1][2]。它的主要参数包括:--backend 可选 vllm、hf 和 mii,分别对应 vLLM、HuggingFace 和 Mii 后端;--input-len 和 --output-len 设置输入和输出长度;--num-prompts 设置请求数量;--hf-max-batch-size 只对 hf 后端有效,并且必须填写[1]。

vLLM 后端的测试命令和结果如下[1]:

python benchmark_throughput.py \
	--model /root/autodl-tmp/Qwen2.5-Coder-7B-Instruct \
	--backend vllm \
	--input-len 64 \
	--output-len 128 \
	--num-prompts 25 \
	--seed 2024 \
    --dtype float16 \
    --max-model-len 512

Transformers 后端的测试命令和结果如下[1]:

python benchmark_throughput.py \
	--model /root/autodl-tmp/Qwen2.5-Coder-7B-Instruct \
	--backend hf \
	--input-len 64 \
	--output-len 128 \
	--num-prompts 25 \
	--seed 2024 \
	--dtype float16 \
    --hf-max-batch-size 25

两组结果中,vLLM 的输出吞吐为 1024.10 tokens/s,Transformers 为 722.39 tokens/s,前者约为后者的 1.4 倍[1]。这次测试在单张 RTX 3090 24G 上完成。它不是严格的基准测试,每台机器的配置和环境都不同,结果只能作为参考。要得到可靠的结论,应该在自己的环境里多跑几组并取平均[1]。

下一步

vLLM 的参数和更多部署方式,可以以官方 GitHub 仓库中的基准脚本和文档为准[2]。

本文改编自 Datawhale 开源项目 self-llm 中的教程《03-Qwen2.5-7B-Instruct vLLM 部署调用》[1],原文以 Apache-2.0 许可证发布。

来源

  1. 1
    03-Qwen2.5-7B-Instruct vLLM 部署调用Datawhale self-llm (Apache-2.0)
  2. 2
    benchmark_throughput.pyvLLM project (GitHub)

引用本页: Qwen2.5-Coder 用 vLLM 部署. TellWorld, https://www.tellworld.net/zh/practice/practice-qwen2-5-coder-vllm. 更新于 2026-11-14

相关动态