Nastavení profilace GPU na Azure Kubernetes Service (AKS) (Preview)

Úlohy založené na GPU, jako jsou služby odvození umělé inteligence, můžou být náročné na paměť a je obtížné je optimalizovat bez přehledu o aktivitě GPU. Můžete se setkat s chybami způsobenými nedostatkem paměti (OOM), neočekávanými nárůsty latence nebo rostoucím tlakem na paměť GPU, ale tradiční metriky Kubernetes neukazují, kde v kódu se přiděluje paměť. Profilace GPU pomáhá identifikovat funkce zodpovědné za využití paměti GPU.

V tomto článku se dozvíte, jak nasadit agenta pozorovatelnosti GPU založeného na eBPF, uložit profily v Pyroscopeu a vizualizovat přidělení paměti GPU v Grafana.

Important

Funkce AKS ve verzi Preview jsou k dispozici na bázi samoobsluhy a dobrovolného přihlášení. Ukázky jsou poskytovány "tak, jak jsou" a "dle dostupnosti" a jsou vyloučeny ze smluv o úrovni služeb a z omezené záruky. Předběžné verze AKS jsou částečně pokryty zákaznickou podporou podle možností. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:

Important

Opensourcový software je zmíněn v dokumentaci a ukázkách AKS. Software, které nasadíte, je vyloučeno z dohod o úrovni služeb AKS, omezené záruky a podpory Azure. Při používání open-source technologií spolu s AKS konzultujte dostupné možnosti podpory od příslušných komunit a správců projektů, abyste vytvořili plán.

Microsoft přebírá odpovědnost za vytváření balíčků s otevřeným zdrojovým kódem, které nasazujeme na AKS. Tato odpovědnost zahrnuje plnou správu procesu sestavení, skenování, podepisování, validace a hotfixů, spolu s kontrolou nad binárními soubory v kontejnerových obrazech. Další informace najdete v tématu Řízení zranitelností pro AKS a Podpora pro AKS a rozsah pokrytí.

Předpoklady

  • Cluster AKS s alespoň jedním fondem uzlů s podporou GPU.
  • Azure CLI verze 2.72.0 nebo novější. Spuštěním příkazu az --version zkontrolujte svou verzi.
  • Rozšíření k8s-extension Azure CLI. Spusťte az extension add --name k8s-extension, aby se nainstaloval.
  • Helm verze 3.x nebo novější Spuštěním příkazu helm version zkontrolujte svou verzi.
  • Azure Monitor, pokud nepoužíváte vlastní nastavení monitorování.
  • Azure Managed Grafana, pokud nepoužíváte vlastní instanci Grafany.

Krok 1: Povolení profilace GPU prostřednictvím rozšíření Inspektor Gadget

Inspektor Gadget je opensourcová architektura pozorovatelnosti založená na eBPF pro Kubernetes. Pro profilování GPU sleduje volání pro alokaci paměti v CUDA (Compute Unified Device Architecture) bez změn kódu, sidecarů nebo restartů podů.

Povolení profilace GPU v clusteru AKS:

Note

Tento příkaz předpokládá, že jste povolili Azure Monitor v clusteru AKS. Pokud používáte vlastní nastavení Prometheus, odeberte --configuration-settings azureMonitor.enabled=true. Další informace najdete v nejčastějších dotazech k profilaci 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

Ověřte, že jsou pody Inspektor Gadget spuštěné:

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

Tip

Profilace paměti GPU zaznamenává události přidělení paměti při jejich výskytu. Pokud vaše úloha alokuje paměť GPU dříve, než povolíte profilování, profilovací nástroj tyto události nezachytí. U úloh, jako je vLLM, které při spuštění předem přidělují paměť GPU, povolte profilaci před nasazením úlohy nebo restartujte úlohu, aby se zachytily počáteční cesty přidělení paměti.

Krok 2: Povolení vizualizace profilu pomocí Pyroscopeu

Note

Pokud již ve clusteru máte stávající sadu Grafana a Pyroscope, tento krok přeskočte.

Pyroscope je opensourcový projekt, který vizualizuje a ukládá profily výkonu pro optimalizaci paměti a řešení potíží.

Nasaďte do clusteru jednu instanci Pyroscope :

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

Ověřte, že je pod Pyroscope spuštěný:

kubectl get pods -n gadget pyroscope-0

Note

Informace o nasazení s vysokou dostupností najdete v dokumentaci k mikroslužbám Pyroscope.

Note

Tento příkaz ukládá profily v místním systému souborů, takže pokud se pod znovu vytvoří, dojde ke ztrátě dat profilace. Pokud chcete zachovat profily napříč restartováními podů, přečtěte si nejčastější dotazy k profilaci GPU.

Krok 3: Připojení Pyroskopu k Azure Managed Grafana

Note

Pokud používáte vlastní instanci Grafana, přečtěte si nejčastější dotazy k profilaci GPU.

Tip

Pokud chcete zobrazit profily úloh přímo v uživatelském rozhraní Pyroscope, spusťte kubectl port-forward -n gadget pyroscope-0 4040:4040příkaz .

Připojte Pyroscope k Azure Managed Grafana prostřednictvím Azure Private Link.

Nastavte proměnné prostředí Cluster a 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

Pokud nemáte instanci Azure Managed Grafana, spusťte az grafana create --name "$GRAFANA_NAME" --resource-group "$RESOURCE_GROUP" --location "$LOCATION" --output nonepříkaz .

Nastavte proměnné prostředí privátního koncového bodu:

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

Vytvořte privátní propojení:

Note

Vytvoření privátního propojení může trvat několik minut.

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

Vytvořte zdroj dat Pyroscope v 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."

Ověřte, že zdroj dat má platnou adresu URL:

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

Krok 4: Připojení Grafany k Azure Monitor spravované službě pro Prometheus

Note

Tyto kroky vycházejí z Connect Azure Monitor managed service for Prometheus to Grafana. Ujistěte se, že spravovaná identita služby Grafana má v pracovním prostoru Azure Monitor přiřazenou roli Monitoring Data Reader, zejména pokud se pracovní prostor nachází v jiné skupině prostředků nebo v jiném předplatném.

Nastavte proměnné prostředí pracovního prostoru Azure Monitoru:

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

Tip

Spuštěním az resource list --resource-type Microsoft.Monitor/accounts --resource-group "$AMP_RESOURCE_GROUP" --output table zobrazíte seznam pracovních prostorů služby Azure Monitor v dané skupině prostředků. Chcete-li vyhledat v předplatném, vynechejte --resource-group.

Vytvořte zdroj dat 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\" }
    }
  }"

Ověřte zdroj dat:

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

Krok 5: Nastavení řídicích panelů v Grafana

Importujte řídicí panel monitorování 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)"

Získejte adresu URL řídicího panelu:

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

echo "${GRAFANA_URL}/d/AdvancedGPUObservability"

Pokud chcete interpretovat data profilace, přečtěte si téma Analýza grafů plamenů profilace GPU.

Vyčistěte zdroje

Odstraňte sadu nástrojů pro monitorování GPU v clusteru:

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

Čtení grafů plamene

Informace o interpretaci výsledků profilování a identifikaci kritických míst využití paměti GPU naleznete v tématu Analýza plamenných grafů profilování GPU.

časté otázky

Informace o vlastních integracích Prometheus a Grafana a trvalém úložišti Pyroscope najdete v nejčastějších dotazech k profilaci GPU.

Další kroky