mcpField
C
container-apps-gpu-2025

container-apps-gpu-2025

github.com/josiahsiegel云与 DevOps59158 次安装19 周前更新
代码仓库

关于 container-apps-gpu-2025

面向 Azure Container Apps GPU 部署与运维的参考技能,涵盖无服务器及专用 GPU、Dapr、模型托管、扩缩容、监控和安全,适用于构建 AI/ML 服务的团队。

主要功能

  1. 01无服务器及专用 GPU 部署
  2. 02GPU 扩缩容与缩至零实例
  3. 03Dapr 服务与状态集成
  4. 04AI 模型托管模式
  5. 05监控与安全指南

适用场景

  1. 01部署 GPU 推理模型
  2. 02运行 GPU 批处理或训练任务
  3. 03使用 Dapr 连接容器微服务

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill container-apps-gpu-2025

安装后在 Claude Code 中输入/container-apps-gpu-2025确认已加载。

详细介绍

Azure Container Apps GPU 支持 — 2025 年功能

关于支持 GPU、无服务器功能和 Dapr 集成的 Azure Container Apps 完整知识库(2025 年正式发布的功能)。

概述

Azure Container Apps 是一个无服务器容器平台,原生支持 GPU、集成 Dapr,并支持缩容至零,适用于成本高效的 AI/ML 工作负载。

2025 年主要功能(Build 公告)

1. 无服务器 GPU(正式发布)
  • 自动缩放:根据需求缩放 GPU 工作负载
  • 缩容至零:仅在实际使用 GPU 时付费
  • 按秒计费:实现精细的成本控制
  • 优化冷启动:快速初始化 AI 模型
  • 降低运维开销:无需管理基础设施
2. 专用 GPU(正式发布)
  • 性能稳定:专用 GPU 资源
  • 简化 AI 部署:轻松托管模型
  • 长时间运行的工作负载:适用于训练和持续推理
  • 多种 GPU 类型:NVIDIA A100、T4 等
3. 支持 GPU 的动态会话(早期访问)
  • 沙盒化执行:运行不可信的 AI 生成代码
  • Hyper-V 隔离:增强安全性
  • GPU 驱动的 Python 解释器:处理计算密集型 AI 工作负载
  • 运行时缩放:动态分配资源
4. Foundry Models 集成
  • 直接部署 AI 模型:在创建容器应用时部署
  • 开箱即用的模型:预配置的推理终结点
  • Azure AI Foundry:无缝集成
5. 使用 Durable Task Scheduler 的工作流(预览版)
  • 长时间运行的工作流:可靠的编排
  • 状态管理:自动持久化
  • 事件驱动:根据事件触发工作流
6. 原生支持 Azure Functions
  • Functions 运行时:在 Container Apps 中运行 Azure Functions
  • 一致的开发体验:相同代码,无服务器执行
  • 事件触发器:支持所有 Functions 触发器
7. Dapr 集成(正式发布)
  • 服务发现:内置基于 DNS 的发现
  • 状态管理:分布式状态存储
  • 发布/订阅消息传递:可靠的消息传递模式
  • 服务调用:可靠的服务间调用
  • 可观测性:集成跟踪和指标

创建带 GPU 的 Container Apps

使用无服务器 GPU 的基本容器应用
# Create Container Apps environment
az containerapp env create \
  --name myenv \
  --resource-group MyRG \
  --location eastus \
  --logs-workspace-id <workspace-id> \
  --logs-workspace-key <workspace-key>

# Create Container App with GPU
az containerapp create \
  --name myapp-gpu \
  --resource-group MyRG \
  --environment myenv \
  --image myregistry.azurecr.io/ai-model:latest \
  --cpu 4 \
  --memory 8Gi \
  --gpu-type nvidia-a100 \
  --gpu-count 1 \
  --min-replicas 0 \
  --max-replicas 10 \
  --ingress external \
  --target-port 8080
