Configurare la profilazione della GPU in Servizio Azure Kubernetes (AKS) (Anteprima)

I carichi di lavoro basati su GPU, ad esempio i servizi di inferenza di intelligenza artificiale, possono essere a elevato utilizzo di memoria e difficili da ottimizzare senza visibilità sull'attività GPU. Potresti visualizzare errori di memoria esaurita (OOM), picchi imprevisti di latenza o una crescente pressione sulla memoria della GPU, ma le metriche Kubernetes tradizionali non mostrano in quale punto il codice alloca memoria. La profilatura GPU consente di identificare le funzioni responsabili dell'uso della memoria GPU.

Questo articolo illustra come distribuire un agente di osservabilità GPU basato su eBPF, archiviare i profili in Pyroscope e visualizzare le allocazioni di memoria GPU in Grafana.

Importante

Le funzionalità di anteprima di AKS sono disponibili su base self-service, su scelta. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime del servizio Azure Kubernetes sono parzialmente coperte dal supporto clienti con la massima diligenza possibile. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione. Per altre informazioni, vedere gli articoli di supporto seguenti:

Importante

Il software open source è citato nella documentazione e negli esempi di AKS. Il software che distribuisci è escluso dagli accordi sul livello di servizio di AKS, dalla garanzia limitata e dal supporto Azure. Quando si utilizza una tecnologia open source insieme ad AKS, consulta le opzioni di supporto offerte dalle rispettive community e dai responsabili dei progetti per definire un piano.

Microsoft si assume la responsabilità di creare i pacchetti open source che distribuiamo su AKS. Tale responsabilità include la completa gestione dei processi di build, scan, firma, validazione e hotfix, oltre al controllo dei file binari nelle immagini dei contenitori. Per altre informazioni, vedere Gestione delle vulnerabilità per il servizio Azure Kubernetes (AKS) e Copertura del supporto del servizio Azure Kubernetes (AKS).

Prerequisiti

  • Un cluster AKS con almeno un pool di nodi abilitato per GPU.
  • interfaccia della riga di comando di Azure versione 2.72.0 o successiva. Esegui az --version per verificare la versione.
  • Estensione CLI di k8s-extension Azure. Esegui az extension add --name k8s-extension per installarlo.
  • Helm versione 3.x o successiva. Esegui helm version per verificare la versione.
  • Monitoraggio di Azure, a meno che non si usi la propria configurazione di monitoraggio.
  • Grafana con gestione Azure, a meno che non si usi una propria istanza di Grafana.

Passaggio 1: Abilitare la profilatura GPU tramite l'estensione Gadget inspektor

Inspektor Gadget è un framework di osservabilità basato su eBPF open source per Kubernetes. Per la profilatura GPU, analizza le chiamate di allocazione di memoria CUDA (Compute Unified Device Architecture) senza modifiche al codice, sidecar o riavvii dei pod.

Abilita la profilazione GPU nel tuo cluster AKS:

Note

Questo comando presuppone che Monitoraggio di Azure sia stato abilitato nel cluster AKS. Se si usa la configurazione di Prometheus personalizzata, rimuovere --configuration-settings azureMonitor.enabled=true. Per altre informazioni, vedere domande frequenti sulla profilatura 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

Verificare che i pod Inspektor Gadget siano in esecuzione:

kubectl get pods -n gadget -l k8s-app=gadget

Tip

La profilatura della memoria GPU acquisisce gli eventi di allocazione della memoria man mano che si verificano. Se il carico di lavoro alloca memoria GPU prima di abilitare la profilatura, il profiler non acquisisce tali eventi. Per i carichi di lavoro come vLLM che preallocano la memoria GPU durante l'avvio, abilitare la profilatura prima di distribuire il carico di lavoro o riavviare il carico di lavoro per acquisire i percorsi di allocazione della memoria iniziale.

Passaggio 2: Abilitare la visualizzazione del profilo con Pyroscope

Note

Se nel cluster è presente uno stack Grafana e Pyroscope, ignorare questo passaggio.

Pyroscope è un progetto open source che visualizza e archivia i profili di prestazioni per l'ottimizzazione della memoria e la risoluzione dei problemi.

Distribuisci una singola istanza di Pyroscope nel tuo 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

Verificare che il pod Pyroscope sia in esecuzione:

kubectl get pods -n gadget pyroscope-0

Note

Per una distribuzione a disponibilità elevata, vedere la documentazione sui microservizi Pyroscope.

Note

Questo comando archivia i profili nel file system locale, quindi i dati di profilatura vengono persi se il pod viene ricreato. Per rendere persistenti i profili tra i riavvii dei pod, vedere domande frequenti sulla profilatura GPU.

Passaggio 3: Connettere Pyroscope a Grafana con gestione Azure

Note

Se si usa la propria istanza di Grafana, vedere le domande frequenti sulla profilatura gpu.

Tip

Per visualizzare i profili del carico di lavoro direttamente nell'interfaccia utente di Pyroscope, eseguire kubectl port-forward -n gadget pyroscope-0 4040:4040.

Collegare Pyroscope a Grafana con gestione Azure tramite collegamento privato di Azure.

Impostare le variabili di ambiente del cluster e di 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)

Tip

Se non si dispone di un'istanza di Grafana con gestione Azure, eseguire az grafana create --name "$GRAFANA_NAME" --resource-group "$RESOURCE_GROUP" --location "$LOCATION" --output none.

Impostare le variabili di ambiente dell'endpoint privato:

export PYROSCOPE_PLS="pyroscope-pls"
export PYROSCOPE_MPE="pyroscope-mpe"
export PYROSCOPE_PORT="4040"

Creare il collegamento privato:

Note

La creazione del collegamento privato può richiedere alcuni minuti.

# 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."

Creare l'origine dati Pyroscope in Grafana con gestione Azure:

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."

Verificare che l'origine dati abbia un URL valido:

az grafana data-source show \
  --name "$GRAFANA_NAME" \
  --data-source local-pyroscope

Passaggio 4: Connettere Grafana a Monitoraggio di Azure servizio gestito per Prometheus

Note

Questi passaggi si basano su Connettere il servizio gestito di Monitoraggio di Azure per Prometheus a Grafana. Assicurarsi che l'identità gestita di Grafana abbia il ruolo Lettore dati di monitoraggio nell'area di lavoro Monitoraggio di Azure, soprattutto se l'area di lavoro si trova in un gruppo di risorse o una sottoscrizione diversa.

Impostare le variabili di ambiente dell'area di lavoro Monitoraggio di Azure:

export AMP_NAME="<your-azure-monitor-workspace-name>"
export AMP_RESOURCE_GROUP="<your-azure-monitor-workspace-resource-group>"

Tip

Esegui az resource list --resource-type Microsoft.Monitor/accounts --resource-group "$AMP_RESOURCE_GROUP" --output table per elencare le aree di lavoro di Monitoraggio di Azure nel gruppo di risorse. Per eseguire una ricerca nella sottoscrizione, omettere --resource-group.

Creare l'origine dati 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\" }
    }
  }"

Verificare l'origine dati:

az grafana data-source show \
  --name "$GRAFANA_NAME" \
  --data-source "$AMP_NAME"

Passaggio 5: Configurare le dashboard in Grafana

Importare il dashboard di osservabilità della 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)"

Ottenere l'URL del dashboard:

GRAFANA_URL=$(az grafana show \
  --name "$GRAFANA_NAME" \
  --resource-group "$RESOURCE_GROUP" \
  --query properties.endpoint \
  --output tsv)

echo "${GRAFANA_URL}/d/AdvancedGPUObservability"

Per interpretare i dati di profilatura, consulta Analizzare i grafici a fiamma della profilatura della GPU.

Pulire le risorse

Rimuovere lo stack di osservabilità GPU interno al 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

Lettura dei grafici di fiamma

Per interpretare i risultati della profilatura e identificare gli hotspot di memoria GPU, vedere Analizzare i grafici di fiamma della profilatura GPU.

Domande frequenti

Per le integrazioni personalizzate di Prometheus e Grafana e lo storage persistente di Pyroscope, consulta le FAQ sulla profilazione GPU.

Passaggi successivi