SON DAKİKA

Nvdia

Kubernetes Üzerinde NVIDIA NIM Mikroservislerinin Yatay Otomatik Ölçeklenmesi

NVIDIA NIM mikro hizmetleri, Kubernetes üzerinde dağıtılabilen model çıkarım konteynerleridir. Üretim ortamında, bu mikro hizmetlerin işlemci ve hafıza profili hakkında bilgi sahibi olmak, başarılı bir otomatik ölçeklenme planı kurmak için önemlidir.

Bu yazıda, NVIDIA NIM for LLMs modeli ile Kubernetes Yatay Pod Otomatik Ölçekleme (HPA) kurulumu ve kullanımı nasıl yapılır, belirli özel metriklere dayanarak mikro hizmetleri otomatik olarak büyütüp küçültme işlemi anlatılacaktır.

Gereksinimler

Bu eğitimi takip etmek için aşağıdaki gereksinimlere sahip olmalısınız:

  • NVIDIA AI Enterprise lisansı
    • NVIDIA NIM for LLMs, NVIDIA AI Enterprise Lisansı altında kendinize ait olarak barındırılabilir. NIM for LLMs’yi kümenizde dağıtmak için, Kubernetes kümesinin konteyner resmini indirebilmesi için bir NGC API ANAHTARI oluşturmanız gerekmektedir.
  • Kubernetes 1.29 veya üzeri bir küme (örneğin, DGX Cloud Cluster)
  • Kubernetes kümesine yönetici erişimi
  • Kubernetes CLI aracı olan kubectl yüklü olmalı
  • HELM CLI yüklenmiş olmalı

Kubernetes Kümesini Kurma

Bu eğitimin ilk adımı, Kubernetes kümenizi metrik toplama ve Kubernetes HPA hizmetine erişim için gerekli bileşenlerle yapılandırmaktır. Bunun için aşağıdaki bileşenler gereklidir:

  • Kubernetes Metrik Sunucusu
  • Prometheus
  • Prometheus Adaptörü
  • Grafana

Kubernetes Metrik Sunucusu

Metrik Sunucusu, Kubelet’lerden kaynak metriklerini toplar ve bunları Kubernetes API Sunucusu üzerinden Metrik API ile sunar. Bu, hem Yatay Pod Otomatik Ölçekleyici hem de kubectl top komutu ile kullanılır.

Kubernetes Metrik Sunucusu’nu kurmak için Helm kullanabilirsiniz.

helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm upgrade --install metrics-server metrics-server/metrics-server

Prometheus ve Grafana

Prometheus ve Grafana, pod’lardan metrikleri toplamak ve panolar oluşturmak için bilinen araçlardır. Prometheus ve Grafana’yı kurmak için, çeşitli bileşenler içeren kube-prometheus-stack Helm şemasını kullanın.

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install [RELEASE_NAME] prometheus-community/kube-prometheus-stack

Prometheus adaptörü, Prometheus’tan alınan metrikleri Kubernetes API sunucusunda Metrik API aracılığıyla sunar. Bu, HPA’nın pod’lardan gelen özel metrikleri kullanarak ölçekleme stratejileri oluşturmasını sağlar.

Prometheus ve Grafana ile aynı ad alanında Prometheus adaptörünü kurmak için şu Helm komutlarını kullanabilirsiniz:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install <isim> prometheus-community/prometheus-adapter -n <ad alanı>

Prometheus adaptörünün doğru Prometheus hizmet uç noktasına işaret ettiğinden emin olun. Bu durumda, dağıtımı düzenleyip URL’yi düzeltmem gerekiyordu.

kubectl edit deployment prom-adapter-prometheus-adapter -n prometheus
spec:
      affinity: {}
      containers:
      - args:
        - /adapter
        - --secure-port=6443
        - --cert-dir=/tmp/cert
        - --prometheus-url=http://prometheus-prometheus.prometheus.svc:9090
        - --metrics-relist-interval=1m
        - --v=4
        - --config=/etc/adapter/config.yaml
        image: registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.12.0