适用于生产环境的 GPU 容器应用
az containerapp create \
  --name myapp-gpu-prod \
  --resource-group MyRG \
  --environment myenv \
  \
  # Container configuration
  --image myregistry.azurecr.io/ai-model:latest \
  --registry-server myregistry.azurecr.io \
  --registry-identity system \
  \
  # Resources
  --cpu 4 \
  --memory 8Gi \
  --gpu-type nvidia-a100 \
  --gpu-count 1 \
  \
  # Scaling
  --min-replicas 0 \
  --max-replicas 20 \
  --scale-rule-name http-scaling \
  --scale-rule-type http \
  --scale-rule-http-concurrency 10 \
  \
  # Networking
  --ingress external \
  --target-port 8080 \
  --transport http2 \
  --exposed-port 8080 \
  \
  # Security
  --registry-identity system \
  --env-vars "AZURE_CLIENT_ID=secretref:client-id" \
  \
  # Monitoring
  --dapr-app-id myapp \
  --dapr-app-port 8080 \
  --dapr-app-protocol http \
  --enable-dapr \
  \
  # Identity
  --system-assigned

Container Apps 环境配置

启用可用区冗余的环境
az containerapp env create \
  --name myenv-prod \
  --resource-group MyRG \
  --location eastus \
  --logs-workspace-id <workspace-id> \
  --logs-workspace-key <workspace-key> \
  --zone-redundant true \
  --enable-workload-profiles true
工作负载配置文件(专用 GPU)
# Create environment with workload profiles
az containerapp env create \
  --name myenv-gpu \
  --resource-group MyRG \
  --location eastus \
  --enable-workload-profiles true

# Add GPU workload profile
az containerapp env workload-profile add \
  --name myenv-gpu \
  --resource-group MyRG \
  --workload-profile-name gpu-profile \
  --workload-profile-type GPU-A100 \
  --min-nodes 0 \
  --max-nodes 10

# Create container app with GPU profile
az containerapp create \
  --name myapp-dedicated-gpu \
  --resource-group MyRG \
  --environment myenv-gpu \
  --workload-profile-name gpu-profile \
  --image myregistry.azurecr.io/training-job:latest \
  --cpu 8 \
  --memory 16Gi \
  --min-replicas 1 \
  --max-replicas 5

GPU 缩放规则

自定义 Prometheus 缩放
az containerapp create \
  --name myapp-gpu-prometheus \
  --resource-group MyRG \
  --environment myenv \
  --image myregistry.azurecr.io/ai-model:latest \
  --cpu 4 \
  --memory 8Gi \
  --gpu-type nvidia-a100 \
  --gpu-count 1 \
  --min-replicas 0 \
  --max-replicas 10 \
  --scale-rule-name gpu-utilization \
  --scale-rule-type custom \
  --scale-rule-custom-type prometheus \
  --scale-rule-metadata \
    serverAddress=http://prometheus.monitoring.svc.cluster.local:9090 \
    metricName=gpu_utilization \
    threshold=80 \
    query="avg(nvidia_gpu_utilization{app='myapp'})"
基于队列的缩放(Azure Service Bus)
az containerapp create \
  --name myapp-queue-processor \
  --resource-group MyRG \
  --environment myenv \
  --image myregistry.azurecr.io/batch-processor:latest \
  --cpu 4 \
  --memory 8Gi \
  --gpu-type nvidia-t4 \
  --gpu-count 1 \
  --min-replicas 0 \
  --max-replicas 50 \
  --scale-rule-name queue-scaling \
  --scale-rule-type azure-servicebus \
  --scale-rule-metadata \
    queueName=ai-jobs \
    namespace=myservicebus \
    messageCount=5 \
  --scale-rule-auth connection=servicebus-connection

Dapr 集成

在容器应用上启用 Dapr
az containerapp create \
  --name myapp-dapr \
  --resource-group MyRG \
  --environment myenv \
  --image myregistry.azurecr.io/myapp:latest \
  --enable-dapr \
  --dapr-app-id myapp \
  --dapr-app-port 8080 \
  --dapr-app-protocol http \
  --dapr-http-max-request-size 4 \
  --dapr-http-read-buffer-size 4 \
  --dapr-log-level info \
  --dapr-enable-api-logging true
Dapr 状态存储(Azure Cosmos DB)
# Create Dapr component for state store
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
spec:
  type: state.azure.cosmosdb
  version: v1
  metadata:
    - name: url
      value: "https://mycosmosdb.documents.azure.com:443/"
    - name: masterKey
      secretRef: cosmosdb-key
    - name: database
      value: "mydb"
    - name: collection
      value: "state"
