Hızlı Başlangıç: Azure CLI kullanarak GPU Linux tabanlı Azure Kubernetes Service (AKS) kümesi oluşturma

Azure Kubernetes Service (AKS), kümeleri hızla dağıtmak ve yönetmek için kullanabileceğiniz yönetilen bir Kubernetes hizmetidir. Bu hızlı başlangıçta şunların nasıl yapılacağını öğreneceksiniz:

  • Azure CLI kullanarak AKS kümesi dağıtma.
  • Yönetilen GPU düğümlerinin etkinleştirildiği Linux tabanlı bir GPU düğüm havuzu ekleyin.
  • AKS'nin GPU yazılım yığınını zamanlama için yükleyip yapılandırdığını doğrulayın.

Tam olarak yönetilen GPU düğümleri bir önizleme özelliğidir. Yönetilen GPU düğümlerini etkinleştirdiğinizde AKS, GPU düğüm havuzu için NVIDIA GPU sürücüsünü, NVIDIA Kubernetes cihaz eklentisini, Veri Merkezi GPU Yöneticisi (DCGM) ölçümlerini veren ve GPU sistem durumu izleme bileşenlerini yükler ve yönetir. Yönetilen GPU düğümleri, gerçek zamanlı GPU ölçümlerini Azure Managed Prometheus ve Prometheus için Azure İzleyici yönetilen hizmeti tarafından alınmak üzere de entegre eder. Daha fazla bilgi için bkz. Azure Kubernetes Service (AKS) üzerinde tam olarak yönetilen GPU düğüm havuzu oluşturma (önizleme) ve Azure Kubernetes Service (AKS)'de GPU gözlemlenebilirliği.

Note

Bu makale, kümeyi yalnızca değerlendirme amacıyla dağıtma adımlarını içerir. Üretime hazır bir kümeyi dağıtmadan önce, iş gereksinimlerinizle nasıl uyumlu olduğunu göz önünde bulundurmak için temel başvuru mimarisini öğrenin.

Important

AKS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "mevcut olduğu şekilde" sağlanmakta olup, hizmet seviyesi anlaşmalarına ve sınırlı garantilere dahil edilmemektedir. AKS önizlemeleri, müşteri desteği ekibi tarafından maksimum çaba gösterilerek kısmen ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:

Başlamadan önce

Bu hızlı başlangıç, Kubernetes kavramlarının temel olarak bilindiğini varsayar. Daha fazla bilgi için Azure Kubernetes Service (AKS) için Kubernetes temel kavramları sayfasına bakınız.

CLI uzantısını aks-preview yükleme

az extension add komutunu kullanarak aks-preview CLI uzantısını yükleyin.

az extension add --name aks-preview

az extension update komutunu kullanarak en son sürüme sahip olduğunuzdan emin olmak için uzantıyı güncelleştirin .

az extension update --name aks-preview

Önizleme özelliğini kaydetme

ManagedGPUExperiencePreview az feature register komutunu kullanarak aboneliğinize özellik bayrağını kaydedin.

az feature register --namespace Microsoft.ContainerService --name ManagedGPUExperiencePreview

Durumun Kayıtlı olarak gösterilmesi birkaç dakika sürer. az feature show komutunu kullanarak kayıt durumunu doğrulayın.

az feature show --namespace Microsoft.ContainerService --name ManagedGPUExperiencePreview --query properties.state

Durum Kayıtlı olarak gösterildiğinde az provider register komutunu kullanarak kaynak sağlayıcısınınMicrosoft.ContainerService kaydını yenileyin.

az provider register --namespace Microsoft.ContainerService

Ortam değişkenlerini tanımlama

Bu hızlı başlangıç boyunca kullanmak üzere aşağıdaki ortam değişkenlerini tanımlayın.

export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
export RESOURCE_GROUP="myAKSResourceGroup$RANDOM_STRING"
export CLUSTER_NAME="myAKSCluster$RANDOM_STRING"
export GPU_NP="gpunp"
export GPU_VM_SIZE="Standard_NC4as_T4_v3"
export LOCATION="westus"

RANDOM_STRING değişkeni rastgele 10 basamaklı bir dize depolar. RESOURCE_GROUP ve CLUSTER_NAME değişken değerleri, benzersiz adlar oluşturmak için RANDOM_STRING değeriyle birleştirilir. değişkeni, GPU_NP yönetilen GPU düğüm havuzunun adını depolar. değişkeni, GPU_VM_SIZE düğüm havuzu için GPU özellikli VM boyutunu depolar. değişkeni westusLOCATION değerine sahiptir. Bu değişken değerlerini kullanabilir veya kendi değerlerinizi oluşturabilirsiniz. echo gibi echo $RANDOM_STRINGdeğişken değerlerini görüntülemek için komutunu kullanın.

