Skip to main content
分享时间:2025-05-11  |  主讲:程治玮

录屏回看


vLLM 快速部署指南

1 什么是 vLLM?

vLLM 是一个高效、易用的大语言模型(LLM)推理和服务框架,专注于优化推理速度和吞吐量,尤其适合高并发的生产环境。它由加州大学伯克利分校的研究团队开发,并因其出色的性能成为当前最受欢迎的 LLM 推理引擎之一。 vLLM 同时支持在 GPU 和 CPU 上运行,本文将会分别介绍 vLLM 使用 GPU 和 CPU 作为后端时的安装与运行方法。

2 前提准备

2.1 购买虚拟机

如果本地不具备 GPU 环境,可考虑通过云服务提供商(如阿里云、腾讯云等)购买 GPU 服务器。 操作系统建议选择 Ubuntu 22.04,GPU 型号可根据实际需求进行选择。由于大语言模型通常占用较多磁盘空间,建议适当增加磁盘容量。

2.2 虚拟环境

推荐使用 uv 来管理 python 虚拟环境,执行以下命令安装 uv:

3 安装

3.1 使用 GPU 作为 vLLM 后端

3.1.1 系统要求

vLLM 包含预编译的 C++ 和 CUDA (12.6) 二进制文件,需满足以下条件:
  • 操作系统:Linux
  • Python 版本:3.9 ~ 3.12
  • GPU:计算能力 7.0 或更高(如 V100、T4、RTX20xx、A10、A100、L4、H100 等)
注:计算能力(Compute capability)定义了每个 NVIDIA GPU 架构的硬件特性和支持的指令。计算能力决定你是否可以使用某些 CUDA 或 Tensor 核心功能(如 Unified Memory、Tensor Core、动态并行等),并不直接代表 GPU 的计算性能。

3.1.2 安装和配置 GPU 依赖

可以使用以下命令一键安装相关依赖,该脚本会安装 NVIDIA GPU Driver,NVIDIA Container Toolkit,以及配置 NVIDIA Container Runtime(后续通过 Docker 运行 vLLM 时需要)。

3.1.3 安装 vLLM

创建 Python 虚拟环境:
安装 vLLM:

3.2 使用 CPU 作为 vLLM 后端

3.2.1 系统要求

  • 操作系统:Linux
  • Python 版本:3.9 ~ 3.12
  • 编译器: gcc/g++ >= 12.3.0 (可选,建议)

3.2.2 安装编译依赖

vLLM 当前并没有为 CPU 提供预构建的安装包或者镜像,需要自己根据源码进行编译。
首先,安装推荐的编译器。建议使用 gcc/g++ >= 12.3.0 作为默认编译器以避免潜在问题。例如,在 Ubuntu 22.4 上,你可以运行:
然后克隆 vLLM 仓库:
接着,安装用于构建 vLLM CPU 后端的 Python 包:

3.2.3 安装 vLLM

最后,构建并安装 vLLM CPU 后端:

3.3 使用 Docker 运行 vLLM

vLLM 官方提供了 Docker 镜像用于部署。执行以下命令使用 Docker 来运行 GPU 后端的 vLLM:
以下是命令参数的解释:
  • --runtime nvidia: 指定使用 NVIDIA 容器运行时,这是运行需要 GPU 的容器的必要设置。
  • --gpus all: 允许容器访问主机上的所有 GPU 资源。如果你只想使用特定的 GPU,可以指定 GPU ID,例如使用 --gpus '"device=0,1"' 指定使用 0 和 1 号 GPU(注意:device 前后还有个单引号,否则会看到这个报错:cannot set both Count and DeviceIDs on device request.)。如果想直接设置指定数量的 GPU,例如可以使用 --gpus 2,使用 2 个 GPU。
  • -v ~/.cache/huggingface:/root/.cache/huggingface: 将主机上的 Hugging Face 缓存目录挂载到容器内。这样可以在容器重启后重用已下载的模型,避免重复下载,节省时间和网络流量。
  • -p 8000:8000: 将容器内的 8000 端口映射到主机的 8000 端口,使得可以通过 http://localhost:8000 访问 vLLM 服务。
  • 你可以使用 ipc=host 标志或 --shm-size 标志,让容器访问宿主机的共享内存。vLLM 使用 PyTorch,而 PyTorch 在底层通过共享内存在进程之间传递数据,尤其是在进行张量并行推理时。在使用多个 GPU 进行推理时需要设置该参数。
  • vllm/vllm-openai:latest: 使用的 Docker 镜像,latest 表示最新版本的 vLLM OpenAI 兼容服务器镜像。
  • --model Qwen/Qwen2.5-1.5B-Instruct: 传递给 vLLM 服务的参数,指定要加载的模型为 Qwen/Qwen2.5-1.5B-Instruct
如果要使用 CPU 作为后端来运行 vLLM 可以使用这个仓库的镜像。
vLLM 提供了两种主要的推理模式:离线推理(Offline Inference)和在线推理(Online Serving),适用于不同的应用场景和需求。这两种模式的区别如下:

4 离线推理和在线推理的区别

离线推理(offline inference)和在线推理(online inference)的主要区别在于使用场景、延迟要求、资源调度方式等方面,简单总结如下:

4.1 离线推理

定义: 对一批输入数据进行集中处理,通常不要求实时返回结果。特点如下:
  • 批处理:常用于处理大量输入,如日志分析、推荐系统预计算。
  • 低延迟要求:结果可以晚些返回,不影响用户体验。
  • 资源利用高:系统可以在空闲时充分利用 GPU/CPU 资源。
  • 示例场景:每天夜间跑用户兴趣画像、预生成广告文案等。