Eğer her şey doğru kurulduysa, aşağıdaki komut ile Prometheus’tan metrikleri görmelisiniz:

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/<ad alanı>/pods/*/gpu_cache_usage_perc?selector=app%3Dmeta-llama3-8b"
{"kind":"MetricValueList","apiVersion":"custom.metrics.k8s.io/v1beta1","metadata":{},"items":[{"describedObject":{"kind":"Pod","namespace":"<ad alanı>","name":"meta-llama3-70b-5db5f7dd89-tvcwl","apiVersion":"/v1"},"metricName":"gpu_cache_usage_perc","timestamp":"2025-01-02T20:13:15Z","value":"1m","selector":null},{"describedObject":{"kind":"Pod","namespace":"<ad alanı>","name":"meta-llama3-8b-5c6ddbbfb5-dp2mv","apiVersion":"/v1"},"metricName":"gpu_cache_usage_perc","timestamp":"2025-01-02T20:13:15Z","value":"14m","selector":null}]}

NIM Mikro Hizmetini Dağıtma

Bu yazıda, ölçekleme amacıyla NIM for LLMs’yi kullanarak meta/llama-3.1-8b-instruct modelini kullanacağız. NIM mikro hizmetini dağıtmanın çeşitli yöntemleri vardır:

Dağıtım sonrasında, NIM for LLMs mikro hizmetinin hizmet adını ve ad alanını not edin; çünkü bu bilgiler birçok komutta kullanılacaktır.

NIM for LLMs önceden ilginç metriklerle dolu bir Prometheus uç noktası sunar. Bu uç noktayı görüntülemek için aşağıdaki komutları kullanabilirsiniz:

kubectl -n <ad alanı> port-forward svc/<hizmet adı> 8080

Tarayıcıdan localhost:8080/metrics adresine giderek gpu_cache_usage_perc adında belirli bir metriği arayın. Bu yazıda bu metrik, otomatik ölçekleme için bir temel olarak kullanılacaktır. Bu metrik, KV önbelleğinin % kullanımını gösterir ve vLLM yığını tarafından raporlanmaktadır.

NIM for LLMs Grafana panosunu kullanarak bu metrikleri gözlemleyeceksiniz. JSON panelini indirin ve Grafana örneğinize yükleyin. Pano erişimi için Grafana erişim talimatlarını kontrol edebilirsiniz.

NIM for LLMs panosunu yükledikten sonra, benzer bir panel görüntülemelisiniz (bu panele iki farklı KV önbellek sayısı eklemek zorunda kaldım, çünkü 70b ve 8b modelim mevcuttu).

This diagram shows a NIM LLM Grafana dashboard that displays multiple time series metric charts, for example, KV Cache Percent Utilization, Time to First Token, and Inter Token Latency.
Şekil 1: NIM for LLMs Grafana Panosu

Artık gözlemleme yığınınızı ve mikro hizmetinizi dağıttığınıza göre, trafik oluşturup Grafana panelinde metrikleri gözlemleyebilirsiniz. Trafik oluşturmak için kullanılması gereken araç genai-perf‘dir.

Bu aracı klosterdaki bir pod’dan çalıştırmak için aşağıdaki adımları izleyin ve NIM for LLMs mikro hizmetinizle aynı ad alanında kurulum yaptığınızdan emin olun.

NVIDIA Triton ile bir pod oluşturun:

kubectl run <pod adı> --image=nvcr.io/nvidia/tritonserver:24.10-py3-sdk -n <ad alanı> --command -- sleep 100000

Pod’a giriş yaparak genai-perf CLI’sini çalıştırabilirsiniz:

kubectl exec --stdin --tty <pod adı> -- /bin/bash
genai-perf --help

Daha sonra, meta/llama-3.1-8b-instruct modeline trafik göndermek için genai-perf’inHugging Face’den uygun tokenize ediciyi indirmesi gerekecek. Hugging Face’den API anahtarını alın ve giriş yapın.

pip install --upgrade huggingface_hub[cli]
export HF_TOKEN=<hf-token>
huggingface-cli login --token $HF_TOKEN

Doğru çevre değişkenlerini ayarlayıp trafik oluşturun. Farklı parametreler hakkında daha fazla bilgi için genai-perf dökümantasyonuna göz atabilirsiniz. Model adı ve hizmet adı tam ve kurulumunuza uygun bir şekilde olmalıdır.

export INPUT_SEQUENCE_LENGTH=200
export INPUT_SEQUENCE_STD=10
export OUTPUT_SEQUENCE_LENGTH=200
export CONCURRENCY=10
export MODEL=meta/llama-3.1-8b-instruct
genai-perf profile 
             -m $MODEL  
             --endpoint-type chat  
             --service-kind openai  
             --streaming     -u meta-llama3-8b:8080     
             --synthetic-input-tokens-mean $INPUT_SEQUENCE_LENGTH                 
             --synthetic-input-tokens-stddev $INPUT_SEQUENCE_STD 
             --concurrency $CONCURRENCY    
             --output-tokens-mean $OUTPUT_SEQUENCE_LENGTH  
             --extra-inputs max_tokens:$OUTPUT_SEQUENCE_LENGTH   
             --extra-inputs min_tokens:$OUTPUT_SEQUENCE_LENGTH  
             --extra-inputs ignore_eos:true  
             --tokenizer meta-llama/Meta-Llama-3-8B-Instruct   
             --     -v     --max-threads=256

Bu yazıda, farklı trafik oluşturma denemeleri yaparak, eş zamanlılık sayısını 100, 200, 300 ve 400 olarak çeşitlendirdim. Grafana panosundan KV önbelleği kullanımı yüzdesini görebilirsiniz (Şekil 2). Eş zamanlılık denemelerine göre KV önbelleği kullanım yüzdesi, 100 eş zamanlılıkla %9.40’tan 400 eş zamanlılıkla %40.9’a kadar arttığını gözlemledim. Ayrıca, girdi ve çıktı dizisi uzunluğu gibi diğer ilgili parametreleri de değiştirebilir ve KV önbelleği kullanımına etkisini gözlemleyebilirsiniz.

This diagram shows four NIM for LLMs Grafana dashboards for concurrency 100, 200, 300 and 400. The KV Cache Percent Utilization metric increases accordingly from 9.40% to 40.09%.
Şekil 2: Eş zamanlılık artışı ile KV önbelleği kullanım yüzdesindeki artış

KV önbellek kullanımına etki eden HPA kaynağını oluşturma zamanı geldi. gpu_cache_usage_perc metriğine göre ölçeklemek için HPA kaynağını oluşturun:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: gpu-hpa-cache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: meta-llama3-8b
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: gpu_cache_usage_perc
      target:
        type: AverageValue
        averageValue: 100m

kubectl create -f hpa-gpu-cache.yaml -n <ad alanı>
kubectl get hpa -n <ad alanı> -w
NAME            REFERENCE                   TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
gpu-hpa-cache   Deployment/meta-llama3-8b   9m/100m   1         10        1          3m37s

Farklı eş zamanlılıklarda (10, 100, 200) genai-perf’i çalıştırın ve HPA metriğinin nasıl arttığını izleyin:

kubectl get hpa -n <ad alanı> -w
NAME            REFERENCE                   TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
gpu-hpa-cache   Deployment/meta-llama3-8b   9m/100m   1         10        1          3m37s
gpu-hpa-cache   Deployment/meta-llama3-8b   8m/100m   1         10        1          4m16s
gpu-hpa-cache   Deployment/meta-llama3-8b   1m/100m   1         10        1          4m46s
gpu-hpa-cache   Deployment/meta-llama3-8b   33m/100m   1         10        1          5m16s
gpu-hpa-cache   Deployment/meta-llama3-8b   56m/100m   1         10        1          5m46s
gpu-hpa-cache   Deployment/meta-llama3-8b   39m/100m   1         10        1          6m16s
gpu-hpa-cache   Deployment/meta-llama3-8b   208m/100m   1         10        1          6m46s
gpu-hpa-cache   Deployment/meta-llama3-8b   208m/100m   1         10        3          7m1s
gpu-hpa-cache   Deployment/meta-llama3-8b   293m/100m   1         10        3          7m16s
gpu-hpa-cache   Deployment/meta-llama3-8b   7m/100m     1         10        3          7m46s

Podya sayısını kontrol edin ve otomatik olarak iki yeni pod eklendiğini görmelisiniz:

kubectl get pods -n <ad alanı>
NAME                                       READY   STATUS              RESTARTS      AGE
meta-llama3-8b-5c6ddbbfb5-85p6c            1/1     Running             0             25s
meta-llama3-8b-5c6ddbbfb5-dp2mv            1/1     Running             0             146m
meta-llama3-8b-5c6ddbbfb5-sf85v            1/1     Running             0             26s

HPA aynı zamanda ölçeklendirmenin azalmasına da izin verir. Azaltma süresi --horizontal-pod-autoscaler-downscale-stabilization bayrağı ile belirlenir; bu bayrak varsayılan olarak 5 dakikadır. Bu durum, ölçek azaltma işlemlerinin kademeli olarak gerçekleşmesini ve hızla dalgalanan metrik değerlerinin etkisini yumuşatmasını sağlar. 5 dakika bekleyin ve ölçek azaltmayı kontrol edin.

kubectl get pods -n <ad alanı>
NAME                                       READY   STATUS              RESTARTS      AGE
meta-llama3-8b-5c6ddbbfb5-dp2mv            1/1     Running             0             154m

Sonuç

Bu yazıda, Kubernetes kümenizi özel metriklere göre ölçekleyecek şekilde ayarlamayı ve NIM for LLMs‘yi KV önbellek kullanımı parametresine dayalı olarak nasıl ölçeklendireceğinizi açıkladım.

Bu konuyla ilgili daha fazla keşfedilecek birçok alan var. Örneğin, ölçekleme için istek gecikmesi, istek verimliliği ve GPU işlem gücü gibi başka metrikler de göz önünde bulundurulabilir. Ayrıca, tek bir HPA kaynağında birden fazla metrikle ölçeklendirme yapabilirsiniz.

Diğer bir ilgi çekici alan, Prometheus Sorgulama Dili (PromQL) kullanarak yeni metrikler oluşturarak bunları Prometheus adaptörünün configmap’ine eklemektir; bu sayede HPA’nın ölçeklenmesini sağlarsınız.

Kaynak

Nvdia Blog

Düşüncenizi Paylaşın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İlgili Teknoloji Haberleri