跳至主要内容

vLLM:在本地和 Google Cloud 上为 CPU 设置 vLLM

了解如何使用 Docker 在本地,以及使用 Google Cloud 在云端,设置并运行 vLLM(虚拟大型语言模型)。
· 12分钟 阅读

使用 AI 探索

vLLM(Virtual Large Language Model) 是一个用于托管大型语言模型(LLM)的库。它为处理大规模语言处理任务提供了优化的运行环境。

我们可能想要自行托管 LLM 的原因有很多。将模型托管在本地或云平台上,既能让我们掌控数据隐私,又能在一定程度上按需定制模型,并且根据应用场景可能更具成本优势。

此外,vLLM 兼容 OpenAI API。这意味着,如果我们已经有与 OpenAI 基础设施对接的代码,就可以直接用 vLLM 托管的自有 LLM 替换,而无需改动现有代码库。

在本文中,我将带您完成 vLLM 的搭建。我们先演示如何在电脑上使用 Docker(一款流行的容器化工具,可简化跨环境一致运行应用的过程)来运行它。随后,我们将学习如何在 Google Cloud 上部署 vLLM,为托管这些模型提供可扩展的方案,确保其能够应对更大的任务或更高的流量。

如何使用 Docker 在本地为 CPU 设置 vLLM

vLLM 通过面向 CUDA 平台(通常指使用 NVIDIA GPU 加速)的高效配置,简化了运行 LLM 的过程。不过,如果我们希望改为在 CPU 上运行模型,可以使用 vLLM 提供的专用于 CPU 的 Docker 镜像。这种灵活性让我们即使没有 CUDA 环境也能托管模型。若需在 CUDA 平台托管 vLLM,请参考其快速上手指南。

鉴于大多数人无法使用高端 GPU,我们将重点讲解如何在 CPU 上运行 vLLM。这样,即便只用手头资源,也能上手体验 LLM。

为简化流程,我们将使用 Docker。它是一款流行工具,可将应用及其依赖打包为容器。可以把容器想象成一个轻量、可移植的单元,包含运行特定软件所需的一切。借助 Docker,我们无需手动安装 vLLM,也不用担心系统上的兼容性问题。

vLLM 提供了开箱即用的、专为 CPU 执行设计的 Docker 镜像。该镜像包含运行 vLLM 所需的全部组件,让我们可以将精力放在使用模型上,而非繁琐的环境搭建,从而快速高效地在 CPU 上运行 LLM。

步骤 1:构建 Docker 镜像

首先,我们需要构建一个 Docker 镜像,以便在电脑上运行 vLLM。 vLLM 仓库提供了包含所有必要指令的 Dockerfile,可用于构建能在 CPU 上运行 vLLM 的镜像。

  • Dockerfile.cpu:适用于常规 CPU。
  • Dockerfile.arm:适用于 ARM 架构 CPU(如现代 Mac 所使用)。

由于我使用的是搭载 M2 处理器的 Mac,因此将使用 .arm 文件。要构建镜像,先克隆或下载该仓库,然后在仓库目录内运行以下命令:

docker build -f Dockerfile.arm -t vllm-cpu --shm-size=4g .

下面简要说明该命令的作用:

  • docker build:根据 Dockerfile 构建 Docker 镜像。
  • -f Dockerfile.arm:指定要使用的 Dockerfile。
  • -t vllm-cpu:为镜像打上 vllm-cpu 标签,便于引用(也可使用其他名称)。
  • --shm-size=4g:分配 4 GB 的共享内存,有助于提升性能。

步骤 2:设置 Hugging Face

vLLM 使用 Hugging Face(一个便于管理模型的平台)来简化托管流程。具体步骤如下:

  1. 创建 Hugging Face 账户:访问 Hugging Face 官网,如果还没有账户,请先注册。
  2. 申请模型访问权限:登录后,搜索您希望使用的模型。本示例建议使用 meta-llama/Llama-3.2-1B-Instruct,该模型较小,适合初步测试。在模型页面上,可能需要申请访问权限。按照页面指示完成申请。
  3. 创建令牌(token):前往 Hugging Face 的 API 令牌页面。点击“Create New Token”并创建令牌。下载和访问模型时需要使用该令牌。

步骤 3:运行 Docker 容器

构建好 Docker 镜像并准备好 Hugging Face 令牌后,可以使用以下命令运行 vLLM 模型:

docker run -it --rm -p 8000:8000 \
--env "HUGGING_FACE_HUB_TOKEN=<replace_with_hf_token>" \
vllm-cpu --model meta-llama/Llama-3.2-1B-Instruct \
--dtype float16

