Google Cloud 文档

在 Vertex AI 上部署 Llama 3.2 11B Vision 与 TGI DLC

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验的访问权限

开始

在 Vertex AI 上部署 Llama 3.2 11B Vision 与 TGI DLC

Llama 3.2 是由 Meta 发布的 Llama 家族的最新开源 LLM 版本(截至 2024 年 10 月);Llama 3.2 Vision 有两个版本:11B,适合在消费级 GPU 上高效部署和开发,以及 90B,适合大型应用。文本生成推理 (TGI) 是 Hugging Face 开发的用于部署和服务 LLM 的工具包,具有高性能的文本生成功能。此外,Google Vertex AI 是一个机器学习 (ML) 平台,可让您训练和部署 ML 模型和 AI 应用程序,以及定制大型语言模型 (LLM) 以用于您的 AI 驱动的应用程序。

本示例展示了如何通过 Hugging Face 为 Google Cloud 上的文本生成推理 (TGI) 打造的专用深度学习容器 (DLC) 在 Vertex AI 上部署 meta-llama/Llama-3.2-11B-Vision-Instruct

关于许可条款,Llama 3.2 的许可证与 Llama 3.1 非常相似,但在可接受使用政策方面有一个关键区别:任何居住在欧盟 (EU) 或主要营业地在欧盟 (EU) 的公司,都未被授予使用 Llama 3.2 中包含的多模态模型的许可权利。此限制不适用于使用任何此类多模态模型的产品或服务的最终用户,因此人们仍然可以使用视觉变体构建全球产品。

有关完整详细信息,请务必阅读 官方许可证可接受使用政策

'google/gemma-7b-it' in the Hugging Face Hub

设置/配置

首先,您需要在本地机器上安装 gcloud,它是 Google Cloud 的命令行工具,请按照 Cloud SDK 文档 - 安装 gcloud CLI 中的说明进行操作。

然后,您还需要安装 google-cloud-aiplatform Python SDK,这是以编程方式创建 Vertex AI 模型、注册模型、创建端点以及在 Vertex AI 上部署模型所需的。

!pip install --upgrade --quiet google-cloud-aiplatform

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

%env PROJECT_ID=your-project-id
%env LOCATION=your-location
%env CONTAINER_URI=us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu124.2-3.ubuntu2204.py311

然后,您需要登录到您的 GCP 帐户,并将项目 ID 设置为要在 Vertex AI 上注册和部署模型时使用的项目 ID。

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

登录后,您需要在 GCP 中启用必要的服务 API,例如 Vertex AI API、Compute Engine API 和 Google Container Registry 相关 API。

!gcloud services enable aiplatform.googleapis.com
!gcloud services enable compute.googleapis.com
!gcloud services enable container.googleapis.com
!gcloud services enable containerregistry.googleapis.com
!gcloud services enable containerfilesystem.googleapis.com

一切设置完成后,您就可以通过 google-cloud-aiplatform Python SDK 初始化 Vertex AI 会话,如下所示

import os
from google.cloud import aiplatform

aiplatform.init(
    project=os.getenv("PROJECT_ID"),
    location=os.getenv("LOCATION"),
)

在 Vertex AI 上注册模型

由于 meta-llama/Llama-3.2-11B-Vision-Instruct 是一个门控模型,在欧盟 (EU) 具有访问限制,这意味着您需要接受许可协议。

要为 Hugging Face Hub 生成令牌,您可以按照 Hugging Face Hub - 用户访问令牌 中的说明进行操作;生成的令牌可以是细粒度的,以访问模型,也可以只是对您的帐户的整体只读访问权限。

!pip install --upgrade --quiet huggingface_hub
from huggingface_hub import interpreter_login

interpreter_login()

然后,您就可以“上传”模型,即在 Vertex AI 上注册模型。这不是真正的上传,因为模型将在启动时通过 MODEL_ID 环境变量从 Hugging Face Hub 中的 Hugging Face TGI DLC 自动下载,因此上传的只是配置,而不是模型权重。

