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

教程:在 ACA 上使用 Azure Functions 通过无服务器 GPU 部署 AI 图像生成

在本教程中,你将部署一个稳定扩散驱动的映像生成器,该生成器在 Azure 容器应用 中使用无服务器 GPU。 可以根据需求将此解决方案部署为Azure Functions应用或标准容器应用。 在本教程结束时,你有一个可按需自动缩放的工作 AI 映像生成服务。

无服务器 GPU 提供对 GPU 计算资源的按需访问,而无需进行基础结构管理。 您只需按实际使用的 GPU 时长付费,并且该解决方案在空闲时可缩减至零。

本教程中,您将学习如何:

  • 请求和验证订阅的 GPU 配额
  • 使用 GPU 工作负荷配置文件创建容器应用环境
  • 使用无服务器 GPU 部署 AI 映像生成 API
  • 使用文本生成图像请求来测试部署
  • 监视 GPU 利用率并优化性能
  • 清理资源以避免持续成本

先决条件

在开始之前,请验证是否具有以下项:

Requirement 详细信息
Azure 订阅 如果没有帐户,请创建一个免费帐户
GPU 配额 请求 GPU 配额访问。 审批通常需要一到两个工作日。
Azure CLI 安装 Azure CLI 2.62.0 或更高版本。
Azure 开发人员命令行界面(azd) 安装 Azure 开发人员 CLI 以简化部署。
Docker Desktop 安装 Docker Desktop。 必需用于本地容器开发。

重要

在开始本教程之前请求 GPU 配额访问。 等待审批时可以继续阅读,但部署需要批准的配额。

验证工具是否已正确安装:

az --version
azd version
docker --version

体系结构概述

此解决方案使用以下 Azure 服务:

组件 目的
Azure 容器应用 为您的应用程序提供支持无服务器 GPU 的托管服务。
GPU 工作负荷配置文件 为 AI 推理提供 NVIDIA T4 GPU 计算。
Azure 容器注册表 存储自定义容器映像。
Azure 存储 对于 Azure Functions 运行时是必需的(仅限 Functions 部署)。
Application Insights 提供监视和诊断。

当客户端发送请求时,它会到达容器应用入口终结点。 应用程序处理请求并将其传递给 GPU 上运行的稳定扩散模型。 该模型根据提示生成请求的图像,并将生成的图像作为响应返回。

成本注意事项

无服务器 GPU 按秒计费。 在部署之前查看这些因素:

因子 影响
GPU 类型 NVIDIA T4 成本低于 A100。
最小副本数 设置为 0 以进行开发(空闲时缩放为零)。
冷启动时间 首次请求需要 1-2 分钟,因为模型需要先下载(约 5 GB)并加载到 GPU 显存中。
请求持续时间 图像生成通常需要每个请求 5-15 秒。

有关详细定价,请参阅 Azure 容器应用定价

获取示例代码

克隆包含Azure Functions实现的示例存储库:

git clone https://github.com/Azure-Samples/function-on-aca-gpu.git
cd function-on-aca-gpu

存储库包含以下文件:

文件 目的
function_app.py 生成图像的 HTTP 触发函数。
requirements.txt Python依赖项,包括漫射器库。
Dockerfile 支持 GPU 的容器映像定义。
host.json Azure Functions 配置。
azure.yaml Azure开发人员 CLI 部署配置。

使用 Azure 门户进行部署

按照以下步骤创建启用了 GPU 的容器应用,并使用 Azure 门户部署映像生成解决方案。

使用 GPU 创建容器应用环境

  1. 打开 Azure 门户并搜索 Container Apps

  2. 选择“创建”>“容器应用”

  3. 在“基本信息”选项卡上,输入以下值:

    设置 价值
    Subscription 选择您的 Azure 订阅。
    资源组 选择“ 新建 ”并输入 rg-gpu-image-gen
    容器应用名称 输入 ca-image-gen
    部署源 选择“容器映像”
    Region 选择 瑞典中部
  4. “容器应用”环境中,选择“ 新建”。

  5. “创建容器应用”环境 对话框中,输入 cae-gpu-image-gen 环境名称。

  6. 选择创建以创建环境。

  7. 选择“下一步: 容器 >”

使用 GPU 配置容器

  1. “容器 ”选项卡上,输入以下值:

    设置 价值
    名称 输入 gpu-image-gen-container
    映像源 选择 Docker Hub 或其他注册表
    图像类型 选择“公共”。
    注册表登录服务器 输入 mcr.microsoft.com
    图像和标记 输入 k8se/gpu-quickstart:latest
    工作负荷配置文件 选择 消耗 - 最多 4 个 vCPU、8 GiB 内存
    GPU 选中此框以启用 GPU。
    GPU 类型 选择 Consumption-GPU-NC8as-T4 ,然后选择添加配置文件的链接。
  2. 选择“下一步: 流入量 >”

