Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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-extensionAzure. Uruchom polecenieaz 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.