使用 Ollama 在 Cloud Run GPU 上运行 LLM 推理


在本教程中,您将了解如何在支持 GPU 的 Cloud Run 服务(用于快速推理)上部署 Google 的 Gemma 2,这是一种开放式大语言模型 (LLM)。

您将使用适用于开放式模型的 LLM 推理服务器 Ollama。完成本教程后,您还可以随意探索 Ollama 支持的其他开放式模型,包括 Llama 3.1 (8B)Mistral (7B)Qwen2 (7B)

目标

  • 在支持 GPU 的 Cloud Run 服务上使用 Gemma 2 模型部署 Ollama
  • 向 Ollama 服务的专用端点发送提示。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  7. 安装并初始化 gcloud CLI
  8. 如需完成本教程,请前往配额和系统限额页面并进入 Cloud Run Admin API 下方以请求 Total Nvidia L4 GPU allocation, per project per region 配额。

所需的角色

如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

设置 gcloud

如需为您的 Cloud Run 服务配置 Google Cloud CLI,请执行以下操作:

  1. 设置默认项目:

    gcloud config set project PROJECT_ID

    点击 图标,将变量 PROJECT_ID 替换为您为本教程创建的项目的名称。这样可确保本页面上引用 PROJECT_ID 的所有列表都已填入正确的值。

  2. 配置 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 创建容器映像

  1. 为 Ollama 服务创建一个目录,并将工作目录更改为此新目录:

    mkdir ollama-backend
    cd ollama-backend
  2. 创建 Dockerfile 文件

    FROM ollama/ollama:0.3.6
    
    # Listen on all interfaces, port 8080
    ENV OLLAMA_HOST 0.0.0.0:8080
    
    # Store model weight files in /models
    ENV OLLAMA_MODELS /models
    
    # Reduce logging verbosity
    ENV OLLAMA_DEBUG false
    
    # Never unload model weights from the GPU
    ENV OLLAMA_KEEP_ALIVE -1 
    
    # Store the model weights in the container image
    ENV MODEL gemma2:9b
    RUN ollama serve & sleep 5 && ollama pull $MODEL 
    
    # Start Ollama
    ENTRYPOINT ["ollama", "serve"]

将模型权重存储在容器映像中,以加快实例启动速度

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 开发者代理

  1. 启动代理,然后在系统提示您安装 cloud-run-proxy 组件时选择 Y

    gcloud run services proxy ollama-gemma --port=9090
  2. 在单独的终端标签页中向该组件发送请求,让代理保持运行状态。请注意,代理在 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}
    ...
    

清理

  1. 删除在本教程中创建的其他 Google Cloud 资源:

后续步骤