Konfigurowanie profilowania procesora GPU w Azure Kubernetes Service (AKS) (wersja zapoznawcza)

Obciążenia oparte na procesorze GPU, takie jak usługi wnioskowania sztucznej inteligencji, mogą być intensywnie obciążane pamięcią i trudne do optymalizacji bez wglądu w działanie procesora GPU. Mogą pojawić się błędy braku pamięci (OOM), nieoczekiwane skoki opóźnień lub rosnące wykorzystanie pamięci procesora GPU, ale tradycyjne metryki platformy Kubernetes nie pokazują, gdzie kod przydziela pamięć. Profilowanie procesora GPU ułatwia identyfikowanie funkcji odpowiedzialnych za użycie pamięci procesora GPU.

W tym artykule pokazano, jak wdrożyć agenta obserwacji procesora GPU opartego na eBPF, przechowywać profile w Piroskopie i wizualizować alokacje pamięci procesora GPU w narzędziu Grafana.

Ważna

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi i wymagają zapisania się. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną dla klientów, świadczoną w miarę możliwości. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

Ważna

Oprogramowanie typu open source jest wymienione w dokumentacji i przykładach usługi AKS. Oprogramowanie, które wdrażasz, jest wykluczone z umów dotyczących poziomu usług AKS, ograniczonej gwarancji i wsparcia technicznego platformy Azure. W miarę korzystania z technologii open source wraz z usługą AKS zapoznaj się z opcjami pomocy technicznej dostępnymi w odpowiednich społecznościach i opiekunami projektów, aby opracować plan.

Firma Microsoft ponosi odpowiedzialność za tworzenie pakietów typu open source wdrażanych w usłudze AKS. Ta odpowiedzialność obejmuje posiadanie pełnej kontroli nad procesem kompilacji, skanowania, podpisywania, weryfikacji i szybkich poprawek, a także nad plikami binarnymi w obrazach kontenerów. Aby uzyskać więcej informacji, zobacz zarządzanie podatnościami dla AKS i zakres wsparcia dla AKS.

Wymagania wstępne

  • Klaster AKS z co najmniej jedną pulą węzłów z obsługą GPU.
  • Azure CLI w wersji 2.72.0 lub nowszej. Uruchom polecenie az --version, aby sprawdzić wersję.
  • Rozszerzenie interfejsu wiersza polecenia platformy k8s-extension Azure. Uruchom polecenie az extension add --name k8s-extension , aby go zainstalować.
  • Program Helm w wersji 3.x lub nowszej. Uruchom polecenie helm version, aby sprawdzić wersję.
  • Azure Monitor, chyba że używasz własnej konfiguracji monitorowania.
  • Azure Managed Grafana, chyba że używasz własnej instancji Grafana.

Krok 1. Włączanie profilowania procesora GPU za pomocą rozszerzenia Gadżet inspektora

Inspektor Gadget to oparta na technologii eBPF platforma do obserwacji typu open source dla platformy Kubernetes. W przypadku profilowania procesora GPU śledzi wywołania alokacji pamięci compute Unified Device Architecture (CUDA) bez zmian kodu, przyczepek i ponownego uruchamiania zasobnika.

Włącz profilowanie procesora GPU w klastrze usługi AKS:

Uwaga / Notatka

To polecenie zakłada, że włączono Azure Monitor w klastrze usługi AKS. Jeśli używasz własnej konfiguracji Prometheusa, usuń --configuration-settings azureMonitor.enabled=true. Aby uzyskać więcej informacji, zobacz często zadawane pytania dotyczące profilowania procesora 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

Sprawdź, czy pody Inspektor Gadget są uruchomione:

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

Wskazówka

Profilowanie pamięci procesora GPU przechwytuje zdarzenia alokacji pamięci w miarę ich występowania. Jeśli obciążenie robocze przydzieli pamięć GPU przed włączeniem profilowania, profilator nie rejestruje tych zdarzeń. W przypadku obciążeń, takich jak vLLM, które wstępnie przydzielą pamięć procesora GPU podczas uruchamiania, włącz profilowanie przed wdrożeniem obciążenia lub uruchom ponownie obciążenie, aby przechwycić początkowe ścieżki alokacji pamięci.

