Menyiapkan pembuatan profil GPU di Azure Kubernetes Service (AKS) (Pratinjau)

Beban kerja berbasis GPU, seperti layanan inferensi AI, dapat menjadi memori intensif dan sulit dioptimalkan tanpa visibilitas ke dalam aktivitas GPU. Anda mungkin melihat kesalahan di luar memori (OOM), lonjakan latensi tak terduga, atau tekanan memori GPU yang meningkat, tetapi metrik Kubernetes tradisional tidak menunjukkan di mana kode mengalokasikan memori. Pembuatan profil GPU membantu Anda mengidentifikasi fungsi yang bertanggung jawab atas penggunaan memori GPU.

Artikel ini menunjukkan kepada Anda cara menyebarkan agen pengamatan GPU berbasis eBPF, menyimpan profil di Pyroscope, dan memvisualisasikan alokasi memori GPU di Grafana.

Important

Fitur pratinjau AKS tersedia atas dasar layanan mandiri dan pendaftaran sukarela. Pratinjau disediakan "apa adanya" dan "sebagaimana tersedia," dan pratinjau tersebut dikecualikan dari perjanjian tingkat layanan (SLA) serta garansi terbatas. Fitur pratinjau AKS sebagian didukung oleh dukungan pelanggan sebatas upaya terbaik. Dengan demikian, fitur-fitur ini tidak dimaksudkan untuk penggunaan produksi. Untuk informasi lebih lanjut, lihat artikel dukungan berikut ini:

Important

Perangkat lunak sumber terbuka disebutkan di seluruh dokumentasi dan sampel AKS. Perangkat lunak yang Anda sebarkan dikecualikan dari perjanjian tingkat layanan AKS, garansi terbatas, dan dukungan Azure. Saat Anda menggunakan teknologi sumber terbuka bersama AKS, konsultasikan opsi dukungan yang tersedia dari masing-masing komunitas dan pengelola proyek untuk mengembangkan rencana.

Microsoft bertanggung jawab untuk membangun paket sumber terbuka yang kami sebarkan di AKS. Tanggung jawab itu termasuk memiliki kepemilikan lengkap atas proses build, pemindaian, penandatanganan, validasi, dan perbaikan cepat, bersama dengan kontrol atas file biner dalam gambar kontainer. Untuk informasi selengkapnya, lihat Manajemen kerentanan untuk AKS dan Cakupan dukungan AKS.

Prasyarat

  • Kluster AKS dengan setidaknya satu kumpulan simpul dengan dukungan GPU.
  • Azure CLI versi 2.72.0 atau yang lebih baru. Jalankan az --version untuk memeriksa versi Anda.
  • Ekstensi CLI Azure k8s-extension. Jalankan az extension add --name k8s-extension untuk menginstalnya.
  • Helm versi 3.x atau yang lebih baru. Jalankan helm version untuk memeriksa versi Anda.
  • Azure Monitor, kecuali Anda menggunakan konfigurasi pemantauan Anda sendiri.
  • Azure Managed Grafana, kecuali Anda menggunakan instans Grafana milik Anda sendiri.

Langkah 1: Aktifkan pembuatan profil GPU melalui ekstensi Inspektor Gadget

Inspektor Gadget adalah kerangka kerja pengamatan berbasis eBPF sumber terbuka untuk Kubernetes. Untuk profiling GPU, sistem melacak panggilan alokasi memori Compute Unified Device Architecture (CUDA) tanpa perubahan kode, sidecar, atau memulai ulang pod.

Aktifkan pembuatan profil GPU pada kluster AKS Anda:

Note

Perintah ini mengasumsikan bahwa Anda mengaktifkan Azure Monitor pada kluster AKS Anda. Jika Anda menggunakan pengaturan Prometheus Anda sendiri, hapus --configuration-settings azureMonitor.enabled=true. Untuk informasi selengkapnya, lihat FAQ pembuatan profil 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

Verifikasi bahwa pod Inspektor Gadget sedang berjalan:

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

Tip

