google-cloud 文档

在 Cloud Run 上使用 TGI DLC 部署 Llama 3.1 8B

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

在 Cloud Run 上使用 TGI DLC 部署 Llama 3.1 8B

Llama 3.1 是 Meta 于 2024 年 7 月发布的最新开源 LLM。Llama 3.1 有三种尺寸:8B 用于在消费级 GPU 上高效部署和开发,70B 用于大规模 AI 原生应用,405B 用于合成数据、作为判定的 LLM 或蒸馏等用例。文本生成推理 (TGI) 是 Hugging Face 开发的用于部署和提供 LLM 的工具包,具有高性能文本生成能力。Google Cloud Run 是一个无服务器容器平台,允许开发人员部署和管理容器化应用程序,而无需管理基础设施,从而实现自动扩缩和按使用量计费。

本示例展示了如何在支持 GPU 的 Google Cloud Run(预览版)上,使用 Hugging Face 的 TGI DLC 部署 Hugging Face Hub 中的 LLM,本例中是使用 AWQ 量化为 INT4 的 Llama 3.1 8B Instruct 模型。

要在 Cloud Run 上访问 GPU,请请求增加配额,针对 `Total Nvidia L4 GPU allocation, per project per region`。在撰写本示例时,NVIDIA L4 GPU (24GiB VRAM) 是 Cloud Run 上唯一可用的 GPU;默认情况下可自动扩缩至最多 7 个实例(通过配额可提供更多),并且在没有请求时可缩减至零个实例。

设置 / 配置

首先,您需要根据Cloud SDK 文档 - 安装 gcloud CLI 中的说明,在本地计算机上安装 Google Cloud 的命令行工具 `gcloud`。

或者,为了简化本教程中命令的使用,您需要为 GCP 设置以下环境变量

export PROJECT_ID=your-project-id
export LOCATION=us-central1 # or any location where Cloud Run offers GPUs: https://cloud.google.com/run/docs/locations#gpu
export CONTAINER_URI=us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu121.2-2.ubuntu2204.py310
export SERVICE_NAME=text-generation-inference

然后您需要登录您的 Google Cloud 账户并设置您要用于部署 Cloud Run 的项目 ID。

gcloud auth login
gcloud auth application-default login  # For local development
gcloud config set project $PROJECT_ID

登录后,您需要启用 Cloud Run API,这是 Hugging Face DLC for TGI 在 Cloud Run 上部署所必需的。

gcloud services enable run.googleapis.com

在 Cloud Run 上部署 TGI

设置好所有内容后,您可以调用 `gcloud beta run deploy` 命令(如上所述,由于 GPU 支持仍处于预览阶段,因此该命令仍处于 beta 阶段)。

gcloud beta run deploy 命令需要您指定以下参数:

  • --image:要部署的容器镜像 URI。
  • --args:传递给容器入口点的参数,对于 Hugging Face 的 TGI DLC 来说是 text-generation-launcher。请在Text-generation-launcher arguments中阅读更多关于支持的参数。
    • --model-id:要使用的模型 ID,在此示例中为 hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4
    • --quantize:要使用的量化方法,在本例中为 `awq`。如果未指定,将从 `config.json` 文件中的 `quantization_config->quant_method` 中检索。
  • --port:容器监听的端口。
  • --cpu--memory:分配给容器的 CPU 数量和内存量。需要分别设置为 4 和 16Gi (16 GiB);因为这是使用 GPU 的最低要求。
  • --no-cpu-throttling:禁用 CPU 节流,这是使用 GPU 所必需的。
  • --gpu--gpu-type:要使用的 GPU 数量和 GPU 类型。必须分别设置为 1 和 nvidia-l4;因为在编写本教程时,这些是 Cloud Run on GPUs 仍处于预览阶段唯一可用的选项。
  • --max-instances:要运行的最大实例数,设置为 3,但默认最大值为 7。另外,也可以将其设置为 1,但这可能会导致基础设施迁移期间停机,因此建议设置为 1 以上。
  • --concurrency:每个实例的最大并发请求数,设置为 64。该值并非随意设定,而是在运行和评估 text-generation-benchmark 的结果后确定的,它是吞吐量和延迟之间的最佳平衡点;目前 TGI 的默认值 128 有点过高。请注意,该值也与 TGI 中的 --max-concurrent-requests 参数对齐。
  • --region:部署 Cloud Run 服务的区域。
  • --no-allow-unauthenticated:禁用对服务的未经身份验证的访问,这是一个很好的做法,因为它添加了由 Google Cloud IAM 管理的身份验证层。
