Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
GPU-baserade arbetsbelastningar, till exempel AI-slutsatsdragningstjänster, kan vara minnesintensiva och svåra att optimera utan insyn i GPU-aktivitet. Du kan se OOM-fel (out-of-memory), oväntade svarstidstoppar eller stigande GPU-minnestryck, men traditionella Kubernetes-mått visar inte var koden allokerar minne. GPU-profilering hjälper dig att identifiera de funktioner som ansvarar för GPU-minnesanvändning.
Den här artikeln visar hur du distribuerar en eBPF-baserad GPU-observerbarhetsagent, lagrar profiler i Pyroscope och visualiserar GPU-minnesallokeringar i Grafana.
Viktigt!
AKS-förhandsversionsfunktioner är tillgängliga via självbetjäning och frivillig registrering. Förhandsversioner tillhandahålls "i befintligt skick" och "i mån av tillgång," och de är undantagna från servicenivåavtal och begränsad garanti. AKS-förhandsversioner stöds delvis av kundsupport efter bästa förmåga. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:
Viktigt!
Programvara med öppen källkod nämns i hela AKS-dokumentationen och exemplen. Programvaran som du distribuerar är undantagen från AKS-servicenivåavtal, begränsad garanti och Azure-support. När du använder open-source-teknik tillsammans med AKS, konsultera de supportalternativ som finns tillgängliga från respektive gemenskaper och projektunderhållare för att utveckla en plan.
Microsoft tar ansvar för att skapa de paket med öppen källkod som vi distribuerar på AKS. Det ansvaret omfattar att ha fullständigt ägarskap för bygg-, genomsöknings-, signerings-, validerings- och snabbkorrigeringsprocessen, tillsammans med kontroll över binärfilerna i containeravbildningar. Mer information finns i Sårbarhetshantering för AKS - och AKS-stödtäckning.
Förutsättningar
- Ett AKS-kluster med minst en GPU-aktiverad nodpool.
-
Azure CLI version 2.72.0 eller senare. Kör
az --versionför att kontrollera din version. - Azure CLI-tillägget
k8s-extension. Köraz extension add --name k8s-extensionför att installera den. -
Helm version 3.x eller senare. Kör
helm versionför att kontrollera din version. - Azure Monitor, såvida du inte använder din egen övervakningskonfiguration.
- Azure Managed Grafana, såvida du inte använder din egen Grafana-instans.
Steg 1: Aktivera GPU-profilering via Tillägget Inspektor Gadget
Inspektor Gadget är ett eBPF-baserat observerbarhetsramverk med öppen källkod för Kubernetes. För GPU-profilering spårar den CUDA-minnesallokeringsanrop (Compute Unified Device Architecture) utan kodändringar, sidovagnar eller omstarter av poddar.
Aktivera GPU-profilering i ditt AKS-kluster:
Note
Det här kommandot förutsätter att du har aktiverat Azure Monitor i ditt AKS-kluster. Om du använder din egen Prometheus-konfiguration tar du bort --configuration-settings azureMonitor.enabled=true. Mer information finns i vanliga frågor och svar om GPU-profilering.
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
Kontrollera att Inspektor Gadget-poddarna körs:
kubectl get pods -n gadget -l k8s-app=gadget
Tip
GPU-minnesprofilering samlar in minnesallokeringshändelser när de inträffar. Om din arbetsbelastning allokerar GPU-minne innan du aktiverar profilering, fångar profileraren inte upp dessa händelser. För arbetsbelastningar som vLLM som förallokerar GPU-minne under start aktiverar du profilering innan du distribuerar arbetsbelastningen eller startar om arbetsbelastningen för att samla in de första sökvägarna för minnesallokering.
Steg 2: Aktivera profilvisualisering med Pyroscope
Note
Om du har en befintlig Grafana- och Pyroscope-stack i klustret hoppar du över det här steget.
Pyroscope är ett projekt med öppen källkod som visualiserar och lagrar prestandaprofiler för minnesoptimering och felsökning.
Distribuera en enda Pyroscope-instans till klustret:
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
Kontrollera att Pyroscope-podden körs:
kubectl get pods -n gadget pyroscope-0
Note
Information om en driftsättning med hög tillgänglighet finns i dokumentationen om Pyroscope-mikrotjänster.
Note
Det här kommandot lagrar profileringsdata på det lokala filsystemet, så profileringsdata går förlorade om podden återskapas. Mer information om hur du sparar profiler vid omstarter av poddar finns i vanliga frågor och svar om GPU-profilering.
Steg 3: Anslut Pyroscope till Azure Managed Grafana
Note
Om du använder din egen Grafana-instans kan du läsa vanliga frågor och svar om GPU-profilering.
Tip
Om du vill visa arbetsbelastningsprofiler direkt i Pyroscope-användargränssnittet kör du kubectl port-forward -n gadget pyroscope-0 4040:4040.
Anslut Pyroscope till Azure Managed Grafana genom Azure Private Link.
Ange miljövariablerna för klustret och 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
Om du inte har någon Azure Managed Grafana instans kör du az grafana create --name "$GRAFANA_NAME" --resource-group "$RESOURCE_GROUP" --location "$LOCATION" --output none.
Ange miljövariablerna för privat slutpunkt:
export PYROSCOPE_PLS="pyroscope-pls"
export PYROSCOPE_MPE="pyroscope-mpe"
export PYROSCOPE_PORT="4040"
Skapa den privata länken:
Note
Det kan ta några minuter att skapa den privata länken.
# 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."
Skapa Pyroscope-datakällan i 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."
Kontrollera att datakällan har en giltig URL:
az grafana data-source show \
--name "$GRAFANA_NAME" \
--data-source local-pyroscope
Steg 4: Anslut Grafana till Azure Monitor hanterad tjänst för Prometheus
Note
De här stegen baseras på Anslut Azure Monitor-hanterade tjänst för Prometheus till Grafana. Kontrollera att Grafanas hanterade identitet har rollen Monitoring Data Reader på Azure Monitor-arbetsytan, särskilt om arbetsytan finns i en annan resursgrupp eller prenumeration.
Ange miljövariablerna för Azure Monitor arbetsyta:
export AMP_NAME="<your-azure-monitor-workspace-name>"
export AMP_RESOURCE_GROUP="<your-azure-monitor-workspace-resource-group>"
Tip
Kör az resource list --resource-type Microsoft.Monitor/accounts --resource-group "$AMP_RESOURCE_GROUP" --output table för att lista Azure Monitor arbetsytor i resursgruppen. Om du vill söka i prenumerationen utelämnar du --resource-group.
Skapa Prometheus-datakällan:
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\" }
}
}"
Kontrollera datakällan:
az grafana data-source show \
--name "$GRAFANA_NAME" \
--data-source "$AMP_NAME"
Steg 5: Konfigurera instrumentpaneler i Grafana
Importera instrumentpanelen för övervakning av 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)"
Hämta instrumentpanelens URL:
GRAFANA_URL=$(az grafana show \
--name "$GRAFANA_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query properties.endpoint \
--output tsv)
echo "${GRAFANA_URL}/d/AdvancedGPUObservability"
Information om hur du tolkar profileringsdata finns i Analysera GPU-profileringslågdiagram.
Rensa resurser
Ta bort GPU-observerbarhetsstacken i klustret:
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
Att läsa flamdiagram
Information om hur du tolkar profileringsresultat och identifierar GPU-minnespunkter finns i Analysera GPU-profileringslågdiagram.
FAQ
Anpassade Prometheus- och Grafana-integreringar och beständiga Pyroscope-lagring finns i vanliga frågor och svar om GPU-profilering.