Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Cargas de trabalho baseadas em GPU, como os serviços de inferência de IA, podem ser intensivas em memória e difíceis de otimizar sem visibilidade da atividade da GPU. Podes ver erros de falta de memória (OOM), picos inesperados de latência ou aumento da pressão da memória da GPU, mas as métricas tradicionais do Kubernetes não mostram onde o código aloca a memória. A análise de GPU ajuda-te a identificar as funções responsáveis pelo uso da memória da GPU.
Este artigo mostra-lhe como implementar um agente de observabilidade GPU baseado em eBPF, armazenar perfis no Pyroscope e visualizar as alocações de memória da GPU no Grafana.
Importante
Os recursos de pré-visualização do AKS estão disponíveis numa base de autosserviço e adesão voluntária. As visualizações prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As versões de teste do AKS são parcialmente cobertas pelo suporte ao cliente numa base de melhor esforço. Assim sendo, estas funcionalidades não se destinam ao uso em produção. Para obter mais informações, consulte os seguintes artigos de suporte:
Importante
O software de código aberto é mencionado em toda a documentação e amostras do AKS. O software que você implanta é excluído dos contratos de nível de serviço do AKS, da garantia limitada e do suporte do Azure. Ao usar a tecnologia de código aberto ao lado do AKS, consulte as opções de suporte disponíveis nas respetivas comunidades e mantenedores do projeto para desenvolver um plano.
A Microsoft assume a responsabilidade pela criação dos pacotes de código aberto que implantamos no AKS. Essa responsabilidade inclui ter a propriedade completa do processo de compilação, digitalização, assinatura, validação e correção rápida, juntamente com o controlo dos binários nas imagens de contentor. Para obter mais informações, consulte Gestão de vulnerabilidades para AKS e Cobertura de suporte AKS.
Pré-requisitos
- Um cluster do AKS com pelo menos um conjunto de nós com GPU ativada.
-
CLI do Azure versão 2.72.0 ou posterior. Execute
az --versionpara verificar sua versão. - A
k8s-extensionextensão CLI do Azure. Executaaz extension add --name k8s-extensionpara o instalar. -
Helm versão 3.x ou posterior. Execute
helm versionpara verificar sua versão. - Azure Monitor, a menos que uses o teu próprio sistema de monitorização.
- Azure Managed Grafana, a menos que uses a tua própria instância de Grafana.
Passo 1: Ativar o perfil da GPU através da extensão Inspektor Gadget
O Inspektor Gadget é um framework de observabilidade baseado em eBPF de código aberto para Kubernetes. Para a criação de perfis de GPU, monitoriza chamadas de alocação de memória da Compute Unified Device Architecture (CUDA) sem alterações de código, sidecars ou reinícios do pod.
Ative o perfil da GPU no seu cluster AKS:
Note
Este comando assume que ativaste o Azure Monitor no teu cluster AKS. Se usares a tua própria configuração do Prometheus, remove o --configuration-settings azureMonitor.enabled=true. Para mais informações, consulte o FAQ sobre perfil de GPU.
az k8s-extension create \
--extension-type microsoft.inspektorgadget \
--subscription <your-subscription-id> \
--resource-group <your-resource-group> \
--cluster-name <your-cluster-name> \
--cluster-type managedClusters \
--release-train preview \
--name inspektor-gadget \
--configuration-settings gpuObservability.enabled=true \
--configuration-settings azureMonitor.enabled=true
Verifique se os pods do Inspektor Gadget estão a funcionar:
kubectl get pods -n gadget -l k8s-app=gadget
Sugestão
O perfil de memória da GPU capta os eventos de alocação de memória à medida que ocorrem. Se a sua carga de trabalho aloca memória GPU antes de ativar o perfil, o profiler não capta esses eventos. Para cargas de trabalho como vLLM que pré-alocam a memória da GPU durante o arranque, ative o perfil antes de implementar a carga de trabalho ou reinicie a carga para capturar os caminhos iniciais de alocação de memória.
Passo 2: Ativar a visualização do perfil com o Pyroscope
Note
Se já tiveres uma pilha de Grafana e Pyroscope no teu cluster, ignora este passo.
O Pyroscope é um projeto open-source que visualiza e armazena perfis de desempenho para otimização da memória e resolução de problemas.
Implante uma única instância de Pyroscope no seu cluster:
helm install pyroscope -n gadget \
oci://ghcr.io/grafana/helm-charts/pyroscope \
--version 1.15.0 \
--set pyroscope.image.repository=grafana/pyroscope \
--set-string pyroscope.image.tag=1.15.0 \
--set pyroscope.replicaCount=1 \
--set pyroscope.structuredConfig.self_profiling.disable_push=true \
--set pyroscope.structuredConfig.storage.backend=filesystem \
--set pyroscope.service.type=LoadBalancer \
--set pyroscope.service.port=4040 \
--set-string pyroscope.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"=true \
--set-string pyroscope.service.annotations."service\.beta\.kubernetes\.io/azure-pls-create"=true \
--set-string pyroscope.service.annotations."service\.beta\.kubernetes\.io/azure-pls-name"=pyroscope-pls \
--set-string pyroscope.service.annotations."service\.beta\.kubernetes\.io/azure-pls-proxy-protocol"=false \
--set-string pyroscope.service.annotations."service\.beta\.kubernetes\.io/azure-pls-visibility"='*' \
--set alloy.enabled=false \
--set minio.enabled=false
Verifique se o pod Pyroscope está a funcionar:
kubectl get pods -n gadget pyroscope-0
Note
Para uma implantação de alta disponibilidade, consulte a documentação dos microserviços Pyroscope.
Note
Este comando armazena perfis no sistema de ficheiros local, pelo que os dados de perfil são perdidos se o pod for recriado. Para persistir perfis entre reinicios de pod, consulte o FAQ sobre perfilação de GPU.
Passo 3: Ligue o Pyroscope ao Azure Managed Grafana
Note
Se usares a tua própria instância do Grafana, vê as perguntas frequentes sobre perfil de GPU.
Sugestão
Para visualizar os perfis de carga de trabalho diretamente na interface do Pyroscope, execute kubectl port-forward -n gadget pyroscope-0 4040:4040.
Ligue o Pyroscope ao Azure Managed Grafana através do Azure Private Link.
Defina as variáveis do cluster e do ambiente Grafana:
export RESOURCE_GROUP="<your-resource-group>"
export AKS_CLUSTER="<your-aks-cluster-name>"
export LOCATION="<your-aks-cluster-location>"
export GRAFANA_NAME="<your-azure-managed-grafana-name>"
export AKS_NODE_RG=$(az aks show \
--resource-group "$RESOURCE_GROUP" \
--name "$AKS_CLUSTER" \
--query 'nodeResourceGroup' \
--output tsv)
Sugestão
Se não tiver uma instância Azure Managed Grafana, execute az grafana create --name "$GRAFANA_NAME" --resource-group "$RESOURCE_GROUP" --location "$LOCATION" --output none.
Defina as variáveis de ambiente do endpoint privado:
export PYROSCOPE_PLS="pyroscope-pls"
export PYROSCOPE_MPE="pyroscope-mpe"
export PYROSCOPE_PORT="4040"
Crie o link privado:
Note
Criar o link privado pode demorar alguns minutos.
# Check the Azure Managed Grafana extension version.
ver=$(az extension show --name amg --query version --output tsv)
[[ "${ver%%.*}" -ge 3 ]] && MPE="managed-private-endpoint" || MPE="mpe"
# Wait until the Pyroscope private link service is available.
until az network private-link-service show \
--name "$PYROSCOPE_PLS" \
--resource-group "$AKS_NODE_RG" \
--output none 2>/dev/null; do
sleep 10
done
PYRO_PLS_ID=$(az network private-link-service show \
--name "$PYROSCOPE_PLS" \
--resource-group "$AKS_NODE_RG" \
--query 'id' \
--output tsv)
az grafana $MPE create \
--workspace-name "$GRAFANA_NAME" \
--resource-group "$RESOURCE_GROUP" \
--name "$PYROSCOPE_MPE" \
--private-link-resource-id "$PYRO_PLS_ID" \
--location "$LOCATION" \
--output none
sleep 30
PYRO_CONN=$(az network private-link-service show \
--name "$PYROSCOPE_PLS" \
--resource-group "$AKS_NODE_RG" \
--query "privateEndpointConnections[?privateLinkServiceConnectionState.status=='Pending' && starts_with(name, 'grafana-${GRAFANA_NAME}')].name | [0]" \
--output tsv)
az network private-link-service connection update \
--name "$PYRO_CONN" \
--service-name "$PYROSCOPE_PLS" \
--resource-group "$AKS_NODE_RG" \
--connection-status Approved \
--output none
az grafana $MPE refresh \
--workspace-name "$GRAFANA_NAME" \
--resource-group "$RESOURCE_GROUP" \
--output none
echo "Successfully created private link."
Crie a fonte de dados Pyroscope no Azure Managed Grafana:
ver=$(az extension show --name amg --query version --output tsv)
[[ "${ver%%.*}" -ge 3 ]] && MPE="managed-private-endpoint" || MPE="mpe"
PYRO_IP=$(az grafana $MPE show \
--workspace-name "$GRAFANA_NAME" \
--resource-group "$RESOURCE_GROUP" \
--name "$PYROSCOPE_MPE" \
--query 'privateLinkServicePrivateIP' \
--output tsv)
export PYROSCOPE_URL="http://${PYRO_IP}:${PYROSCOPE_PORT}"
az grafana data-source create \
--name "$GRAFANA_NAME" \
--resource-group "$RESOURCE_GROUP" \
--definition "{
\"name\": \"local-pyroscope\",
\"uid\": \"local-pyroscope\",
\"type\": \"grafana-pyroscope-datasource\",
\"access\": \"proxy\",
\"url\": \"${PYROSCOPE_URL}\",
\"jsonData\": { \"keepCookies\": [\"pyroscope_git_session\"] }
}" \
--output none
echo "Successfully created the local-pyroscope data source."
Verifique se a fonte de dados tem uma URL válida:
az grafana data-source show \
--name "$GRAFANA_NAME" \
--data-source local-pyroscope
Passo 4: Conectar o Grafana ao serviço gerido Azure Monitor para Prometheus
Note
Estes passos baseiam-se em Ligar o serviço gerido do Azure Monitor para Prometheus ao Grafana. Certifique-se de que a identidade gerida do Grafana tem a função Monitoring Data Reader no espaço de trabalho do Azure Monitor, especialmente se o espaço de trabalho estiver num grupo de recursos ou numa subscrição diferente.
Defina as variáveis do ambiente de trabalho do Azure Monitor:
export AMP_NAME="<your-azure-monitor-workspace-name>"
export AMP_RESOURCE_GROUP="<your-azure-monitor-workspace-resource-group>"
Sugestão
Execute az resource list --resource-type Microsoft.Monitor/accounts --resource-group "$AMP_RESOURCE_GROUP" --output table para listar os espaços de trabalho do Azure Monitor no grupo de recursos. Para pesquisar a subscrição, omita --resource-group.
Crie a fonte de dados Prometheus:
AMP_ENDPOINT=$(az resource show \
--resource-type Microsoft.Monitor/accounts \
--name "$AMP_NAME" \
--resource-group "$AMP_RESOURCE_GROUP" \
--query properties.metrics.prometheusQueryEndpoint \
--output tsv)
az grafana data-source create \
--name "$GRAFANA_NAME" \
--resource-group "$RESOURCE_GROUP" \
--definition "{
\"name\": \"$AMP_NAME\",
\"type\": \"prometheus\",
\"access\": \"proxy\",
\"url\": \"$AMP_ENDPOINT\",
\"jsonData\": {
\"httpMethod\": \"POST\",
\"azureCredentials\": { \"authType\": \"msi\" }
}
}"
Verifique a fonte dos dados:
az grafana data-source show \
--name "$GRAFANA_NAME" \
--data-source "$AMP_NAME"
Passo 5: Configurar dashboards em Grafana
Importar o painel de observabilidade da GPU:
az grafana dashboard create \
--name "$GRAFANA_NAME" \
--resource-group "$RESOURCE_GROUP" \
--definition "$(curl -sSL https://raw.githubusercontent.com/inspektor-gadget/grafana-dashboards/refs/heads/main/dashboards/gpu-observability/AdvancedGPUObservability.json)"
Obtenha o URL do painel:
GRAFANA_URL=$(az grafana show \
--name "$GRAFANA_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query properties.endpoint \
--output tsv)
echo "${GRAFANA_URL}/d/AdvancedGPUObservability"
Para interpretar os dados de perfilação, veja Analisar gráficos de chama de perfilagem de GPU.
Limpeza de recursos
Remover a pilha de observabilidade da GPU dentro do cluster:
helm uninstall pyroscope -n gadget
az k8s-extension delete \
--name inspektor-gadget \
--cluster-name <your-cluster-name> \
--resource-group <your-resource-group> \
--cluster-type managedClusters \
--yes
kubectl delete namespace gadget
Leitura de gráficos de chama
Para interpretar resultados de perfilação e identificar hotspots de memória da GPU, consulte Analisar gráficos de chama de perfilagem da GPU.
FAQ
Para integrações personalizadas com Prometheus e Grafana e armazenamento persistente do Pyroscope, consulte as perguntas frequentes sobre perfil de GPU.