gcloud beta run deploy $SERVICE_NAME \
    --image=$CONTAINER_URI \
    --args="--model-id=hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4,--quantize=awq,--max-concurrent-requests=64" \
    --port=8080 \
    --cpu=4 \
    --memory=16Gi \
    --no-cpu-throttling \
    --gpu=1 \
    --gpu-type=nvidia-l4 \
    --max-instances=3 \
    --concurrency=64 \
    --region=$LOCATION \
    --no-allow-unauthenticated

Cloud Run Deployment

Cloud Run Deployment Details

首次在 Cloud Run 上部署新容器需要大约 5 分钟,因为它需要从 Google Cloud Artifact Registry 导入,但后续部署所需时间会更短,因为镜像已经导入过。

Cloud Run 上的推理

部署完成后,您可以通过任何受支持的 TGI 端点向服务发送请求,查看TGI 的 OpenAPI 规范以查看所有可用端点及其各自的参数。

所有 Cloud Run 服务默认都是私有部署的,这意味着在请求头中不提供身份验证凭据就无法访问它们。这些服务受 IAM 保护,只有项目所有者、项目编辑者、Cloud Run 管理员和 Cloud Run 调用者才能调用。

在本例中,将展示几种启用开发人员访问的替代方案;而其他用例则超出本示例的范围,因为它们要么由于身份验证被禁用而不安全(对于公共访问场景),要么需要额外的设置才能用于生产就绪场景(服务到服务身份验证最终用户访问)。

下面提到的替代方案适用于开发场景,不应直接用于生产就绪场景。以下方法遵循Cloud Run 文档 - 身份验证开发人员中定义的指南;但您可以在Cloud Run 文档 - 身份验证概述中找到所有其他指南。

通过 Cloud Run 代理

Cloud Run 代理在本地主机上运行一个服务器,该服务器将请求代理到指定的 Cloud Run 服务并附加凭据;这对于测试和实验很有用。

gcloud run services proxy $SERVICE_NAME --region $LOCATION

然后,您可以使用 https://:8080 URL 向 Cloud Run 上部署的服务发送请求,无需身份验证,由代理公开,如下例所示。

请注意,以下示例使用的是 `/v1/chat/completions` TGI 端点,该端点与 OpenAI 兼容,这意味着 `cURL` 和 Python 只是其中的一些建议,但可以使用任何 OpenAI 兼容的客户端。

cURL

要使用 `cURL` 向 TGI 服务发送 POST 请求,您可以运行以下命令:

curl https://:8080/v1/chat/completions \
    -X POST \
    -H 'Content-Type: application/json' \
    -d '{
        "model": "tgi",
        "messages": [
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": "What is Deep Learning?"
            }
        ],
        "max_tokens": 128
    }'

Python

要使用 Python 进行推理,您可以使用 `huggingface_hub` Python SDK(推荐)或 `openai` Python SDK。

huggingface_hub

您可以通过 `pip install --upgrade --quiet huggingface_hub` 安装它,然后运行:

from huggingface_hub import InferenceClient

client = InferenceClient(base_url="https://:8080", api_key="-")

chat_completion = client.chat.completions.create(
  model="hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4",
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "What is Deep Learning?"},
  ],
  max_tokens=128,
)
openai

您可以通过 `pip install --upgrade openai` 安装它,然后运行:

from openai import OpenAI

client = OpenAI(
    base_url="https://:8080/v1/",
    api_key="-",
)

chat_completion = client.chat.completions.create(
    model="tgi",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is Deep Learning?"},
    ],
    max_tokens=128,
)

(推荐)通过 Cloud Run 服务 URL

Cloud Run 服务分配有一个唯一的 URL,可用于从任何地方发送请求,使用具有 Cloud Run Invoke 服务访问权限的 Google Cloud 凭据;这是推荐的方法,因为它比使用 Cloud Run 代理更安全且更一致。

Cloud Run 服务的 URL 可通过以下命令获取(为方便起见,分配给 `SERVICE_URL` 变量):

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $LOCATION --format 'value(status.url)')

然后,您可以使用 `SERVICE_URL` 和任何具有 Cloud Run Invoke 访问权限的 Google Cloud 凭据向 Cloud Run 上部署的服务发送请求。设置凭据有多种方法,其中一些列在下面

  • 使用 Google Cloud SDK 中的默认身份令牌

    • 通过 gcloud 如下:
    gcloud auth print-identity-token
    • 通过 Python 如下所示
    import google.auth
    from google.auth.transport.requests import Request as GoogleAuthRequest
    
    auth_req = GoogleAuthRequest()
    creds, _ = google.auth.default()
    creds.refresh(auth_req)
    
    id_token = creds.id_token
  • 使用具有 Cloud Run Invoke 访问权限的服务帐户,可以通过以下任何一种方法完成

    • 在 Cloud Run 服务创建之前创建一个服务账号,然后在创建 Cloud Run 服务时将 `--service-account` 标志设置为服务账号电子邮件。并且仅使用 `gcloud auth print-access-token --impersonate-service-account=SERVICE_ACCOUNT_EMAIL` 为该服务账号使用访问令牌。
    • 在 Cloud Run 服务创建后创建一个服务账号,然后更新 Cloud Run 服务以使用该服务账号。并且仅使用 `gcloud auth print-access-token --impersonate-service-account=SERVICE_ACCOUNT_EMAIL` 为该服务账号使用访问令牌。