Krok 2. Włączanie wizualizacji profilu za pomocą narzędzia Pyroscope

Uwaga / Notatka

Jeśli masz już zainstalowany stos Grafana i Pyroscope w klastrze, pomiń ten krok.

Pyroscope to projekt typu open source, który wizualizuje i przechowuje profile wydajności na potrzeby optymalizacji pamięci i rozwiązywania problemów.

Wdróż jedną instancję Pyroscope w swoim klastrze:

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

Sprawdź, czy zasobnik Piroskop jest uruchomiony:

kubectl get pods -n gadget pyroscope-0

Uwaga / Notatka

Informacje na temat wdrożenia o wysokiej dostępności można znaleźć w dokumentacji mikrousług Pyroscope.

Uwaga / Notatka

To polecenie przechowuje profile w lokalnym systemie plików, więc dane profilowania zostaną utracone, jeśli zasobnik zostanie utworzony ponownie. Aby zachować profile po ponownym uruchomieniu zasobnika, zobacz często zadawane pytania dotyczące profilowania GPU.

Krok 3. Łączenie piroskopu z Azure Managed Grafana

Uwaga / Notatka

Jeśli używasz własnej instancji Grafana, zapoznaj się z często zadawanymi pytaniami dotyczącymi profilowania GPU.

Wskazówka

Aby wyświetlić profile obciążeń bezpośrednio w interfejsie użytkownika pyroskopu, uruchom polecenie kubectl port-forward -n gadget pyroscope-0 4040:4040.

Połącz piroskop z Azure Managed Grafana za pośrednictwem Azure Private Link.

Ustaw zmienne środowiskowe klastra i Grafany:

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)

Wskazówka

Jeśli nie masz wystąpienia usługi Azure Managed Grafana, uruchom polecenie az grafana create --name "$GRAFANA_NAME" --resource-group "$RESOURCE_GROUP" --location "$LOCATION" --output none.

Ustaw zmienne środowiskowe prywatnego punktu końcowego:

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

Utwórz link prywatny:

Uwaga / Notatka

Tworzenie łącza prywatnego może potrwać kilka 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."

Utwórz źródło danych Pyroscope w 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."

Sprawdź, czy źródło danych ma prawidłowy adres URL:

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

Krok 4. Łączenie narzędzia Grafana z usługą zarządzaną Azure Monitor dla rozwiązania Prometheus

Uwaga / Notatka

Te kroki są oparte na połączeniu Azure Monitor usługi zarządzanej dla rozwiązania Prometheus z usługą Grafana. Upewnij się, że zarządzana tożsamość usługi Grafana ma przypisaną rolę Monitoring Data Reader w obszarze roboczym usługi Azure Monitor, zwłaszcza jeśli ten obszar roboczy znajduje się w innej grupie zasobów lub subskrypcji.

Ustaw zmienne środowiskowe obszaru roboczego Azure Monitor:

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

Wskazówka

Uruchom polecenie az resource list --resource-type Microsoft.Monitor/accounts --resource-group "$AMP_RESOURCE_GROUP" --output table, aby wyświetlić obszary robocze usługi Azure Monitor w grupie zasobów. Aby wyszukać subskrypcję, pomiń element --resource-group.

Utwórz źródło danych 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\" }
    }
  }"

Sprawdź źródło danych:

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

Krok 5. Konfigurowanie pulpitów nawigacyjnych w narzędziu Grafana

Zaimportuj dashboard monitorowania 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)"

Pobierz adres URL pulpitu nawigacyjnego:

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

echo "${GRAFANA_URL}/d/AdvancedGPUObservability"

Aby zinterpretować dane profilowania, zobacz Analiza wykresów płomieniowych profilowania GPU.

Uprzątnij zasoby

Usuń działający w klastrze stos monitorowania GPU:

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

Odczytywanie wykresów płomieni

Aby interpretować wyniki profilowania i identyfikować hotspoty pamięci procesora GPU, zobacz Analizowanie wykresów płomieni profilowania procesora GPU.

Często zadawane pytania

Aby uzyskać informacje o niestandardowych integracjach z Prometheusem i Grafaną oraz o trwałym przechowywaniu danych Pyroscope, zobacz sekcję FAQ dotyczącą profilowania GPU.

Następne kroki