vLLM 是一个为大语言模型(LLM)推理服务量身打造的库,它通过一系列底层优化,极大地提升了 LLM 的吞吐量和处理效率。当我们需要自己托管模型时,无论是出于数据隐私、成本控制还是定制化需求,vLLM 都成了一个非常值得考虑的选项。
一个很有意思的点是,vLLM 的 API 设计与 OpenAI 的 API 兼容。这意味着,如果你现有的代码是基于 OpenAI API 开发的,理论上可以无缝切换到自己用 vLLM 托管的模型服务,而无需大规模重构代码。
这篇文章会带你走一遍完整的部署流程,先是在我们自己的电脑上用 Docker 跑起来,这对于开发和测试非常方便。然后,我们会把目光投向云端,看看如何在 Google Cloud 上部署一个可扩展的 vLLM 服务。
本地部署:用 Docker 在 CPU 上跑起 vLLM
vLLM 的设计初衷是为了在 CUDA 平台(也就是 NVIDIA GPU)上发挥极致性能。但现实是,不是每个人手头都有高端 GPU。好在 vLLM 官方也提供了纯 CPU 环境的 Docker 支持,这让没有 GPU 的我们也能体验和使用它。
我们这里就专注于 CPU 部署。为了避免繁琐的环境配置和依赖问题,使用 Docker 是最直接的办法。vLLM 官方仓库里已经为我们准备好了 Dockerfile,我们只需要基于它来构建镜像就行。
准备 Docker 镜像
首先,你需要把 vLLM 的官方仓库克隆或下载到本地。
git clone https://github.com/vllm-project/vllm.git
cd vllm
vLLM 仓库里提供了两个用于 CPU 的 Dockerfile:
Dockerfile.cpu:用于常规的 x86架构 CPU。Dockerfile.arm:用于 ARM 架构的 CPU,比如苹果的 M 系列芯片。
我用的是 Mac M2,所以会选择 Dockerfile.arm。在 vLLM 的项目根目录下,执行以下命令来构建镜像:
docker build -f Dockerfile.arm -t vllm-cpu --shm-size=4g .
这条命令的参数解释一下:
-f Dockerfile.arm:指定了用来构建镜像的 Dockerfile 文件。-t vllm-cpu:给这个镜像打上一个标签(tag),名字叫vllm-cpu,方便我们后续得引用。--shm-size=4g:分配了 4GB 的共享内存(shared memory),这对提升性能有帮助。
获取 Hugging Face 凭证
vLLM 需要从 Hugging Face Hub 下载模型文件。所以,你需要准备一个 Hugging Face 账号,并创建一个访问令牌(Access Token)。
- 注册账号:访问 huggingface.co 并注册。
- 申请模型访问权限:很多模型(特别是 Meta 的 Llama 系列)需要你在模型页面上提交申请才能下载。我们这里以
meta-llama/Llama-3.2-1B-Instruct为例,因为它足够小,适合测试。到它的模型页面,按提示申请访问权限。 - 创建 Token:在你的 Hugging Face 个人设置里,找到 “Access Tokens” 页面,创建一个新的 Token,并把它复制下来。
启动 vLLM 服务
现在万事俱备,可以用一行命令启动我们的 LLM 服务了:
docker run -it --rm -p 8000:8000 \
--env "HUGGING_FACE_HUB_TOKEN=<你的_HF_TOKEN>" \
vllm-cpu --model meta-llama/Llama-3.2-1B-Instruct \
--dtype float16
我们来拆解一下这个命令:
docker run:运行一个容器。-it --rm:以交互模式运行,并且在容器停止后自动删除它。-p 8000:8000:把容器的 8000 端口映射到我们本机的 8000 端口。--env "HUGGING_FACE_HUB_TOKEN=...":通过环境变量把你的 Hugging Face Token 传给容器。记得把<你的_HF_TOKEN>替换成你自己的。vllm-cpu:指定使用我们刚才构建的镜像。--model meta-llama/Llama-3.2-1B-Instruct:告诉 vLLM 加载哪个模型。--dtype float16:在 CPU 上运行时,模型通常需要指定float16数据类型。
第一次运行会比较慢,因为它需要从 Hugging Face 下载完整的模型文件。当你在终端看到类似下面的输出时,就代表服务已经成功启动了:
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
与模型交互
由于 vLLM 兼容 OpenAI 的 API 格式,我们可以直接用 openai 这个 Python 库来和本地服务交互。
from openai import OpenAI
# vLLM 默认不需要 API key,所以可以留空
openai_api_key = "EMPTY"
# 指向我们本地启动的服务
openai_api_base = "http://localhost:8000/v1"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
# 获取模型名称
models = client.models.list()
model = models.data[0].id
# 发起对话请求
completion = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello"},
]
)
print(completion.choices[0].message.content)
如果你想给自己的服务加上一层简单的认证,可以在启动容器时加上 --api-key 参数,例如 --api-key supersecretkey。这样,上面 Python 代码里的 openai_api_key 就需要改成 "supersecretkey" 才能访问。
云端部署:将 vLLM 搬上 Google Cloud Run
本地运行适合测试,但真要提供稳定的服务,还是得上云。这里我们选择 Google Cloud Run,它是一个无服务器(Serverless)平台,可以根据流量自动伸缩,非常适合部署这类容器化应用。
环境准备
- 创建 GCP 项目:登录 Google Cloud Console,创建一个新项目,比如叫
vllm-demo。确保项目关联了一个有效的结算账号。 - 启用 Artifact Registry API:Artifact Registry 是 Google Cloud 的容器镜像仓库服务。我们需要它来存放我们的 Docker 镜像。在控制台搜索 “Artifact Registry” 并为你的项目启用它。
- 创建仓库:在 Artifact Registry 中,创建一个新的仓库。仓库名称可以叫
vllm-cpu,格式选择 “Docker”,区域选择一个离你近的,比如us-central1。
构建并推送镜像
这些操作可以直接在 Google Cloud Shell 里完成,它是一个预装了 gcloud CLI 和 Docker 的在线终端。
打开 Cloud Shell,我们就可以再 Cloud Shell 中操作了。
-
克隆 vLLM 仓库
git clone https://github.com/vllm-project/vllm.git cd vllm -
构建 Docker 镜像 这次构建镜像时,我们需要给镜像打上符合 Artifact Registry 规范的 tag。
docker build \ -t us-central1-docker.pkg.dev/vllm-demo/vllm-cpu/vllm-openai:latest \ -f Dockerfile.cpu .请把
vllm-demo换成你的项目 ID,vllm-cpu换成你的仓库名。 -
推送镜像到仓库 构建完成后,把镜像推送到 Artifact Registry。
docker push us-central1-docker.pkg.dev/vllm-demo/vllm-cpu/vllm-openai:latest
配置 Cloud Run 服务
镜像准备好后,就可以去 Cloud Run 创建服务了。
- 在控制台搜索 “Cloud Run”,点击 “创建服务”。
- 选择镜像:选择 “从 Artifact Registry 选择现有容器映像”,然后找到我们刚刚推送的
vllm-openai:latest镜像。 - 配置端口:将容器端口设置为
8000。 - 资源分配:CPU 性能直接影响模型推理速度。建议至少分配 4 个 vCPU 和 16 GiB 内存。
- 环境变量:在 “变量与密钥” 标签页下,添加一个环境变量,名称为
HUGGING_FACE_HUB_TOKEN,值为你自己的 HF Token。 - 容器启动参数:在 “容器、卷、网络、安全” 部分,找到容器配置,在 “参数” 字段中填入
--model=meta-llama/Llama-3.2-1B-Instruct。 - 实例设置:为了降低冷启动延迟,可以在 “自动扩缩” 设置中,将 “最小实例数” 设为 1。这会保证始终有一个实例在运行,但也会产生持续的费用。
配置完成后,点击 “创建”。等待几分钟,Cloud Run 就会部署好服务并提供一个公开的 URL。
与云端服务交互
交互方式和本地完全一样,只需要把 Python 代码中的 openai_api_base 替换成 Cloud Run 提供的服务 URL 即可。
# 把 URL 替换成你的 Cloud Run 服务 URL
openai_api_base = "https://your-service-url.run.app/v1"
注意:云服务是会持续烧钱的! 如果你只是跟着教程尝试,请务必在实验结束后回到 Cloud Run 控制台停止或删除服务,并清理掉 Artifact Registry 中的镜像,否则即使没有流量,保持最小实例运行和镜像存储也会持续产生费用。
关于 GPU 和其他选择
- Google Cloud GPU:Cloud Run 目前对 GPU 的支持还处于预览阶段,需要单独申请。如果能获得 GPU 资源,性能会有质的飞跃。届时你甚至不需要自己构建镜像,可以直接使用官方提供的
vllm/vllm-openai:latest镜像,它已经为 GPU 环境优化好了。 - RunPod 等平台:市面上也有像 RunPod 这样的平台,专门提供 GPU 云服务,并且有一键部署 vLLM 等模型的模板。它们用起来更简单,但通常成本也更高。如果预算充足且想省事,可以考虑。
总的来说,vLLM 为我们私有化部署 LLM 提供了一个高性能且灵活的方案。无论是本地 CPU 环境的快速原型验证,还是云端可扩展的服务部署,它都展现出了不错的实力。希望这篇指南能帮助你顺利迈出第一步。
关于
关注我获取更多资讯