推荐的方法是使用服务帐户 (SA),因为可以更好地控制访问权限并且权限更细粒度;由于 Cloud Run 服务不是使用 SA 创建的(这是另一个不错的选择),您现在需要创建 SA,授予其必要的权限,更新 Cloud Run 服务以使用 SA,然后生成访问令牌作为请求中的身份验证令牌,该令牌在使用完毕后可以撤销。

  • 为方便起见,设置 `SERVICE_ACCOUNT_NAME` 环境变量。

    export SERVICE_ACCOUNT_NAME=tgi-invoker
  • 创建服务帐户

    gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME
  • 授予服务帐户 Cloud Run 调用者角色

    gcloud run services add-iam-policy-binding $SERVICE_NAME \
        --member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/run.invoker" \
        --region=$LOCATION
  • 为服务帐户生成访问令牌

    export ACCESS_TOKEN=$(gcloud auth print-access-token --impersonate-service-account=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com)

访问令牌是短期的,默认情况下会在 1 小时后过期。如果您想将令牌有效期延长到默认值之外,您必须创建组织策略并在创建令牌时使用 `--lifetime` 参数。请参阅访问令牌生命周期了解更多信息。否则,您也可以通过再次运行相同的命令来生成新令牌。

现在,您已经可以深入研究向已部署的 Cloud Run 服务发送请求的不同替代方案,使用如上所述的 `SERVICE_URL` 和 `ACCESS_TOKEN`。

请注意,以下示例使用的是 `/v1/chat/completions` TGI 端点,该端点与 OpenAI 兼容,这意味着 `cURL` 和 Python 只是其中的一些建议,但可以使用任何 OpenAI 兼容的客户端。

cURL

要使用 `cURL` 向 TGI 服务发送 POST 请求,您可以运行以下命令:

curl $SERVICE_URL/v1/chat/completions \
    -X POST \
    -H "Authorization: Bearer $ACCESS_TOKEN" \
    -H 'Content-Type: application/json' \
    -d '{
        "model": "tgi",
        "messages": [
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": "What is Deep Learning?"
            }
        ],
        "max_tokens": 128
    }'

Python

要使用 Python 进行推理,您可以使用 `huggingface_hub` Python SDK(推荐)或 `openai` Python SDK。

huggingface_hub

您可以通过 `pip install --upgrade --quiet huggingface_hub` 安装它,然后运行:

import os
from huggingface_hub import InferenceClient

client = InferenceClient(
    base_url=os.getenv("SERVICE_URL"),
    api_key=os.getenv("ACCESS_TOKEN"),
)

chat_completion = client.chat.completions.create(
  model="hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4",
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "What is Deep Learning?"},
  ],
  max_tokens=128,
)
openai

您可以通过 `pip install --upgrade openai` 安装它,然后运行:

import os
from openai import OpenAI

client = OpenAI(
    base_url=os.getenv("SERVICE_URL"),
    api_key=os.getenv("ACCESS_TOKEN"),
)

chat_completion = client.chat.completions.create(
    model="tgi",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is Deep Learning?"},
    ],
    max_tokens=128,
)

资源清理

最后,一旦您使用 Cloud Run 服务上的 TGI 完毕,您可以安全地删除它,以避免产生不必要的成本,例如如果 Cloud Run 服务在免费套餐中无意中被调用次数超过您的每月 Cloud Run 调用分配。

要删除 Cloud Run 服务,您可以前往 Google Cloud 控制台 https://console.cloud.google.com/run 手动删除;或者通过 `gcloud` 使用 Google Cloud SDK,如下所示:

gcloud run services delete $SERVICE_NAME --region $LOCATION

此外,如果您按照通过 Cloud Run 服务 URL 中的步骤生成了服务账号和访问令牌,则可以删除服务账号,或者如果访问令牌仍然有效,则只需撤销它。

  • (推荐)撤销访问令牌,如下所示:
gcloud auth revoke --impersonate-service-account=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
  • (可选)删除服务帐户,如下所示:
gcloud iam service-accounts delete $SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com

参考资料


📍 在 GitHub 这里找到完整示例!

< > 在 GitHub 上更新