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:
- Helm ile kullanarak
- NIM Operatörü ile kullanarak
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).
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.
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.