# Create the component
az containerapp env dapr-component set \
  --name myenv \
  --resource-group MyRG \
  --dapr-component-name statestore \
  --yaml component.yaml
Dapr 发布/订阅(Azure Service Bus)
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
spec:
  type: pubsub.azure.servicebus.topics
  version: v1
  metadata:
    - name: connectionString
      secretRef: servicebus-connection
    - name: consumerID
      value: "myapp"
服务间调用
# Python example using Dapr SDK
from dapr.clients import DaprClient

with DaprClient() as client:
    # Invoke another service
    response = client.invoke_method(
        app_id='other-service',
        method_name='process',
        data='{"input": "data"}'
    )

    # Save state
    client.save_state(
        store_name='statestore',
        key='mykey',
        value='myvalue'
    )

    # Publish message
    client.publish_event(
        pubsub_name='pubsub',
        topic_name='orders',
        data='{"orderId": "123"}'
    )

AI 模型部署模式

兼容 OpenAI 的终结点
# Dockerfile for vLLM model serving
FROM vllm/vllm-openai:latest

ENV MODEL_NAME="meta-llama/Llama-3.1-8B-Instruct"
ENV GPU_MEMORY_UTILIZATION=0.9
ENV MAX_MODEL_LEN=4096

CMD ["--model", "${MODEL_NAME}", \
     "--gpu-memory-utilization", "${GPU_MEMORY_UTILIZATION}", \
     "--max-model-len", "${MAX_MODEL_LEN}", \
     "--port", "8080"]
# Deploy vLLM model
az containerapp create \
  --name llama-inference \
  --resource-group MyRG \
  --environment myenv \
  --image vllm/vllm-openai:latest \
  --cpu 8 \
  --memory 32Gi \
  --gpu-type nvidia-a100 \
  --gpu-count 1 \
  --min-replicas 1 \
  --max-replicas 5 \
  --target-port 8080 \
  --ingress external \
  --env-vars \
    MODEL_NAME="meta-llama/Llama-3.1-8B-Instruct" \
    GPU_MEMORY_UTILIZATION="0.9" \
    HF_TOKEN=secretref:huggingface-token
Stable Diffusion 图像生成
az containerapp create \
  --name stable-diffusion \
  --resource-group MyRG \
  --environment myenv \
  --image myregistry.azurecr.io/stable-diffusion:latest \
  --cpu 4 \
  --memory 16Gi \
  --gpu-type nvidia-a100 \
  --gpu-count 1 \
  --min-replicas 0 \
  --max-replicas 10 \
  --target-port 7860 \
  --ingress external \
  --scale-rule-name http-scaling \
  --scale-rule-type http \
  --scale-rule-http-concurrency 1
批处理作业
az containerapp job create \
  --name batch-training-job \
  --resource-group MyRG \
  --environment myenv \
  --trigger-type Manual \
  --image myregistry.azurecr.io/training:latest \
  --cpu 8 \
  --memory 32Gi \
  --gpu-type nvidia-a100 \
  --gpu-count 2 \
  --parallelism 1 \
  --replica-timeout 7200 \
  --replica-retry-limit 3 \
  --env-vars \
    DATASET_URL="https://mystorage.blob.core.windows.net/datasets/train.csv" \
    MODEL_OUTPUT="https://mystorage.blob.core.windows.net/models/" \
    EPOCHS="100"

# Execute job
az containerapp job start \
  --name batch-training-job \
  --resource-group MyRG

监控和可观测性

Application Insights 集成
az containerapp create \
  --name myapp-monitored \
  --resource-group MyRG \
  --environment myenv \
  --image myregistry.azurecr.io/myapp:latest \
  --env-vars \
    APPLICATIONINSIGHTS_CONNECTION_STRING=secretref:appinsights-connection
查询日志
# Stream logs
az containerapp logs show \
  --name myapp-gpu \
  --resource-group MyRG \
  --follow

# Query with Log Analytics
az monitor log-analytics query \
  --workspace <workspace-id> \
  --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'myapp-gpu' | take 100"