配置入口

  1. “入口 ”选项卡上,输入以下值:

    设置 价值
    入口 选择启用
    入口流量 选择 “从任意位置接受流量”。
    目标端口 输入 80
  2. 选择“查看 + 创建”

  3. 检查设置,然后选择“创建”。

  4. 等待部署完成(大约 5 分钟),然后选择“ 转到资源”。

验证部署

  1. 在“容器应用 概述 ”页上,复制 应用程序 URL

  2. 在浏览器中打开 URL 以访问图像生成接口。

使用 Azure CLI 进行部署

可以使用 Azure 开发人员 CLI(建议用于 Functions 应用)或Azure CLI(进行更多控制)进行部署。

使用 Azure Developer CLI 部署为 Azure Functions 应用

Azure 开发人员 CLI 为 Azure Functions 实现提供最快的部署体验。

  1. 转到克隆的存储库:

    cd function-on-aca-gpu
    
  2. 初始化和部署应用程序:

    azd up
    
  3. 出现提示时,输入以下值:

    提示 价值
    环境名称 输入唯一名称(例如, gpufunc-dev)。
    Azure 位置 选择 swedencentral
    Azure 订阅 选择订阅。

    部署大约需要 15-20 分钟。

  4. 部署完成后,请注意输出中显示的终结点 URL。

azd up 命令将创建:

资源 目的
资源组 包含所有资源的容器。
容器应用环境 使用 GPU 工作负荷配置文件托管应用。
容器注册表 存储自定义容器映像。
存储帐户 Azure Functions 运行时所必需。
Application Insights 监视和诊断。
Function App 映像生成 API。

使用 Azure CLI 部署为容器应用

若要更好地控制每个资源,请使用Azure CLI单独创建资源。

  1. 设置环境变量:

    RESOURCE_GROUP="rg-gpu-image-gen"
    ENVIRONMENT_NAME="cae-gpu-image-gen"
    LOCATION="swedencentral"
    CONTAINER_APP_NAME="ca-image-gen"
    CONTAINER_IMAGE="mcr.microsoft.com/k8se/gpu-quickstart:latest"
    WORKLOAD_PROFILE_NAME="NC8as-T4"
    WORKLOAD_PROFILE_TYPE="Consumption-GPU-NC8as-T4"
    

    这些变量定义在整个部署中使用的配置值。 指定 WORKLOAD_PROFILE_TYPE NVIDIA T4 GPU 配置。

  2. 创建资源组:

    az group create \
      --name $RESOURCE_GROUP \
      --location $LOCATION \
      --query "properties.provisioningState" \
      --output tsv
    

    此命令在瑞典 Central 中创建一个资源组,该资源组支持 GPU 工作负荷配置文件。 输出将显示 Succeeded

  3. 创建容器应用环境:

    az containerapp env create \
      --name $ENVIRONMENT_NAME \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION \
      --query "properties.provisioningState" \
      --output tsv
    

    此命令创建托管容器应用的托管环境。 输出将显示 Succeeded

  4. 将 GPU 工作负荷配置文件添加到环境:

    az containerapp env workload-profile add \
      --name $ENVIRONMENT_NAME \
      --resource-group $RESOURCE_GROUP \
      --workload-profile-name $WORKLOAD_PROFILE_NAME \
      --workload-profile-type $WORKLOAD_PROFILE_TYPE
    

    此命令将 NVIDIA T4 GPU 工作负荷配置文件添加到环境中,为使用该配置文件的容器启用 GPU 计算。

  5. 使用 GPU 支持创建容器应用:

    az containerapp create \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --environment $ENVIRONMENT_NAME \
      --image $CONTAINER_IMAGE \
      --target-port 80 \
      --ingress external \
      --cpu 8.0 \
      --memory 56.0Gi \
      --workload-profile-name $WORKLOAD_PROFILE_NAME \
      --query properties.configuration.ingress.fqdn \
      --output tsv
    

    此命令将创建容器应用并将其分配给 GPU 工作负荷配置文件。 --cpu--memory值符合T4配置文件要求。 该命令输出应用程序 URL。

  6. 复制输出 URL,以便在下一部分中进行测试。 --location $LOCATION
    --query "properties.provisioningState"
    --output tsv

    
    This command creates the managed environment that hosts your container apps. The output should display `Succeeded`.
    
    
  7. 将 GPU 工作负荷配置文件添加到环境:

    az containerapp env workload-profile add \
      --name $ENVIRONMENT_NAME \
      --resource-group $RESOURCE_GROUP \
      --workload-profile-name $WORKLOAD_PROFILE_NAME \
      --workload-profile-type $WORKLOAD_PROFILE_TYPE
    

    此命令将 NVIDIA T4 GPU 工作负荷配置文件添加到环境中。 该配置文件为需要的容器启用 GPU 计算能力。

  8. 使用 GPU 支持创建容器应用:

    az containerapp create \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --environment $ENVIRONMENT_NAME \
      --image $CONTAINER_IMAGE \
      --target-port 80 \
      --ingress external \
      --cpu 8.0 \
      --memory 56.0Gi \
      --workload-profile-name $WORKLOAD_PROFILE_NAME \
      --query properties.configuration.ingress.fqdn \
      --output tsv
    

    此命令将创建容器应用并将其分配给 GPU 工作负荷配置文件。 --cpu--memory值符合T4配置文件要求。 该命令输出应用程序 URL。

  9. 复制输出 URL,以便在下一部分中进行测试。

测试映像生成 API

注释

第一个请求需要一到两分钟,而模型下载(大约 5 GB)并加载到 GPU 内存中。 后续请求在 5-15 秒内完成。

验证应用程序是否正在运行

在浏览器中打开应用程序 URL。 应会看到映像生成接口。

使用 UI 生成图像

  1. 在文本字段中,输入提示,例如:

    A friendly robot chef cooking pasta in a cozy kitchen, digital art style
    
  2. 选择“ 生成映像”。

  3. 等待图像显示。 由于模型加载,第一代需要更长的时间。

使用 API 生成映像(Functions 部署)

如果部署了Azure Functions版本,请直接调用 API:

curl -X POST "https://<YOUR-FUNCTION-URL>/api/generate" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A friendly robot chef cooking pasta in a cozy kitchen",
    "num_steps": 25
  }'

<YOUR-FUNCTION-URL> 替换为实际的函数应用 URL。 参数 num_steps 控制图像质量(较高的值会产生更好的结果,但需要更长的时间)。

预期的响应格式:

{
  "success": true,
  "image": "iVBORw0KGgoAAAANSUhEUgAA...(base64 PNG data)..."
}

响应包含可解码和保存的 base64 编码 PNG 图像。

监视 GPU 使用情况

监视有助于了解 GPU 利用率并优化成本。

在控制台中查看 GPU 状态

  1. 在 Azure 门户中转到你的容器应用。

  2. 在“ 监视”下,选择 “控制台”。

  3. 选择副本和容器。

  4. 选择 “重新连接”,然后选择 “/bin/bash ”作为启动命令。

  5. 运行以下命令以查看 GPU 状态:

    nvidia-smi
    

    输出显示 GPU 内存使用率、利用率百分比和正在运行的进程。

在 Azure Monitor 中查看指标

  1. 在 Azure 门户中转到你的容器应用。

  2. 在“监视”下,选择“指标”。

  3. 添加以下项的指标:

    • CPU 使用率
    • 内存使用率
    • 副本计数

有关详细的可观测性选项,请参阅 “监视 Azure 容器应用”。

优化冷启动性能

若要减少生产工作负荷的冷启动时间,请执行以下操作:

  1. 启用项目流式处理以加快容器映像拉取速度。

  2. 将最小副本设置为 1,以使实例保持预热状态:

    az containerapp update \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --min-replicas 1
    

    此命令使一个实例始终运行,消除冷启动延迟,但会产生持续成本。

有关更多优化技术,请参阅 改进无服务器 GPU 的冷启动

故障排除

問题 原因 解决方案
“超出 GPU 配额”错误 未批准 GPU 配额。 请求 GPU 配额 并等待审批。
容器无法启动 镜像拉取超时。 启用项目流式处理或使用较小的基础映像。
第一个请求超时 正在下载模型。 等待 2-3 分钟,然后重试。 预计会出现此延迟。
“CUDA 内存不足”错误 模型超过 GPU 内存。 减小批大小或使用较小的模型变体。
502 错误的网关 容器未就绪。 检查容器日志;确保已配置健康探针。
图像生成速度缓慢 推理步骤不足。 增加 num_steps 参数(较高的值 = 质量更好,速度较慢)。

若要查看用于调试的容器日志,请执行以下作:

az containerapp logs show \
  --name $CONTAINER_APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --follow

此命令从容器流式传输实时日志,帮助识别启动问题或运行时错误。

清理资源

使用完这些资源后,请将其删除,以避免持续收费。

  1. 在 Azure 门户中,搜索“资源组”。

  2. 选择创建的资源组(例如 rg-gpu-image-gen)。

  3. 选择“删除资源组”。

  4. 若要确认删除,请输入资源组名称。

  5. 选择 删除

如果使用Azure开发人员 CLI 进行部署:

azd down

如果使用 Azure CLI 进行部署:

az group delete --name $RESOURCE_GROUP --yes --no-wait

在后台继续进行删除时,会立即返回 --no-wait 标记。

后续步骤

有关 GPU 优化的详细信息,请参阅: