在 Cloud Run 上部署 Meta Llama 3.1 8B 和 TGI DLC
Meta Llama 3.1 是 Meta 于 2024 年 7 月发布的最新开源大型语言模型。Meta Llama 3.1 提供三种尺寸:8B 适用于在消费级 GPU 上进行高效部署和开发,70B 适用于大规模 AI 原生应用,以及 405B 适用于合成数据、LLM 作为评判者或蒸馏;以及其他用例。文本生成推理 (TGI) 是 Hugging Face 开发的一个工具包,用于部署和服务大型语言模型,并具有高性能的文本生成能力。Google Cloud Run 是一款无服务器容器平台,允许开发人员部署和管理容器化应用程序,无需管理基础设施,从而实现自动扩展,并且仅按使用量付费。
此示例展示了如何从 Hugging Face Hub 部署大型语言模型,在本例中为使用 AWQ 量化为 INT4 的 Meta Llama 3.1 8B 指令模型,以及在支持 GPU 的 Google Cloud Run 上使用 Hugging Face TGI DLC(预览版)。
Cloud Run 上的 GPU 支持仅作为等待列表中的公开预览版提供。如果您有兴趣试用此功能,请申请配额增加 每个项目每个区域的 NVIDIA L4 GPU 总配额
。在撰写此示例时,NVIDIA L4 GPU(24GiB VRAM)是 Cloud Run 上唯一可用的 GPU;默认情况下允许自动扩展到 7 个实例(通过配额可以获得更多实例),并在没有请求时缩减到零实例。
设置/配置
首先,您需要在本地机器上安装 gcloud
,这是 Google Cloud 的命令行工具,请按照Cloud SDK 文档 - 安装 gcloud CLI 中的说明进行操作。
可选地,为了简化本教程中命令的使用,您需要为 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,这是在 Cloud Run 上部署 Hugging Face TGI DLC 所必需的。
gcloud services enable run.googleapis.com
在 Cloud Run 上部署 TGI
一切准备就绪后,您可以调用 gcloud beta run deploy
命令(仍然处于测试版,因为如上所述,GPU 支持处于预览阶段)。
gcloud beta run deploy
命令需要您指定以下参数
--image
:要部署的容器镜像 URI。--args
:传递给容器入口点的参数,对于 Hugging Face TGI DLC 而言为text-generation-launcher
。有关支持的参数的更多信息,请参阅Text-generation-launcher 参数。--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 上的 GPU 仍在预览阶段。--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 上部署新容器时,部署大约需要 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
然后,您可以使用代理公开的 http://localhost:8080 URL 向部署在 Cloud Run 上的服务发送请求,无需身份验证,如下例所示。
请注意,以下示例使用的是与 OpenAI 兼容的 /v1/chat/completions
TGI 端点,这意味着 cURL
和 Python 只是其中一些建议,但可以使用任何与 OpenAI 兼容的客户端来代替。
cURL
要使用 cURL
向 TGI 服务发送 POST 请求,您可以运行以下命令
curl http://localhost: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
安装它,方法是 pip install --upgrade --quiet huggingface_hub
,然后运行
from huggingface_hub import InferenceClient
client = InferenceClient(base_url="http://localhost: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
安装它,方法是 pip install --upgrade openai
,然后运行
from openai import OpenAI
client = OpenAI(
base_url="http://localhost: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 调用访问权限的 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 调用访问权限的 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 调用访问权限的服务帐号,这可以通过以下任一方法完成
- 在创建 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
使用该服务帐号的访问令牌。
- 在创建 Cloud Run 服务之前创建服务帐号,然后在创建 Cloud Run 服务时将
建议的方法是使用服务帐号 (SA),因为可以更好地控制访问权限,并且权限更细粒度;由于 Cloud Run 服务不是使用 SA 创建的,这是另一个不错的选择,您现在需要创建 SA,授予其必要的权限,更新 Cloud Run 服务以使用 SA,然后生成一个访问令牌以将其设置为请求中的身份验证令牌,稍后在您完成使用后可以撤销该令牌。
为方便起见,设置
SERVICE_ACCOUNT_NAME
环境变量export SERVICE_ACCOUNT_NAME=text-generation-inference-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
参数。请参阅(访问令牌生命周期)[[https://cloud.google.com/resource-manager/docs/organization-policy/restricting-service-accounts#extend_oauth_ttl]]以了解更多信息。否则,您也可以通过再次运行相同的命令来生成新的令牌。
现在,您已经可以深入了解使用上面描述的 SERVICE_URL
和 ACCESS_TOKEN
向部署的 Cloud Run 服务发送请求的不同替代方案。
请注意,以下示例使用的是与 OpenAI 兼容的 /v1/chat/completions
TGI 端点,这意味着 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
安装它,方法是 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
安装它,方法是 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 服务,您可以转到 https://console.cloud.google.com/run 上的 Google Cloud Console 并手动删除;或者使用 Google Cloud SDK 通过 gcloud
如下所示
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 上查找完整示例 此处!