在本教程中,您将学习如何在启用了 GPU 的 Cloud Run 服务(用于快速推理)上部署 Google 的 Gemma 2,这是一个开放式大语言模型 (LLM)。
您将使用适用于开放式模型的 LLM 推理服务器 Ollama。完成本教程后,您还可以随意探索 Ollama 支持的其他开放式模型,包括 Llama 3.1 (8B)、Mistral (7B) 和 Qwen2 (7B)。
目标
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.
- 安装并初始化 gcloud CLI。
- 如需完成本教程,请前往配额和系统限额页面并进入 Cloud Run Admin API 下方以请求
Total Nvidia L4 GPU allocation, per project per region
配额。
所需的角色
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
Artifact Registry Admin (
roles/artifactregistry.admin
) -
Cloud Build Editor (
roles/cloudbuild.builds.editor
) -
Cloud Run Admin (
roles/run.admin
) -
Create Service Accounts (
roles/iam.serviceAccountCreator
) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin
) -
Service Account User (
roles/iam.serviceAccountUser
) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer
) -
Storage Admin (
roles/storage.admin
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
设置 gcloud
如需为您的 Cloud Run 服务配置 Google Cloud CLI,请执行以下操作:
设置默认项目:
gcloud config set project PROJECT_ID
点击 图标,将变量 PROJECT_ID 替换为您为本教程创建的项目的名称。这样可确保本页面上引用 PROJECT_ID 的所有列表都已填入正确的值。
配置 Google Cloud CLI 以使用区域
us-central1
运行 Cloud Run 命令。gcloud config set run/region us-central1
创建 Artifact Registry Docker 代码库
创建一个 Docker 仓库以存储本教程中的容器映像:
gcloud artifacts repositories create REPOSITORY \
--repository-format=docker \
--location=us-central1
将 REPOSITORY 替换为该仓库的名称。例如 repo
。
使用 Docker 通过 Ollama 和 Gemma 创建容器映像
为 Ollama 服务创建一个目录,并将工作目录更改为此新目录:
mkdir ollama-backend cd ollama-backend
创建
Dockerfile
文件
在容器映像中存储模型权重,以加快实例启动速度
Google 建议将 Gemma 2 (9B) 和大小类似的模型的模型权重直接存储在容器映像中。
模型权重是定义 LLM 行为的数值参数。Ollama 必须在容器实例启动期间完整读取这些文件并将权重加载到 GPU 内存 (VRAM) 中,然后才能开始处理推理请求。
在 Cloud Run 上,容器实例快速启动对于最大限度地缩短请求延迟时间至关重要。如果容器实例的启动时间较慢,则服务从 0 个实例扩容到 1 个实例所需的时间会更长,并且在流量高峰期间需要更多时间进行扩容。
为确保快速启动,请将模型文件存储在容器映像本身中。与在启动期间从远程位置下载文件相比,这种方法更快捷、更可靠。Cloud Run 的内部容器映像存储为处理流量高峰进行了优化,可让您在实例启动时快速设置容器的文件系统。
请注意,Gemma 2 (9B) 的模型权重占用 5.4 GB 的存储空间。较大的模型具有较大的模型权重文件,将这些文件存储在容器映像中可能不切实际。如需大致了解这些权衡,请参阅最佳实践:使用 GPU 在 Cloud Run 上进行 AI 推理。
使用 Cloud Build 构建容器映像
如需使用 Cloud Build 构建容器映像并将其推送到 Artifact Registry 仓库,请执行以下操作:
gcloud builds submit \
--tag us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
--machine-type e2-highcpu-32
请注意以下几点:
- 为加快构建速度,此命令会选择具有更多 CPU 和网络带宽的强大机器类型。
- 构建过程预计需要大约 7 分钟。
- 另一种方法是使用 Docker 在本地构建映像,然后将其推送到 Artifact Registry。这可能比在 Cloud Build 上运行要慢一些,具体取决于您的网络带宽。
将 Ollama 部署为 Cloud Run 服务
将容器映像存储在 Artifact Registry 仓库中后,您现在可以将 Ollama 部署为 Cloud Run 服务了。
创建专用服务账号
创建一个专用服务账号,供 Ollama 服务用作其服务身份:
gcloud iam service-accounts create OLLAMA_IDENTITY \
--display-name="Service Account for Ollama Cloud Run service"
将 OLLAMA_IDENTITY 替换为您要创建的服务账号的名称,例如 ollama
。
最佳实践是为每个 Cloud Run 服务创建一个专用服务账号,并授予一组最低必需权限。Ollama 服务无需调用任何 Google Cloud API,这意味着无需向其服务账号授予任何权限。
部署该服务
将服务部署到 Cloud Run:
gcloud beta run deploy ollama-gemma \
--image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
--concurrency 4 \
--cpu 8 \
--set-env-vars OLLAMA_NUM_PARALLEL=4 \
--gpu 1 \
--gpu-type nvidia-l4 \
--max-instances 7 \
--memory 32Gi \
--no-allow-unauthenticated \
--no-cpu-throttling \
--service-account OLLAMA_IDENTITY@PROJECT_ID.iam.gserviceaccount.com \
--timeout=600
请注意此命令中的以下重要标志:
--concurrency 4
设置为与环境变量OLLAMA_NUM_PARALLEL
的值匹配。- 具有
--gpu-type nvidia-l4
的--gpu 1
会为服务中的每个 Cloud Run 实例分配 1 个 NVIDIA L4 GPU。 --no-allow-authenticated
限制对服务未经身份验证的访问。通过将服务保持不公开状态,您可以依赖 Cloud Run 的内置 Identity and Access Management (IAM) 身份验证来实现服务到服务通信。请参阅使用 IAM 管理访问权限。--no-cpu-throttling
对于启用 GPU 是必需的。--service-account
用于设置服务的服务身份。
设置并发以获得最佳性能
本部分提供了有关建议的并发设置的背景信息。为了实现最佳请求延迟时间,请确保 --concurrency
设置等于 Ollama 的 OLLAMA_NUM_PARALLEL
环境变量。
OLLAMA_NUM_PARALLEL
用于确定每个模型有多少请求槽可用于同时处理推理请求。--concurrency
用于确定 Cloud Run 同时向 Ollama 实例发送多少请求。
如果 --concurrency
超过 OLLAMA_NUM_PARALLEL
,Cloud Run 可以向 Ollama 中的模型发送的请求数量会超过其可用的请求槽数。这会导致请求 Ollama 中出现请求队列,因而延长已加入队列的请求的请求延迟时间。这也会导致自动扩缩的响应速度变慢,因为已加入队列的请求不会触发 Cloud Run 进行扩容并启动新实例。
Ollama 还支持从一个 GPU 提供多个模型。如需完全避免 Ollama 实例上出现请求队列,您仍应将 --concurrency
设置为与 OLLAMA_NUM_PARALLEL
匹配。
请务必注意,增加 OLLAMA_NUM_PARALLEL
也会延长并发请求的执行时间。
优化利用率
为了获得最佳 GPU 利用率,请增加 --concurrency
并使其保持在 OLLAMA_NUM_PARALLEL
值的两倍内。虽然这会导致 Ollama 中出现请求队列,但有助于提高利用率:Ollama 实例可以立即处理队列中的请求,而队列有助于吸收流量高峰。
使用 curl 测试已部署的 Ollama 服务
现在,您已部署 Ollama 服务,接下来可以向其发送请求了。不过,如果您直接发送请求,Cloud Run 会响应 HTTP 401 Unauthorized
。这是有意为之,因为 LLM 推理 API 旨在调用其他服务(例如前端应用)。如需详细了解 Cloud Run 上的服务到服务身份验证,请参阅服务到服务身份验证。
如需向 Ollama 服务发送请求,请向请求添加包含有效 OIDC 令牌的标头,例如使用 Cloud Run 开发者代理:
启动代理,当系统提示您安装
cloud-run-proxy
组件时,选择Y
:gcloud run services proxy ollama-gemma --port=9090
在单独的终端标签页中向该组件发送请求,让代理保持运行状态。请注意,代理在
localhost:9090
上运行:curl http://localhost:9090/api/generate -d '{ "model": "gemma2:9b", "prompt": "Why is the sky blue?" }'
此命令应提供类似于以下内容的流式输出:
{"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.288463414Z","response":"The","done":false} {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.320937525Z","response":" sky","done":false} {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.353173544Z","response":" appears","done":false} {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.385284976Z","response":" blue","done":false} ...
清理
- 删除在本教程中创建的其他 Google Cloud 资源: