Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 --versionper verificare la versione. - Estensione CLI di
k8s-extensionAzure. Eseguiaz extension add --name k8s-extensionper installarlo. -
Helm versione 3.x o successiva. Esegui
helm versionper 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.