在进入代码之前,让我们快速回顾一下提供给 upload 方法的参数

  • display_name 是将在 Vertex AI 模型注册表中显示的名称。

  • serving_container_image_uri 是将用于为模型提供服务的 Hugging Face TGI DLC 的位置。

  • serving_container_environment_variables 是将在容器运行时使用的环境变量,因此这些变量与 text-generation-inference 定义的环境变量保持一致,这些环境变量类似于 text-generation-launcher 参数。此外,Hugging Face TGI DLC 还捕获来自 Vertex AI 的 AIP_ 环境变量,如 Vertex AI 文档 - 预测的自定义容器要求 中所述。

    • MODEL_ID 是模型在 Hugging Face Hub 中的标识符。要探索所有支持的模型,您可以查看 Hugging Face Hub 中标记为 text-generation-inference 的模型

    • NUM_SHARD 是您不想使用给定机器上的所有 GPU 时要使用的分片数,例如,如果您有两块 GPU,但只想使用一块 GPU 进行 TGI,那么 NUM_SHARD=1,否则它将匹配 CUDA_VISIBLE_DEVICES

    • MAX_INPUT_TOKENS 是允许的最大输入长度(以标记数表示),它越大,提示符可以越大,但也会消耗更多内存。

    • MAX_TOTAL_TOKENS 是最重要的设置值,因为它定义了运行客户端请求的“内存预算”,该值越大,每个请求在您的 RAM 中所占的空间越大,批处理的效率越低。

    • MAX_BATCH_PREFILL_TOKENS 限制预填充操作的标记数,因为它占用了最多的内存并且是计算绑定的,因此限制可以发送的请求数很有趣。

    • HF_HUB_ENABLE_HF_TRANSFER 用于启用通过 hf_transfer 库实现更快的下载速度。

    • HUGGING_FACE_HUB_TOKEN 是 Hugging Face Hub 令牌,需要使用,因为 meta-llama/Llama-3.2-11B-Vision-Instruct 是一个门控模型,在欧盟 (EU) 具有访问限制。

      此外,您需要指定 MESSAGES_API_ENABLED 环境变量,该变量在 TGI 2.3.0 版本中引入,因为 Messages API 需要处理输入有效负载中的文本和图像。

    • MESSAGES_API_ENABLED 设置为“true”以使用 Messages API,即 /v1/chat/completions,而不是 Generation API,即 /generation(默认)。

  • (可选)serving_container_ports 是 Vertex AI 端点将要公开的端口,默认情况下为 8080。

有关支持参数的更多信息,您可以查看 aiplatform.Model.upload Python 参考

请注意,MESSAGES_API_ENABLED 标志仅从 TGI 2.3 DLC 开始才有效,即 us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu124.2-3.ubuntu2204.py311

对于之前的版本,MESSAGES_API_ENABLED 标志将不起作用,因为它是在 以下 TGI PR 中引入的,不兼容的版本是

  • us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu121.1-4.ubuntu2204.py310
  • us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu121.2-0.ubuntu2204.py310
  • us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu121.2-1.ubuntu2204.py310
  • us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu121.2-2.ubuntu2204.py310
from huggingface_hub import get_token

model = aiplatform.Model.upload(
    display_name="Llama-Vision-11B",
    serving_container_image_uri=os.getenv("CONTAINER_URI"),
    serving_container_environment_variables={
        "MODEL_ID": "meta-llama/Llama-3.2-11B-Vision-Instruct",
        "NUM_SHARD": "2",
        "MAX_INPUT_TOKENS": "512",
        "MAX_TOTAL_TOKENS": "1024",
        "MAX_BATCH_PREFILL_TOKENS": "1512",
        "HF_HUB_ENABLE_HF_TRANSFER": "1",
        "HUGGING_FACE_HUB_TOKEN": get_token(),
        "MESSAGES_API_ENABLED": "true",
    },
    serving_container_ports=[8080],
)
model.wait()

Model on Vertex AI Model Registry

在 Vertex AI 上部署模型

在模型注册到 Vertex AI 之后,您需要定义要将模型部署到的端点,然后将模型部署链接到该端点资源。

为此,您需要调用 aiplatform.Endpoint.create 方法来创建一个新的 Vertex AI 端点资源(它还没有链接到模型或任何可用的东西)。

endpoint = aiplatform.Endpoint.create(display_name="Llama-Vision-11B-API")

Vertex AI Endpoint created

现在,您可以在 Vertex AI 上的端点中部署注册的模型。

deploy 方法将先前创建的端点资源链接到包含服务容器配置的模型,然后,它将在指定的实例上在 Vertex AI 上部署模型。

在进入代码之前,让我们快速回顾一下提供给 deploy 方法的参数。

  • endpoint 是要将模型部署到的端点,它是可选的,默认情况下将设置为模型显示名称,后缀为 _endpoint

  • machine_typeaccelerator_typeaccelerator_count 是定义使用哪个实例的参数,此外,还定义了要使用的加速器以及加速器的数量。machine_typeaccelerator_type 是绑定在一起的,因此您需要选择一个支持您使用的加速器的实例,反之亦然。有关不同实例的更多信息,请访问 Compute Engine 文档 - GPU 机器类型,以及有关 accelerator_type 命名的更多信息,请访问 Vertex AI 文档 - MachineSpec

有关支持参数的更多信息,您可以查看 aiplatform.Model.deploy Python 参考

deployed_model = model.deploy(
    endpoint=endpoint,
    machine_type="g2-standard-24",
    accelerator_type="NVIDIA_L4",
    accelerator_count=2,
)

警告通过 deploy 方法进行的 Vertex AI 端点部署可能需要 15 到 25 分钟。

Vertex AI Endpoint running the model

在 Vertex AI 上进行在线预测

最后,您可以使用 predict 方法在 Vertex AI 上运行在线预测,该方法会将请求发送到运行的端点,在 /predict 路由中,该路由遵循 Vertex AI I/O 有效负载格式。 遵循 Vertex AI I/O 有效负载格式的容器中指定的 /predict 路由。

