你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:将 NVIDIA Llama3 NIM 部署到 Azure 容器应用

NVIDIA 推理微服务 (NIC) 是经过优化、容器化的 AI 推理微服务,可简化和加速生成 AI 应用程序。 这些模型预先打包、可缩放且经过性能优化,可在 Azure 容器应用上作为安全终结点直接部署。 将 Azure 容器应用与无服务器 GPU 配合使用时,可以高效运行这些 NIC,而无需管理底层基础结构。

本教程介绍如何使用无服务器 GPU 将 Llama3 NVIDIA NIM 部署到 Azure 容器应用。

本教程使用 Azure 容器注册表的高级实例来提高使用无服务器 GPU 时的冷启动性能。 如果不想使用高级 Azure 容器注册表,请确保将本教程中的 az acr create 命令修改为将 --sku 设置为 basic

先决条件

资源 DESCRIPTION
Azure 帐户 具有活动订阅的 Azure 帐户。

如果还没有,则可以免费创建一个
Azure CLI(Azure 命令行界面) 安装 Azure CLI
NVIDIA NGC API 密钥 可以从 NVIDIA GPU Cloud (NGC) 网站获取 API 密钥。

设置

若要从 CLI 登录到 Azure,请运行以下命令,然后按照提示完成身份验证过程。

az login

为了确保运行最新版本的 CLI,请运行 upgrade 命令。

az upgrade

接下来,安装或更新适用于 CLI 的 Azure 容器应用扩展。

如果在 Azure CLI 中运行 az containerapp 命令,或在 PowerShell 中运行 Az.App 模块中的 cmdlet 时收到有关缺少参数的错误,请确保已安装最新版本的 Azure 容器应用扩展。

az extension add --name containerapp --upgrade

注释

从 2024 年 5 月开始,Azure CLI 扩展不再默认启用预览功能。 要访问容器应用预览功能,请使用 --allow-preview true 安装容器应用扩展。

az extension add --name containerapp --upgrade --allow-preview true

安装当前扩展或模块后,请注册 Microsoft.AppMicrosoft.OperationalInsights 命名空间。

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
  1. 通过为资源组命名和设置位置来设置环境变量。

    RESOURCE_GROUP="my-resource-group"
    LOCATION="swedencentral"
    

    接下来,生成唯一的容器注册表名称。

    SUFFIX=$(head /dev/urandom | tr -dc 'a-z0-9' | head -c 6)
    ACR_NAME="mygpututorialacr${SUFFIX}"
    

    最后,将变量设置为给环境命名并标识环境、工作负载配置文件类型、容器应用名称和容器。

    CONTAINERAPPS_ENVIRONMENT="my-environment-name"
    GPU_TYPE="Consumption-GPU-NC24-A100"
    CONTAINER_APP_NAME="llama3-nim"
    CONTAINER_AND_TAG="llama-3.1-8b-instruct:latest"
    

创建 Azure 资源组

创建一个资源组来组织与你的容器应用部署相关的服务。

az group create \
  --name $RESOURCE_GROUP \
  --location "$LOCATION"
  1. 创建 Azure 容器注册表(ACR)。

    注释

    本教程使用高级 Azure 容器注册表来提高使用无服务器 GPU 时的冷启动性能。 如果不想使用高级 Azure 容器注册表,请修改以下命令并将 --sku 设置为 basic

    az acr create \
      --resource-group $RESOURCE_GROUP \
      --name $ACR_NAME \
      --location $LOCATION \
      --sku premium
    

拉取、标记和推送映像

接下来,从 NVIDIA GPU Cloud 拉取映像并推送到 Azure 容器注册表。

注释

每个 NVIDIA NIC 都有自己的硬件要求。 请确保所选的 GPU 类型支持所选的 NIM。 本教程中使用的 Llama3 NIM 可以在 NVIDIA A100 GPU 上运行。

  1. 向 NVIDIA 容器注册表进行身份验证。

    docker login nvcr.io
    

    运行此命令后,登录过程会提示输入用户名。 输入用户名值“$oauthtoken”。

    随后,系统会提示输入密码。 在此处输入 NVIDIA NGC API 密钥。 向 NVIDIA 注册表进行身份验证后,即可向 Azure 注册表进行身份验证。

  2. 向 Azure 容器注册表进行身份验证。

    az acr login --name $ACR_NAME
    
  3. 拉取 Llama3 NIM 映像。

    docker pull nvcr.io/nim/meta/$CONTAINER_AND_TAG
    
  4. 为映像添加标记。

    docker tag nvcr.io/nim/meta/$CONTAINER_AND_TAG $ACR_NAME.azurecr.io/$CONTAINER_AND_TAG
    
  5. 向 Azure 容器注册表推送映像。

    docker push $ACR_NAME.azurecr.io/$CONTAINER_AND_TAG
    