Bir kaynak grubu oluşturun

Azure kaynak grubu, Azure kaynaklarını dağıtmaya ve yönetmeye yönelik bir mantıksal grupdur. Kaynak grubu oluştururken bir konum belirtin. Bu konum, kaynak grubu meta verilerinin depolandığı ve kaynak oluşturma sırasında başka bir bölge belirtmezseniz kaynaklarınızın Azure çalıştığı yerdir.

Kaynak grubu oluşturmak için az group create komutunu kullanın.

az group create --name $RESOURCE_GROUP --location $LOCATION

Aşağıdaki örnekte sonuç gösterilmektedir.

{
  "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myAKSResourceGroup<randomStringValue>",
  "location": "westus",
  "managedBy": null,
  "name": "myAKSResourceGroup<randomStringValue>",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

AKS kümesi oluşturma

AKS kümesi oluşturmak için az aks create komutunu kullanın. Aşağıdaki örnek, bir sistem düğümüne sahip bir küme oluşturur ve sistem tarafından atanan yönetilen kimliği etkinleştirir.

az aks create \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME \
  --node-count 1 \
  --generate-ssh-keys

Yeni bir küme oluşturduğunuzda AKS, AKS kaynaklarını depolamak için otomatik olarak ikinci bir kaynak grubu oluşturur. Daha fazla bilgi için bkz. AKS ile neden iki kaynak grubu oluşturulur?

Bu örnekteki küme, zamandan ve kaynaklardan tasarruf etmek için bir düğüm sayısını belirtir. Üretim ortamında üç veya daha fazla düğümden oluşan bir düğüm sayısı kullanın. Bir az aks create düğüm sayısı belirtmezseniz komut varsayılan olarak üç düğüm olarak belirlenir.

Yönetilen GPU düğüm havuzu ekleme

az aks nodepool add komutunu kullanarak kümenize Linux tabanlı yönetilen GPU düğüm havuzu ekleyin. --enable-managed-gpu=true parametresi NVIDIA GPU sürücüsünü, NVIDIA Kubernetes cihaz eklentisini, DCGM ölçümlerini vereni ve GPU sistem durumu izleme bileşenlerini düğüm havuzuna yükleyip yönetecek şekilde AKS'yi yapılandırmaktadır.

Aşağıdaki örnek, varsayılan Ubuntu Linux işletim sistemini kullanarak yönetilen bir GPU düğüm havuzu ekler.

az aks nodepool add \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $GPU_NP \
  --node-count 1 \
  --node-vm-size $GPU_VM_SIZE \
  --node-taints sku=gpu:NoSchedule \
  --enable-managed-gpu=true

parametresi, --node-taints sku=gpu:NoSchedule iş yükleri eşleşen bir tolerans içermediği sürece GPU olmayan iş yüklerini GPU düğümü havuzundan uzak tutar.

Düğüm havuzunu oluşturduktan sonra, yönetilen GPU profilinin etkinleştirildiğini onaylamak için az aks nodepool show komutunu kullanın.

az aks nodepool show \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $GPU_NP \
  --query "{Name:name, Mode:mode, VmSize:vmSize, Taints:nodeTaints, GpuProfile:gpuProfile}"

Çıkışınız aşağıdaki değerleri içermelidir.

{
  "GpuProfile": {
    "driver": "Install",
    "driverType": "",
    "nvidia": {
      "managementMode": "Managed",
      "migStrategy": null
    }
  },
  "Mode": "User",
  "Name": "gpunp",
  "Taints": [
    "sku=gpu:NoSchedule"
  ],
  "VmSize": "Standard_NC4as_T4_v3"
}

Kümeye bağlanma

Bir Kubernetes kümesini yönetmek için, Kubernetes komut satırı istemcisi olan kubectl'i kullanın. Azure Cloud Shell kullanıyorsanız kubectl zaten yüklüdür. kubectl yerel olarak yüklemek için az aks install-cli komutunu kullanın.

  1. az aks get-credentials komutunu kullanarak Kubernetes kümenize bağlanacak şekilde yapılandırınkubectl. Bu komut, kimlik bilgilerini indirir ve Kubernetes CLI'yi bunları kullanacak şekilde yapılandırır.

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. kubectl get komutunu kullanarak kümenize bağlantıyı doğrulayın. Bu komut, küme düğümlerinin listesini döndürür ve her düğüm için düğüm havuzunu gösterir.

    kubectl get nodes -L kubernetes.azure.com/agentpool,kubernetes.azure.com/mode
    
    NAME                                STATUS   ROLES    AGE     VERSION   AGENTPOOL   MODE
    aks-nodepool1-123456789-vmss000000  Ready    <none>   20m     v1.34.4   nodepool1   system
    aks-gpunp-123456789-vmss000000      Ready    <none>   5m36s   v1.34.4   gpunp       user
    
  3. Kubernetes'in yönetilen GPU düğüm havuzunda GPU iş yüklerini zamanlayabildiğini doğrulayın.

    kubectl get nodes -l kubernetes.azure.com/agentpool=$GPU_NP -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.allocatable.nvidia\.com/gpu}{"\n"}{end}'
    

    Bu çıktı, yönetilen GPU düğüm havuzundaki her düğüm için ayrılabilir GPU sayısını gösterir.

    aks-gpunp-123456789-vmss000000  1
    

