Configurar a criação de perfis de GPU no Azure Kubernetes Service (AKS) (Pré-visualização)

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 --version para verificar sua versão.
  • A k8s-extension extensão CLI do Azure. Executa az extension add --name k8s-extension para o instalar.
  • Helm versão 3.x ou posterior. Execute helm version para 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.

Passos seguintes