请注意,输入有效负载与标准文本生成推理 (TGI) 有所不同,因为 meta-llama/Llama-3.2-11B-Vision-Instruct 是一个视觉语言模型 (VLM),因为这些模型同时使用文本和图像。有关更多信息,请访问 TGI 中的视觉语言模型推理

通过 Python

在同一个会话中

如果您愿意在当前会话中运行在线预测,您可以通过 aiplatform.Endpoint(由 aiplatform.Model.deploy 方法返回)以编程方式发送请求,如下面的代码片段所示。

output = deployed_model.predict(
    instances=[
        {
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {"type": "text", "text": "What's in this image?"},
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/rabbit.png"
                            },
                        },
                    ],
                },
            ],
            "parameters": {
                "max_new_tokens": 256,
                "do_sample": True,
                "top_p": 0.95,
                "temperature": 1.0,
                "stream": False,
            },
        },
    ],
)
print(output.predictions[0])
该图像描绘了一个穿着宇航服的人形兔子,它站在一个岩石的、外星般的星球上。它是一个风格化的插图。

从不同的会话中

如果 Vertex AI 端点部署在不同的会话中,并且您想使用它,但无法访问上一节中 aiplatform.Model.deploy 方法返回的 deployed_model 变量;您还可以运行以下代码片段来实例化部署的 aiplatform.Endpoint,方法是使用其资源名称作为 projects/{PROJECT_ID}/locations/{LOCATION}/endpoints/{ENDPOINT_ID}

请注意,您需要通过 Google Cloud Console 自己检索资源名称,即 projects/{PROJECT_ID}/locations/{LOCATION}/endpoints/{ENDPOINT_ID} URL,或者只替换 ENDPOINT_ID,它可以通过之前实例化的端点作为 endpoint.id 或通过 Google Cloud Console 在在线预测中找到端点所在的列表。

import os
from google.cloud import aiplatform

aiplatform.init(project=os.getenv("PROJECT_ID"), location=os.getenv("LOCATION"))

endpoint_display_name = "Llama-Vision-11B-API"  # TODO: change to your endpoint display name

# Iterates over all the Vertex AI Endpoints within the current project and keeps the first match (if any), otherwise set to None
ENDPOINT_ID = next(
    (endpoint.name for endpoint in aiplatform.Endpoint.list() if endpoint.display_name == endpoint_display_name), None
)
assert ENDPOINT_ID, (
    "`ENDPOINT_ID` is not set, please make sure that the `endpoint_display_name` is correct at "
    f"https://console.cloud.google.com/vertex-ai/online-prediction/endpoints?project={os.getenv('PROJECT_ID')}"
)

endpoint = aiplatform.Endpoint(
    f"projects/{os.getenv('PROJECT_ID')}/locations/{os.getenv('LOCATION')}/endpoints/{ENDPOINT_ID}"
)
output = endpoint.predict(
    instances=[
        {
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "text",
                            "text": "How long does it take from invoice date to due date? Be short and concise.",
                        },
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": "https://huggingface.co/datasets/huggingface/release-assets/resolve/main/invoice.png"
                            },
                        },
                    ],
                },
            ],
            "parameters": {
                "max_new_tokens": 256,
                "do_sample": True,
                "top_p": 0.95,
                "temperature": 1.0,
                "stream": False,
            },
        },
    ],
)
print(output.predictions[0])
Invoice Image 要计算发票日期和到期日期之间的时间差,我们需要从到期日期中减去发票日期。

发票日期:2019 年 11 月 02 日
到期日期:2019 年 2 月 26 日

时间差 = 到期日期 - 发票日期
时间差 = 2019 年 2 月 26 日 - 2019 年 11 月 02 日
时间差 = 15 天

因此,从发票日期到到期日期需要 15 天

通过 Vertex AI 在线预测 UI

或者,为了测试目的,你也可以使用 Vertex AI 在线预测 UI,它提供了一个字段,期望按照 Vertex AI 规范(如上面的示例所示)格式化的 JSON 负载

{
    "instances": [
        {
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "text",
                            "text": "What's in this image?"
                        },
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/rabbit.png"
                            }
                        }
                    ]
                }
            ],
            "parameters": {
                "max_new_tokens": 256,
                "do_sample": true,
                "top_p": 0.95,
                "temperature": 1.0,
                "stream": false
            }
        }
    ]
}

Vertex AI Endpoint online inference

资源清理

最后,您可以按照以下步骤释放已创建的资源,以避免不必要的费用

  • deployed_model.undeploy_all 从所有端点取消模型部署。
  • deployed_model.delete 在使用 undeploy_all 方法后,优雅地删除模型部署到的端点。
  • model.delete 从注册表中删除模型。
deployed_model.undeploy_all()
deployed_model.delete()
model.delete()

或者,您也可以按照以下步骤从 Google Cloud Console 中删除它们

  • 在 Google Cloud 中转到 Vertex AI
  • 转到部署和使用 -> 在线预测
  • 点击端点,然后点击已部署的模型,以“从端点取消部署模型”
  • 然后返回端点列表并删除端点
  • 最后,转到部署和使用 -> 模型注册表,并删除模型

📍 在 GitHub 上找到完整的示例 此处

< > 更新 在 GitHub 上