关于 container-apps-gpu-2025
面向 Azure Container Apps GPU 部署与运维的参考技能,涵盖无服务器及专用 GPU、Dapr、模型托管、扩缩容、监控和安全,适用于构建 AI/ML 服务的团队。
主要功能
- 01无服务器及专用 GPU 部署
- 02GPU 扩缩容与缩至零实例
- 03Dapr 服务与状态集成
- 04AI 模型托管模式
- 05监控与安全指南
适用场景
- 01部署 GPU 推理模型
- 02运行 GPU 批处理或训练任务
- 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 未能预配:
- 检查区域可用性:并非所有区域都支持 GPU
- 验证配额:如有需要,请申请提高配额
- 检查工作负载配置文件:确保已创建 GPU 工作负载配置文件
最佳实践
✓ 对间歇性工作负载使用缩容至零 ✓ 实现健康探测(存活和就绪) ✓ 使用托管标识进行身份验证 ✓ 在 Azure Key Vault 中存储机密 ✓ 为微服务模式启用 Dapr ✓ 配置适当的扩缩规则 ✓ 监控 GPU 利用率并调整资源 ✓ 使用 Container Apps 作业进行批处理 ✓ 为瞬时故障实现重试逻辑 ✓ 使用 Application Insights 实现可观测性
参考资料
支持 GPU 的 Azure Container Apps 为 AI/ML 工作负载提供了终极无服务器平台!
评论
支持 Markdown