对该命令进行逐项说明:

  • docker run:基于指定的 Docker 镜像运行容器。
  • -it:以交互式方式运行容器并提供终端访问。
  • --rm:容器停止后自动移除。
  • -p 8000:8000:将容器的 8000 端口映射到本机的 8000 端口,使服务可在本地访问。
  • --env "HUGGING_FACE_HUB_TOKEN=<replace_with_hf_token>":设置环境变量为 Hugging Face 令牌,便于 vLLM 连接 Hugging Face API。将 <replace_with_hf_token> 替换为我们创建的实际令牌。
  • vllm-cpu:指定之前构建的 Docker 镜像名称。
  • --model meta-llama/Llama-3.2-1B-Instruct:指定要运行的模型。
  • --dtype float16:使用 float16 数据类型,因为在 CPU 上运行时该模型需要此类型。

运行该命令后,服务器需要一段时间准备,因为要先下载 LLM。当终端出现类似如下信息时,表示已就绪:

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)

与 LLM 交互

vLLM 的一大亮点是与 OpenAI API 兼容。这意味着,若我们已有面向 OpenAI 基础设施的代码,就可以用同样的代码与通过 vLLM 托管的模型进行通信。

得益于此兼容性,我们无需修改现有代码库即可平滑迁移。因此,当我们搭建好 vLLM 后,仍可用熟悉的工具和命令与 LLM 交互,使集成过程高效且友好。

以下是向在 Docker 上本地运行的服务器发送消息的示例:

from openai import OpenAI
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)

请注意,我们在上面使用了默认的 "EMPTY" API 密钥。我们也可以通过 --api-key 参数设置访问模型所需的密钥。例如:

docker run -it --rm -p 8000:8000 \
--env "HUGGING_FACE_HUB_TOKEN=<replace_with_hf_token>" \
vllm-cpu --model meta-llama/Llama-3.2-1B-Instruct \
--dtype float16 --api-key supersecretkey

然后,在这种情况下,需要将代码顶部的密钥替换为:

openai_api_key = "supersecretkey"

如何在 Google Cloud 上托管 vLLM(CPU)

使用 vLLM 在 Google Cloud 上托管 LLM,可以为部署 LLM 提供一套可行方案。让我们将上述步骤拆解并进一步说明。

步骤 1:访问 Google Cloud 控制台

首先,我们需要访问 Google Cloud 控制台。可在浏览器中打开 Google Cloud Console。如果还没有 Google 账号,需要先创建一个才能使用 Google Cloud 服务。

步骤 2:创建项目

在 Google Cloud 控制台顶部找到项目下拉菜单,选择“New Project”。 

Create new google cloud project

将项目命名为 vllm-demo,以便后续识别。

Project setup options

如果我们已有 Google Cloud 账户,试用期的结算账户可能不可用。这种情况下需要创建新的结算账户。前往“Billing”栏目,按照步骤选择已有结算账户或创建新账户。

步骤 3:启用 Artifact Registry 服务

Artifact Registry 是一项用于存储和管理容器镜像的服务。我们将使用它来存储运行 vLLM 所需的 Docker 镜像。

在控制台搜索“artifact”,打开 Artifact Registry。

Open the artifact registry

随后为我们的项目启用该服务。此步骤用于存储 vLLM 部署所需的 Docker 镜像。

Enabling the artifact registry.

步骤 4:创建制品仓库

接下来需要创建一个制品仓库来存放容器镜像。进入 Artifact Registry,点击“Create Repository”。 

Creating a new repository.

将仓库命名为 vllm-cpu,格式选择“Docker”。位置指定为 us-central1,以便根据我们的部署需求优化性能。其余配置可保持默认值。

Repository configuration.

步骤 5:构建并推送 Docker 镜像

与本地环境相同,我们需要构建 Docker 镜像,然后将其上传(push)到 Google Cloud 的 vllm-cpu 仓库。我们将使用右上角的 Cloud Shell 完成这些操作。

Opening the Google cloud console.。

在该终端中,使用以下命令克隆 vLLM 的 GitHub 仓库以获取所需文件:

git clone https://github.com/vllm-project/vllm.git

在终端中进入刚克隆的 vLLM 目录。

cd vllm

使用以下命令构建 Docker 镜像,采用专为 CPU 配置的 Dockerfile:

docker build \
-t us-central1-docker.pkg.dev/vllm-demo/vllm-cpu/vllm-openai:latest \
-f Dockerfile.cpu .