GPU ölçümleri toplamayı etkinleştirme

Yönetilen GPU düğüm havuzları, DCGM ölçüm dışa aktarıcısını içerir. GPU ölçümlerini Azure Managed Prometheus'a almak için önce AKS kümenizde Prometheus için Azure İzleyici yönetilen hizmetini etkinleştirin. Ardından, Azure İzleyici aracısında dcgmexporter kazıma profilini etkinleştiren bir ConfigMap oluşturun.

cat <<EOF | kubectl create -f -
kind: ConfigMap
apiVersion: v1
data:
  schema-version:
    v1
  config-version:
    ver1
  default-scrape-settings-enabled: |-
    dcgmexporter = true
metadata:
  name: ama-metrics-settings-configmap
  namespace: kube-system
EOF

Bu ConfigMap'i uyguladıktan sonra kümedeki tüm mevcut ve yeni NVIDIA GPU düğüm havuzları otomatik olarak kazınmış olur. gpu ölçümlerini Azure Managed Grafana görüntülemek için bkz. Azure Kubernetes Service (AKS) gpu gözlemlenebilirliği.

Uygulamayı dağıt

Yönetilen GPU düğüm havuzunun gerçek uygulamaları çalıştırabildiğini onaylamak için bir GPU iş yükü dağıtın. Bu örnek, OpenAI uyumlu bir API aracılığıyla küçük bir açık kaynak büyük dil modeline (Llama 3.2 1B) hizmet veren Ollama'yı çalıştırır. Ollama, bu hızlı başlangıcın kullandığı Standard_NC4as_T4_v3 düğüm havuzundaki NVIDIA T4 GPU’yu destekleyen llama.cpp üzerine kuruludur.

Aşağıdaki bildirim bir Deployment ve Serviceoluşturur. Deployment, bir GPU (nvidia.com/gpu: 1) ister, sku=gpu:NoSchedule taint’i için bir toleration içerir ve yönetilen GPU düğüm havuzunu hedeflemek için bir düğüm seçici kullanır. Kapsayıcı başlatıldığında, Ollama sunucusunu başlatır ve podun istekleri karşılamaya hazır olması için llama3.2:1b modelini çeker.

Aşağıdaki komutu kullanarak uygulamayı dağıtın.

cat <<'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ollama
  labels:
    app: ollama
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ollama
  template:
    metadata:
      labels:
        app: ollama
    spec:
      # Schedule onto the managed GPU node pool created in this quickstart.
      nodeSelector:
        kubernetes.azure.com/agentpool: gpunp
      # Tolerate the GPU node pool taint (sku=gpu:NoSchedule).
      tolerations:
        - key: "sku"
          operator: "Equal"
          value: "gpu"
          effect: "NoSchedule"
      containers:
        - name: ollama
          image: ollama/ollama:0.30.10
          ports:
            - name: http
              containerPort: 11434
          env:
            # Listen on all interfaces so the Service and kubelet probes can reach it.
            - name: OLLAMA_HOST
              value: "0.0.0.0:11434"
            # Model to pull and serve on startup. Fits comfortably on a 16-GB T4.
            - name: MODEL
              value: "llama3.2:1b"
          # Start the server, wait until it's ready, and then pull the model so the
          # pod is self-contained (no manual "ollama pull" step required).
          command: ["/bin/sh", "-c"]
          args:
            - |
              ollama serve &
              pid=$!
              echo "Waiting for the Ollama server to be ready..."
              until ollama list >/dev/null 2>&1; do sleep 2; done
              echo "Server ready. Pulling model: $MODEL"
              ollama pull "$MODEL" || echo "WARN: pull failed; run 'kubectl exec deploy/ollama -- ollama pull $MODEL' manually"
              echo "Model $MODEL is ready to serve."
              wait $pid
          resources:
            requests:
              cpu: "1"
              memory: 4Gi
            limits:
              cpu: "4"
              memory: 16Gi
              nvidia.com/gpu: 1
          startupProbe:
            httpGet:
              path: /api/tags
              port: http
            periodSeconds: 5
            failureThreshold: 60
          readinessProbe:
            httpGet:
              path: /api/tags
              port: http
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /
              port: http
            periodSeconds: 20
          volumeMounts:
            - name: ollama-data
              mountPath: /root/.ollama
      volumes:
        - name: ollama-data
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: ollama
  labels:
    app: ollama