4.2 在线推理

定义: 针对用户实时请求进行推理,立即返回结果。特点如下:
  • 实时响应:响应时间通常要求在几百毫秒以内。
  • 延迟敏感:高并发、低延迟是核心指标。
  • 资源分配稳定:服务需长时间在线、资源预留固定。
  • 示例场景:聊天机器人、搜索联想、智能客服等。

5 离线推理

安装好 vLLM 后,你可以开始对一系列输入提示词进行文本生成(即离线批量推理)。以下代码是 vLLM 官网提供的示例:
在上面的代码中,使用了 SamplingParams 来指定采样过程的参数。采样温度设置为 0.8,核采样概率设置为 0.95。下面解释一下这两个参数的用途: Sampling Temperature(采样温度) 和 Nucleus Sampling Probability(核采样概率/Top-p) 是大语言模型生成文本时常用的两个采样参数,用于控制输出文本的多样性和质量。
  • 采样温度(Sampling Temperature)
    • 作用:控制生成文本的“随机性”或“创造性”。
    • 原理:温度会对模型输出的概率分布进行缩放。温度越低(如0.5),高概率的词更容易被选中,生成结果更确定、重复性更高;温度越高(如1.2),低概率的词被选中的机会增加,文本更有多样性但可能更混乱。
    • 具体来说,temperature=0.8 表示在概率分布上做了一定程度的“平滑”,比默认的 1.0 更偏向于选择高概率词,但仍保留一定的多样性。
  • 核采样概率(Nucleus Sampling Probability / Top-p)
    • 作用:控制每一步生成时考虑的候选词集合大小,动态平衡文本的多样性和合理性。
    • 原理:Top-p(核采样)会将所有词按概率从高到低排序,累加概率,直到总和首次超过 0.95 为止,只在这部分“核心”词中随机采样。
这里用一个例子来解释这两个采样参数之间的关系,假设模型下一步可以说 “猫 狗 老虎 大象 猴子 乌龟 老鹰 鳄鱼 蚂蚁 …”(有上万个词):
  • Temperature 是调整每个词出现的概率(“猫”的概率是 30%,你可以把它调得更大或更小);
  • Top-p 是把所有词排序后,只保留累计概率达到 95% 的前几个词,比如前 7 个,然后从中挑一个。
输出是通过 llm.generate 方法生成的。该方法会将输入提示加入 vLLM 引擎的等待队列,并调用 vLLM 引擎以高吞吐量生成输出。最终输出会以 RequestOutput 对象列表的形式返回,每个对象包含完整的输出 token。 执行以下代码运行程序:
默认情况下,vLLM 会从 Hugging Face 下载模型。如果你想使用来自 ModelScope 的模型,请设置 VLLM_USE_MODELSCOPE 环境变量。

6 在线推理

vLLM 可以部署为实现 OpenAI API 协议的服务器。默认情况下,服务器在 http://localhost:8000 启动。你可以通过 --host--port 参数指定地址。服务器目前一次只能托管一个模型,实现了 list modelscreate chat completion 等端点。 运行以下命令以启动 vLLM 服务器,并使用 Qwen/Qwen2.5-1.5B-Instruct 模型:
启动后的输出如下(GPU 后端):
启动后的输出如下(CPU 后端):
这个服务器可以像 OpenAI API 一样以相同的格式进行请求。例如,要列出模型:

6.1 使用 vLLM 的 OpenAI Completions API

你可以使用输入提示词查询模型:
由于服务器与 OpenAI API 兼容,你也可以直接使用 openai 的 Python SDK 进行请求。
执行以上代码的输出如下:

6.2 使用 vLLM 的 OpenAI Chat Completions API

vLLM 还支持 OpenAI 的 Chat Completions API。该 API 提供了一种更加动态、交互式的模型交流方式,支持往返对话并在聊天历史中保存上下文。这种方式特别适用于需要保持上下文连贯性或需要更详细解释的任务,能够让模型理解之前的对话内容,从而提供更加连贯、个性化的响应。
你同样可以使用 OpenAI 的 Python SDK 进行请求。
响应如下:

7 vLLM 在使用 GPU 和 CPU 后端时的性能对比

CPU 后端与 GPU 后端在性能上存在显著差距,因为 vLLM 的架构最初是专为 GPU 优化设计的。若使用 CPU 后端,需要进行一系列优化以提升其运行效率。此外,GPU 拥有更强的并行计算能力,在大语言模型推理任务中相较于 CPU 更具优势。下面我们将简要对比 vLLM 在使用 CPU 和 GPU 后端时的推理性能差距。 当前进行测试的服务器配置参数如下:
  • CPU:32 vCPU
  • 内存:188 GiB
  • GPU:NVIDIA A10
客户端使用以下命令循环向 vLLM 服务器发送请求:
vLLM 在 CPU 后端下的启动命令如下:
vLLM CPU 后端每秒生成的 token 数大概在 10 几个左右。
在 GPU 后端中,vLLM 默认启用 Prefix Caching(v1 版本默认启用,v0 默认禁用),以提升推理性能;而在 CPU 后端中,该功能默认关闭。为确保对比的公平性,添加 --no-enable-prefix-caching 参数手动禁用该功能。
vLLM GPU 后端每秒生成的 token 数大概在 130 几个左右,性能大概是 CPU 后端的 10 倍左右。

8 总结

本文系统介绍了高性能 LLM 推理框架 vLLM 的部署实践,涵盖环境准备、GPU/CPU 后端配置、离线推理与在线推理部署等环节。最后通过实际测试,深入比较了两种后端在推理吞吐量和响应速度方面的性能差异。