Pembuatan profil memori GPU menangkap peristiwa alokasi memori saat terjadi. Jika beban kerja Anda mengalokasikan memori GPU sebelum Anda mengaktifkan pembuatan profil, profiler tidak merekam peristiwa tersebut. Untuk beban kerja seperti vLLM yang melakukan pra-alokasi memori GPU selama startup, aktifkan pembuatan profil sebelum Anda menyebarkan beban kerja, atau mulai ulang beban kerja untuk mengambil jalur alokasi memori awal.

Langkah 2: Aktifkan visualisasi profil dengan Pyroscope

Note

Jika Anda sudah memiliki stack Grafana dan Pyroscope di kluster Anda, lewati langkah ini.

Pyroscope adalah proyek sumber terbuka yang memvisualisasikan dan menyimpan profil performa untuk pengoptimalan dan pemecahan masalah memori.

Terapkan satu instans Pyroscope ke kluster Anda:

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

Pastikan bahwa pod Pyroscope sedang berjalan:

kubectl get pods -n gadget pyroscope-0

Note

Untuk penerapan dengan ketersediaan tinggi, lihat dokumentasi mikroservis Pyroscope.

Note

Perintah ini menyimpan profil pada sistem file lokal, sehingga data pembuatan profil hilang jika pod dibuat ulang. Untuk menyimpan profil secara persisten saat pod dimulai ulang, lihat FAQ pembuatan profil GPU.

Langkah 3: Sambungkan Pyroscope ke Azure Managed Grafana

Note

Jika Anda menggunakan instans Grafana Anda sendiri, lihat FAQ pembuatan profil GPU.

Tip

Untuk melihat profil beban kerja langsung di antarmuka pengguna Pyroscope, jalankan kubectl port-forward -n gadget pyroscope-0 4040:4040.

Sambungkan Pyroscope ke Azure Managed Grafana melalui Azure Private Link.

Atur variabel lingkungan kluster dan 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

Jika Anda tidak memiliki instans Azure Managed Grafana, jalankan az grafana create --name "$GRAFANA_NAME" --resource-group "$RESOURCE_GROUP" --location "$LOCATION" --output none.

Atur variabel lingkungan titik akhir privat:

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

Buat tautan privat:

Note

Membuat tautan privat dapat memakan waktu beberapa menit.

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

Buat sumber data Pyroscope di 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."

Verifikasi bahwa sumber data memiliki URL yang valid:

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

Langkah 4: Sambungkan Grafana ke layanan terkelola Azure Monitor untuk Prometheus

Note

Langkah-langkah ini didasarkan pada Menyambungkan layanan terkelola Azure Monitor untuk Prometheus ke Grafana. Pastikan identitas terkelola Grafana memiliki peran Pembaca Data Pemantauan di ruang kerja Azure Monitor, terutama jika ruang kerja berada dalam grup sumber daya atau langganan yang berbeda.

Atur variabel lingkungan ruang kerja Azure Monitor:

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

Tip

Jalankan az resource list --resource-type Microsoft.Monitor/accounts --resource-group "$AMP_RESOURCE_GROUP" --output table untuk mencantumkan ruang kerja Azure Monitor di grup sumber daya. Untuk mencari langganan, abaikan --resource-group.

Buat sumber data 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\" }
    }
  }"

Verifikasi sumber data:

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

Langkah 5: Menyiapkan dasbor di Grafana

Impor dasbor observabilitas 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)"

Dapatkan URL dasbor:

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

echo "${GRAFANA_URL}/d/AdvancedGPUObservability"

Untuk menginterpretasikan data pembuatan profil, lihat Menganalisis grafik api pembuatan profil GPU.

Membersihkan sumber daya

Hapus tumpukan pengamatan GPU dalam kluster:

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

Membaca grafik api

Untuk menginterpretasikan hasil pembuatan profil dan mengidentifikasi hotspot memori GPU, lihat Menganalisis grafik api pembuatan profil GPU.

FAQ

Untuk integrasi Prometheus dan Grafana kustom dan penyimpanan Pyroscope persisten, lihat FAQ pembuatan profil GPU.

Langkah berikutnya