spec:
  type: ClusterIP
  selector:
    app: ollama
  ports:
    - name: http
      port: 11434
      targetPort: http
EOF

Note

Bu bildirim düğüm havuzunu hedefler gpunp . Değişken için GPU_NP farklı bir değer kullandıysanız, bildirimi uygulamadan önce düğüm seçici değerini eşleşecek şekilde güncelleştirin kubernetes.azure.com/agentpool .

kubectl rollout status komutunu kullanarak dağıtımın hazır olduğunu onaylayın. İlk model indirme işlemi birkaç dakika sürebilir.

kubectl rollout status deployment/ollama --timeout=600s

kubectl get komutunu kullanarak pod'un yönetilen GPU düğüm havuzunda çalıştığını doğrulayın.

kubectl get pods -l app=ollama -o wide

Çıktınız, podun gpunp düğüm havuzundaki bir düğüm üzerinde çalıştığını göstermelidir.

NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE                            NOMINATED NODE   READINESS GATES
ollama-5b8f6c9d4f-2xq7p   1/1     Running   0          5m    10.244.1.10   aks-gpunp-12345678-vmss000000   <none>           <none>

Uygulamayı test et

Service komutunu kullanarak yerel bağlantı noktasını öğesine yönlendirin. Bu komutu çalışır durumda tutun ve kalan adımlar için ikinci bir terminal açın.

kubectl port-forward svc/ollama 11434:11434

İkinci terminalde, OpenAI uyumlu sohbet tamamlamaları uç noktasını kullanarak modele bir istem gönderin.

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.2:1b",
    "messages": [{"role": "user", "content": "In one sentence, what is Azure Kubernetes Service?"}]
  }'

Model, iş yükünün yönetilen GPU düğümü havuzundan çıkarım sunduğunu onaylayan, oluşturulan bir yanıt içeren bir JSON yanıtı döndürür.

komutunu kullanarak ollama ps modelin GPU'ya yüklendiğini onaylayın. PROCESSOR sütunu, model T4 üzerinde çalıştığında 100% GPU gösterir.

kubectl exec deploy/ollama -- ollama ps
NAME          ID              SIZE      PROCESSOR    CONTEXT   UNTIL
llama3.2:1b   baf6a787fdff    1.5 GB    100% GPU     4096      4 minutes from now

Ayrıca komutunu kullanarak nvidia-smi GPU'ya doğrudan pod içinden de bakabilirsiniz.

kubectl exec deploy/ollama -- nvidia-smi

Testi bitirdiğinizde, terminalinde kubectl port-forwardCtrl+C tuşlarına basarak işlemi durdurun. Sonraki adımda kümeyi sildiğinizde uygulama kaldırılır.

Kümeyi sil

AKS öğreticisini yapmayı planlamıyorsanız, Azure faturalama ücretlerinden kaçınmak için gereksiz kaynakları temizleyin. az group delete komutunu kullanarak kaynak grubunu, kapsayıcı hizmetini ve tüm ilgili kaynakları kaldırabilirsiniz.

az group delete --name $RESOURCE_GROUP --no-wait --yes

AKS kümesini, bu hızlı başlangıçta kullanılan varsayılan kimlik seçeneği olan sistem tarafından atanan yönetilen kimlikle oluşturdunuz. Platform bu kimliği yönetir, böylece bu kimliği el ile kaldırmanız gerekmez.

Sonraki Adımlar

Bu hızlı başlangıçta bir Kubernetes kümesi dağıttınız ve ardından Linux tabanlı yönetilen GPU düğüm havuzu eklediniz. Yönetilen GPU düğümleri ve GPU ölçümleri hakkında daha fazla bilgi için aşağıdaki makalelere bakın:

AKS ile ilgili daha fazla bilgi edinmek ve tam bir koddan dağıtıma örnek uygulamak için Kubernetes kümesi kılavuzuna geçin.