指标和警报
# Create metric alert for GPU usage
az monitor metrics alert create \
  --name high-gpu-usage \
  --resource-group MyRG \
  --scopes $(az containerapp show -g MyRG -n myapp-gpu --query id -o tsv) \
  --condition "avg Requests > 100" \
  --window-size 5m \
  --evaluation-frequency 1m \
  --action <action-group-id>

安全最佳实践

托管标识
# Create with system-assigned identity
az containerapp create \
  --name myapp-identity \
  --resource-group MyRG \
  --environment myenv \
  --system-assigned \
  --image myregistry.azurecr.io/myapp:latest

# Get identity principal ID
IDENTITY_ID=$(az containerapp show -g MyRG -n myapp-identity --query identity.principalId -o tsv)

# Assign role to access Key Vault
az role assignment create \
  --assignee $IDENTITY_ID \
  --role "Key Vault Secrets User" \
  --scope /subscriptions/<sub-id>/resourceGroups/MyRG/providers/Microsoft.KeyVault/vaults/mykeyvault

# Use user-assigned identity
az identity create --name myapp-identity --resource-group MyRG
IDENTITY_RESOURCE_ID=$(az identity show -g MyRG -n myapp-identity --query id -o tsv)

az containerapp create \
  --name myapp-user-identity \
  --resource-group MyRG \
  --environment myenv \
  --user-assigned $IDENTITY_RESOURCE_ID \
  --image myregistry.azurecr.io/myapp:latest
密钥管理
# Add secrets
az containerapp secret set \
  --name myapp-gpu \
  --resource-group MyRG \
  --secrets \
    huggingface-token="<token>" \
    api-key="<key>"

# Reference secrets in environment variables
az containerapp update \
  --name myapp-gpu \
  --resource-group MyRG \
  --set-env-vars \
    HF_TOKEN=secretref:huggingface-token \
    API_KEY=secretref:api-key

成本优化

缩容至零配置
az containerapp create \
  --name myapp-scale-zero \
  --resource-group MyRG \
  --environment myenv \
  --image myregistry.azurecr.io/myapp:latest \
  --min-replicas 0 \
  --max-replicas 10 \
  --scale-rule-name http-scaling \
  --scale-rule-type http \
  --scale-rule-http-concurrency 10

节省成本:仅在处理请求时付费。GPU 处于活动状态时按秒计费。

调整资源规模
# Start with minimal resources
--cpu 2 --memory 4Gi --gpu-count 1

# Monitor and adjust based on actual usage
az monitor metrics list \
  --resource $(az containerapp show -g MyRG -n myapp-gpu --query id -o tsv) \
  --metric "CpuPercentage,MemoryPercentage"
使用 Spot/可抢占 GPU(未来功能)

此功能推出后,可为非关键工作负载配置 Spot 实例,将 GPU 成本降低最多 80%。

故障排除

检查修订版本状态
az containerapp revision list \
  --name myapp-gpu \
  --resource-group MyRG \
  --output table
查看修订版本详细信息
az containerapp revision show \
  --name <revision-name> \
  --app myapp-gpu \
  --resource-group MyRG
重启容器应用
az containerapp update \
  --name myapp-gpu \
  --resource-group MyRG \
  --force-restart
GPU 不可用

如果 GPU 未能预配:

  1. 检查区域可用性:并非所有区域都支持 GPU
  2. 验证配额:如有需要,请申请提高配额
  3. 检查工作负载配置文件:确保已创建 GPU 工作负载配置文件

最佳实践

✓ 对间歇性工作负载使用缩容至零 ✓ 实现健康探测(存活和就绪) ✓ 使用托管标识进行身份验证 ✓ 在 Azure Key Vault 中存储机密 ✓ 为微服务模式启用 Dapr ✓ 配置适当的扩缩规则 ✓ 监控 GPU 利用率并调整资源 ✓ 使用 Container Apps 作业进行批处理 ✓ 为瞬时故障实现重试逻辑 ✓ 使用 Application Insights 实现可观测性

参考资料

支持 GPU 的 Azure Container Apps 为 AI/ML 工作负载提供了终极无服务器平台!

评论

支持 Markdown