容器应用运行时,它会从容器注册表拉取容器。 如果映像较大,例如 AI 工作负载中的映像,则此映像拉取可能需要一些时间。 通过启用工件流式处理,可以缩短所需的时间,如果未启用工件流式处理,容器应用可能需要很长时间才能启动。 使用以下步骤启用工件流式处理。

注释

以下命令可能需要几分钟才能完成。

  1. 在容器注册表上启用工件流式处理。

    az acr artifact-streaming update \
        --name $ACR_NAME \
        --repository llama-3.1-8b-instruct \
        --enable-streaming True
    
  2. 在容器映像上启用工件流式处理。

    az acr artifact-streaming create \
      --name $ACR_NAME \
      --image $CONTAINER_AND_TAG
    

创建容器应用

接下来,使用 NVIDIA GPU Cloud API 密钥创建容器应用。

  1. 创建容器应用。

    az containerapp env create \
      --name $CONTAINERAPPS_ENVIRONMENT \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION \
      --enable-workload-profiles
    
  2. 将 GPU 工作负载配置文件添加到环境。

    az containerapp env workload-profile add \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINERAPPS_ENVIRONMENT \
        --workload-profile-type $GPU_TYPE \
        --workload-profile-name LLAMA_PROFILE
    
  3. 创建容器应用。

    az containerapp create \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --environment $CONTAINERAPPS_ENVIRONMENT \
      --image $ACR_NAME.azurecr.io/$CONTAINER_AND_TAG \
      --cpu 24 \
      --memory 220 \
      --target-port 8000 \
      --ingress external \
      --secrets ngc-api-key=<PASTE_NGC_API_KEY_HERE> \
      --env-vars NGC_API_KEY=secretref:ngc-api-key \
      --registry-server $ACR_NAME.azurecr.io \
      --workload-profile-name LLAMA_PROFILE \
      --query properties.configuration.ingress.fqdn
    

    此命令返回容器应用的 URL。 在文本编辑器中留出此值,以便在后续命令中使用。

验证应用程序是否正常工作

可以通过向应用程序发送请求 POST 来验证部署是否成功。

运行此命令之前,请确保将 <YOUR_CONTAINER_APP_URL> URL 替换为上一个命令返回的容器应用 URL。

curl -X POST \
  'http://<YOUR_CONTAINER_APP_URL>/v1/completions' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "meta/llama-3.1-8b-instruct",
    "prompt":  [{"role":"user", "content":"Once upon a time..."}],
    "max_tokens": 64
  }'

使用卷装载提高性能(可选)

在启动和使用工件流式处理与 Azure 容器注册表时,Azure 容器应用仍在启动时从容器注册表拉取映像。 即使优化了工件流式处理,此操作也会导致冷启动。

为了缩短冷启动时间,许多 NIM 提供了一个卷装载路径,用于将映像存储在缓存目录中。 可以使用此缓存目录来存储模型权重以及 NIM 运行所需的其他文件。

若要为 Llama3 NIM 设置卷装载,需要在 NVIDIA Llama-3.1-8b 文档中指定的 ./opt/nim/.cache 上设置卷装载。 为此,请遵循卷装载教程中的步骤并将卷装载路径设置为 /opt/nim/.cache

清理资源

如果不打算继续使用此应用程序,请运行以下命令,删除资源组以及本教程中创建的所有资源。

谨慎

以下命令删除指定的资源组及其包含的所有资源。 此命令还会删除此资源组中存在的本教程范围外的任何资源。

az group delete --name $RESOURCE_GROUP

小提示

遇到问题? 通过在 Azure 容器应用存储库中创建问题,在 GitHub 上告知我们。