vLLM (Virtual Large Language Model) 是一个专为托管大语言模型(LLM)而设计的开源库,它为处理大规模语言任务提供了高度优化的推理引擎。
我们选择自托管 LLM 的原因有很多,例如:希望完全掌控数据隐私、根据特定需求对模型进行深度定制,或是在某些应用场景下寻求比商业 API 更经济的解决方案。
vLLM 的一个核心优势是它与 OpenAI API 的兼容性。这意味着,如果你现有的代码是基于 OpenAI 的服务构建的,你可以无缝切换到由 vLLM 托管的自部署模型,而无需对代码库进行大量修改。
本文将作为一份详尽的指南,带你一步步完成 vLLM 的部署。我们将首先演示如何使用 Docker 在你的本地计算机(CPU 环境)上运行 vLLM,然后介绍如何将其部署到 Google Cloud,为你提供一个可扩展的、能够应对更大负载的解决方案。
使用 Docker 在本地 CPU 环境中部署 vLLM
vLLM 的设计初衷是为了在 CUDA 平台(通常指 NVIDIA GPU)上实现高效推理。然而,考虑到并非所有人都能轻松获得高端 GPU 资源,vLLM 也贴心地提供了专门用于 CPU 的 Docker 镜像。这使得我们即便没有 CUDA 环境,也能够灵活地托管和实验 LLM。
如果你希望在 CUDA 平台上托管 vLLM,可以参考其官方的快速入门指南。
在本教程中,我们将专注于如何在 CPU 环境中设置 vLLM。为了简化环境配置和依赖管理的复杂性,我们将使用 Docker 这一流行的容器化工具。Docker 能够将应用及其所有依赖打包到一个轻量、可移植的容器中,确保在任何环境中都能拥有一致的运行体验。
第一步:构建 Docker 镜像
首先,我们需要构建一个能够在本地计算机上运行 vLLM 的 Docker 镜像。vLLM 的官方代码库提供了预设的 Dockerfile,其中包含了在 CPU 环境下运行所需的所有指令。
Dockerfile.cpu:适用于常规的 x86架构 CPU。Dockerfile.arm:适用于 ARM 架构的 CPU,例如苹果的 M 系列芯片。
由于我使用的是搭载 M2 处理器的 Mac,因此我将选择 .arm 文件。首先,克隆或下载 vLLM 的代码库,然后在项目根目录下运行以下命令:
docker build -f Dockerfile.arm -t vllm-cpu --shm-size=4g .
这个命令的作用如下:
docker build:从 Dockerfile 创建一个 Docker 镜像。-f Dockerfile.arm:指定使用的 Dockerfile 文件。-t vllm-cpu:为镜像打上一个易于识别的标签(tag),这里命名为vllm-cpu。--shm-size=4g:分配 4GB 的共享内存(shared memory),这有助于提升应用性能。.:指定构建上下文(build context)为当前目录。
第二步:配置 Hugging Face
vLLM 通过集成 Hugging Face 来简化模型的管理和托管流程。以下是准备工作的步骤:
- 创建 Hugging Face 账户:访问 Hugging Face 官网 并注册一个账户。
- 申请模型访问权限:登录后,搜索你想要使用的模型。对于本次演示,推荐使用
meta-llama/Llama-3.2-1B-Instruct,这是一个适合初次测试的小型模型。在模型页面,你可能需要申请访问权限,请按照页面提示完成操作。 - 创建访问令牌(Token):访问 Hugging Face 的 API 令牌页面,点击 “Create New Token” 创建一个新的令牌。这个令牌将用于从代码中访问和下载模型。
第三步:运行 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:基于指定的镜像运行一个容器。-it:以交互模式运行容器,并分配一个伪终端。--rm:容器停止后自动删除,以保持环境整洁。-p 8000:8000:将容器的 8000 端口映射到主机的 8000 端口,使服务可以通过本地访问。--env "HUGGING_FACE_HUB_TOKEN=<...>":将 Hugging Face 令牌作为环境变量传入容器,请将<replace_with_hf_token>替换为你自己的令牌。vllm-cpu:指定我们之前构建的 Docker 镜像名称。--model meta-llama/Llama-3.2-1B-Instruct:指定要运行的模型。--dtype float16:在 CPU 上运行时,模型通常需要使用float16数据类型。
首次运行时,服务器需要一些时间来下载 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 开发的代码。只需将 API 的 base_url 指向我们本地启动的服务即可。
以下是一个使用 openai Python 库与本地 vLLM 服务通信的示例:
from openai import OpenAI
# 对于本地服务,API 密钥可以不是必需的,但 client 需要一个值
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_name = models.data[0].id
completion = client.chat.completions.create(
model=model_name,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello"},
]
)
print(completion.choices[0].message.content)
如果你希望为你的服务增加访问控制,可以在启动容器时添加 --api-key 参数来设置一个密钥:
docker run ... --api-key your-secret-key
相应地,在 Python 代码中也需要使用这个密钥:
openai_api_key = "your-secret-key"
在 Google Cloud 上托管 vLLM (CPU)
将 LLM 托管在 Google Cloud 上可以提供更强的可扩展性和稳定性。接下来,我们将介绍如何在 Google Cloud Run 上部署 vLLM。
第一步:访问 Google Cloud 控制台
首先,访问 Google Cloud Console 并登录你的 Google 账户。
第二步:创建项目
在控制台顶部,点击项目下拉菜单,选择“新建项目”。将项目命名为 vllm-demo 以方便识别。如果系统提示,请关联一个结算账号。
第三步:启用 Artifact Registry 服务
Artifact Registry 是 Google Cloud 提供的容器镜像存储和管理服务。我们需要用它来存放我们的 Docker 镜像。在控制台的搜索栏中输入 “Artifact Registry” 并启用该服务。
第四步:创建 Artifact Repository
在 Artifact Registry 中,点击“创建代码库”:
- 名称:
vllm-cpu - 格式:选择
Docker - 位置:选择
us-central1或离你较近的区域 其他配置保持默认即可。
第五-步:构建并推送 Docker 镜像
与本地设置类似,我们需要在 Google Cloud 环境中构建并推送 Docker 镜像到刚刚创建的仓库。
- 打开 Cloud Shell:点击控制台右上角的
>_图标启动 Cloud Shell。 - 克隆代码库并进入目录:
git clone https://github.com/vllm-project/vllm.git cd vllm - 构建镜像:
docker build \ -t us-central1-docker.pkg.dev/vllm-demo/vllm-cpu/vllm-openai:latest \ -f Dockerfile.cpu . - 推送镜像:
docker push us-central1-docker.pkg.dev/vllm-demo/vllm-cpu/vllm-openai:latest
第六步:在 Cloud Run 上设置服务
Google Cloud Run 是一个用于部署无服务器容器化应用的服务。
- 在控制台搜索 “Cloud Run” 并进入服务页面,点击“创建服务”。
- 选择容器镜像:选择我们刚刚推送到 Artifact Registry 的镜像。
- 配置端口:将容器端口更改为
8000。 - 添加环境变量:在“变量与密钥”部分,添加一个名为
HUGGING_FACE_HUB_TOKEN的环境变量,并填入你的 Hugging Face 令牌。 - 配置容器参数:在“容器、变量和密钥、连接、安全性”选项卡下的“容器”部分,为“容器启动命令”添加参数:
--model=meta-llama/Llama-3.2-1B-Instruct和--dtype=float16。 - 分配资源:为了确保模型能够流畅运行,建议将内存分配调整为 16GiB,CPU 核心数设置为 4。
- 实例设置:为了减少冷启动时间,可以在“自动扩缩”设置中将“最小实例数”设置为 1。这会确保始终有一个实例处于活动状态,但也会产生持续费用。
完成所有配置后,点击“创建”。服务部署完成后,你将在服务详情页面看到一个 URL,这就是你的 LLM 服务的公共访问地址。
与该服务交互的方式与本地部署完全相同,只需将 Python 代码中的 openai_api_base 替换为 Cloud Run 提供的 URL 即可。
⚠️ 重要成本提示:请注意,在 Google Cloud 上保持 Artifact Registry 和运行的 Cloud Run 实例(尤其是设置了最小实例数时)会产生费用。完成本教程后,请务必删除相关资源或停用结算账号,以避免不必要的开销。
Google Cloud GPU 部署
截至本文撰写时,Google Cloud Run 的 GPU 支持仍处于按需申请阶段。如果你的项目需要更高的推理性能,可以申请该功能。一旦获准,你将可以直接使用 vLLM 官方提供的 GPU 优化镜像 vllm/vllm-openai:latest 来创建服务,无需自行构建 Docker 镜像,从而大大简化部署流程。
其他托管选择:RunPod
对于寻求更便捷托管方案的用户,RunPod 等平台提供了专门为托管大模型而设计的 serverless 服务。这些平台通常非常易于上手,但便利性往往也伴随着更高的成本。如果预算是你的重要考量因素,建议在易用性和成本之间进行权衡。
结语
在本教程中,我们详细探讨了如何在本地和 Google Cloud 的 CPU 环境中设置和托管 vLLM。通过使用 Docker,我们简化了环境配置,即使没有高端 GPU,也能够轻松地运行和测试大语言模型。无论是用于个人项目还是企业级应用,vLLM 都提供了一个强大而灵活的平台来释放 LLM 的潜力。
关于
关注我获取更多资讯