构建完成后,将镜像推送到 Artifact Registry,也就是上传镜像,便于后续由 Google Cloud 服务使用:

docker push us-central1-docker.pkg.dev/vllm-demo/vllm-cpu/vllm-openai:latest

步骤 6:在 Cloud Run 上设置服务

Google Cloud Run 可部署容器化应用。我们将使用该服务部署刚构建的镜像。 

在搜索栏输入“cloud run”,打开“Cloud Run”服务。

Opening Cloud Run

接着点击“Create Service”按钮:

Creating a new service on google cloud

然后按照以下步骤进行配置:

  1. 选择容器镜像: 选择我们之前推送的容器镜像。
  2. 配置端口: 将默认端口改为 8000,这是 vLLM 使用的端口。
  3. 添加 Hugging Face 令牌: 在“Variables & Secrets”部分新增变量,名称为 HUGGING_FACE_HUB_TOKEN,粘贴我们的令牌。该令牌用于让 vLLM 访问 Hugging Face 上的模型。
  4. 容器参数: 在命令部分加入参数 --model=meta-llama/Llama-3.2-1B 指定要使用的模型。
  5. 资源分配: 将内存设置为 16 GiB,并分配 4 个 CPU,以确保容器具备足够资源以高效处理。
  6. 实例设置: 为减少冷启动时间,至少保持一个实例常驻。这样可能会增加成本,但可提升性能,减少模型下载与启动时间。

完成上述配置(其余选项可保持默认)后,点击页面底部的“Create”按钮。等待服务就绪后,进入该服务页面。页面上会显示服务 URL,我们可以用它与 LLM 通信。 

看起来应类似如下:

https://vllm-llama-577126904161.us-central1.run.app

与 LLM 交互

我们可以像在本地运行模型时一样,通过 Python 与 LLM 交互。只需在脚本中更换 URL:

# Replace with your service URL
openai_api_base = "https://vllm-llama-577126904161.us-central1.run.app/v1"

重要的成本注意事项

警告: 如果您按本文步骤操作,请注意:保持 Artifact Registry 处于启用状态会产生费用。因此,请在完成本指南后记得取消关联结算账户,否则即便无人使用也会产生账单。

Google Cloud GPU 设置

在撰写本教程时,Google Cloud Run 的 GPU 支持需申请开通。也就是说,我们需要专门申请这一功能。获批后,使用 GPU 运行 vLLM 的性能将显著优于使用 CPU。这对处理大型语言模型尤为有利,因为 GPU 擅长高并行计算。

若获得 GPU 支持,我们可以进一步简化流程。在这种情况下,无需自行构建 Docker 镜像,而是可以直接创建服务并使用已有镜像 vllm/vllm-openai:latest。该镜像已针对 GPU 优化,可快速高效地部署模型,无需像 CPU 配置那样额外的设置步骤。

一旦 GPU 访问获批并使用上述镜像完成服务设置,我们的 vLLM 部署即可充分利用 GPU 的强大算力与速度,适用于实时应用和高需求的语言处理任务。

RunPod:替代托管方案

如果您在寻找替代托管方案,RunPod 等平台提供了简化的大型语言模型托管服务。例如,RunPod 提供了无服务器(serverless)的部署方式,简化了上线流程。

Hosting with RunPod.

虽然该选项上手友好、部署迅速,但也要意识到,越方便通常成本越高。如果预算有限,可能需要在易用性与成本之间权衡。

结语

在本教程中,我们介绍了如何在本地和 Google Cloud 上设置并托管 vLLM。

我们学习了如何构建并运行专为 CPU 定制的 Docker 镜像,即使没有高端 GPU 资源也能使用。同时,我们还了解了如何在 Google Cloud 上部署 vLLM,为处理更大任务提供可扩展的解决方案。

François Aubry

作者

François Aubry

全栈工程师,CheapGPT 创始人。我一直热爱教学。从学生时代起,我就积极寻找机会为同学提供辅导与帮助。这份热情促使我攻读博士学位,并在此期间担任助教,以支持我的学术追求。那些年里,我在传统课堂环境中收获了极大的成就感,既建立联系也促进学习。随着在线学习平台的兴起,我也看到了数字教育的变革潜力。事实上,我曾参与我们大学一款此类平台的建设。我致力于将传统教学理念与创新的数字方法相融合。我的热情在于打造既有吸引力、信息量充足,又能让当代学习者轻松获取的课程。

主题