Bu yazı, LLM Benchmarking serisinin ikinci gönderisidir. Burada, GenAI-Perf kullanarak Meta Llama 3 modelinin performansını ölçme yöntemini açıklayacağız; bu model, NVIDIA NIM ile dağıtıldığında test edilecektir.
LLM tabanlı uygulamalar geliştirirken, bu modellerin belirli bir donanım üzerindeki performans özelliklerini anlamak son derece önemlidir. Bu, birden fazla amaca hizmet eder:
Bottleneck tespiti ve potansiyel optimizasyon fırsatları
Hizmet kalitesi ve throughput arasında denge kurma
Altyapı gereksinimlerini belirleme
LLM odaklı bir benchmarking aracı olan NVIDIA GenAI-Perf, önemli metrikler sunar:
İlk token için geçen süre (TTFT)
Tokenlar arası gecikme (ITL)
Saniye başına token (TPS)
Saniye başına istek (RPS)
…ve daha fazlası
GenAI-Perf, endüstride kabul gören bir standart olan OpenAI API specifikasyonuna uygun herhangi bir LLM çıkarım hizmetini destekler.
Bu benchmarking kılavuzunda, NVIDIA NIM kullanacağız; bu, hem temel hem de ince ayar yapılmış LLM’ler için yüksek throughput ve düşük gecikmeli çıkarım sunan bir dizi çıkarım mikro hizmetidir. NIM, kolay kullanım ve kurumsal düzeyde güvenlik ve yönetim sunar.
Bu yazıda, bir NIM çıkarım mikro hizmeti kurma, Llama 3’ü kullanarak performansı ölçme sürecini adım adım anlatacağız ve çıktıları analiz edeceğiz.
Neden GenAI-Perf ile model performansını benchmark yapmalıyım?
NVIDIA NIM mikro hizmetleri, çeşitli platformlarda AI modellerini dağıtıp çalıştırmayı kolaylaştıran optimize edilmiş konteynerlerdir. Bulutlar, veri merkezleri ve NVIDIA RTX AI PC’leri gibi birçok alanda generatif AI geliştirmeyi hızlandırır. NIM LLM’leri, TensorRT-LLM ve vLLM gibi sektör lideri arka uçlar tarafından güçlendirilir. NIM, aynı donanım neslisi üzerinde bile optimal performans sağlamak için sürekli geliştirilir.
GenAI-Perf, bu performans sonuçlarını hem yeniden üretmek hem de doğrulamak için kullanılabilir; ayrıca kendi donanımınızda benchmark yapma olanağı sunar. Bu süreç hakkında daha fazla bilgi için NVIDIA NIM Performansı kısmına göz atabilirsiniz.
NIM ile benchmark yapma adımları
Üstteki NIM Performansı sayfasındaki tüm performans rakamları, NVIDIA GenAI-Perf aracı ile toplanmıştır. Bu yazının geri kalan kısmındaki adım adım tarifle, bu performans rakamlarını yeniden üretebilir ve kendi donanımınızda modelleri benchmark yapabilirsiniz.
OpenAI uyumlu Llama-3 çıkarım hizmeti kurma
NIM, LLM’leri ve diğer AI temel modellerini üretime sokmanın en kolay ve hızlı yolunu sunar. Daha fazla bilgi için, Generatif AI dağıtımına dair “Kolay Kullanım Kılavuzu” veya NVIDIA NIM için Büyük Dil Modelleri dökümantasyonuna bakabilirsiniz. Burada, donanım gereksinimlerini ve ön koşulları anlatıyoruz; NVIDIA NGC API anahtarlarını da içerir.
Aşağıdaki komutları kullanarak NIM’i dağıtabilir ve çıkarım işlemini gerçekleştirebilirsiniz:
Komutları aşağıdaki gibi yazın:
export NGC_API_KEY=<YOUR_NGC_API_KEY>
# Kitap tutma için bir konteyner adı seçin
export CONTAINER_NAME=llama-3.1-8b-instruct
# NGC'den bir LLM NIM Görüntüsü seçin
export IMG_NAME="nvcr.io/nim/meta/${CONTAINER_NAME}:latest"
# İndirilen modellerin önbelleklenmesi için sisteminizde bir yol seçin
export LOCAL_NIM_CACHE=./cache/nim
mkdir -p "$LOCAL_NIM_CACHE"
# LLM NIM'i başlatın
docker run -it --rm --name=$CONTAINER_NAME
--gpus all
--shm-size=16GB
-e NGC_API_KEY
-v "$LOCAL_NIM_CACHE:/opt/nim/.cache"
-u $(id -u)
-p 8000:8000
$IMG_NAME
Bu kod örneğinde, Meta Llama-3.1-8b-Instruct modelini belirtilmiş olup, bu aynı zamanda konteynerin adıdır. Ayrıca indirilmiş model varlıklarının sürdürüleceği yerel bir dizin sunduk.
Başlatma sırasında, NIM konteyneri gerekli kaynakları indirir ve modeli bir API noktası arkasında hizmet vermeye başlar. Aşağıdaki mesaj başarılı bir başlangıcı belirtir:
INFO: Uygulama başlatma tamamlandı.
INFO: Uvicorn http://0.0.0.0:8000'da çalışıyor (Bırakmak için CTRL+C'ye basın)
Çalışmaya başladığında, NIM, sorgulayabileceğiniz OpenAI uyumlu bir API sağlar:
GenAI-Perf kurma ve tek bir kullanım durumunu benchmark yapma
Artık NIM Llama-3 çıkarım hizmetiniz çalışıyor, sırada benchmarking aracını kurmak var.
En kolay yol, önceden inşa edilmiş bir Docker konteyneri kullanmaktır. GenAI-Perf konteynerini NIM ile aynı sunucuda başlatmanızı öneririz; böylece ağ gecikmesinden kaçınabilirsiniz; aksi takdirde ölçümünüzün bir parçası olarak ağ gecikmesini hesaba katmak isterseniz bu seçeneği değerlendirebilirsiniz.
Başlamak için daha fazla bilgi almak isterseniz, GenAI-Perf dökümantasyonuna göz atabilirsiniz.
Aşağıdaki komutları kullanarak önceden inşa edilmiş konteyneri çalıştırabilirsiniz.
Benchmarking varlıklarının korunabilmesi için, konak makineden bir dizini konteyner içine monte etmelisiniz. Önceki örnekte, mevcut dizini monte ettik.
Konteyner içinde, NIM arka ucu üzerinde bir ısınma yük testi gerçekleştiren GenAI-Perf değerlendirme aracını başlatabilirsiniz:
Bu basit örnekte, giriş ve çıkış ardışık uzunluklarını ve test edilecek bir eş zamanlılık değeri belirtilmiştir. Ayrıca arka uca özel sonlandırma (EOS) tokenlerini yok saymasını belirttik, böylece çıkış istenen uzunluğa ulaşır.
Bu testte, Llama-3 tokenizer Kütüphanesi kullanılmaktadır. Bu, korumalı bir deposudur. Bu kütüphaneye erişim başvurusu yapmanız ve ardından Hugging Face kimlik bilgileri ile giriş yapmanız gerekir.
pip install huggingface_hub
huggingface-cli login
Seçenekler ve parametreler hakkında daha fazla bilgi almak için GenAI-Perf dökümantasyonunu inceleyebilirsiniz.
Başarıyla uygulandığında, terminalde aşağıdaki gibi sonuçlar görmelisiniz:
Şekil 1. GenAI-perf ile elde edilen örnek çıktı
Birden Fazla Kullanım Durumunu Test Etmek
Benchmarking bir test yapmak, genellikle birçok kullanım senaryosu (giriş ve çıkış uzunluk kombinasyonları) ile yük senaryolarını (farklı eş zamanlılık değerleri) yürütmeyi içerir. Aşağıdaki BASH betiğini kullanarak, GenAI-Perf’in tüm kombinasyonları çalıştırmasını sağlayacak parametreleri tanımlayabilirsiniz.
Benchmarking taramadan önce, bir ısınma testi gerçekleştirilmesini öneriyoruz. Bu durumu zaten GenAI-Perf kurulumunu tamamladığımız sırada yaptık.
GenAI-Perf konteynerinde aşağıdaki komutu çalıştırın:
bash benchmark.sh
İşte benchmark.sh betiği:
declare -A useCases
# Kullanım durumu açıklamaları ve belirtilen giriş/çıkış uzunluklarıyla dizi oluşturma
useCases["Çeviri"]="200/200"
useCases["Metin sınıflandırma"]="200/5"
useCases["Metin özeti"]="1000/200"
useCases["Kod oluşturma"]="200/1000"
# Giriş/çıkış uzunlukları argümanlarıyla genAI-perf çalıştırma fonksiyonu
runBenchmark() {
local description="$1"
local lengths="${useCases[$description]}"
IFS='/' read -r inputLength outputLength
--measurement-interval 30000 parametresi, her ölçüm için kullanılan zaman aralığıdır ve milisaniye olarak belirtilir. GenAI-Perf, belirli bir zaman diliminde sona eren talepleri ölçer. Birçok isteğin bitmesi için yeterince büyük bir değer seçin. Daha büyük ağlar, örneğin, Llama-3 70B ve daha fazla eş zamanlılık, böylece 100000 ms (100 saniye) gibi daha yüksek bir değer tercih edilebilir.
Sonuçları Analiz Etmek
Testler tamamlandıktan sonra, GenAI-Perf varsayılan olarak artifacts adında yapısal çıktılar üretecek ve bunları model adı, eş zamanlılık ve giriş/çıkış uzunluğuna göre düzenleyecektir.
*genai_perf.csv dosyaları, temel benchmarking sonuçlarıdır. Aşağıdaki kod ile verilere ulaşabilir, her bir kullanım durumu için istek başına düşen (RPS) ve ilk token için geçen süre (TTFT) metriklerini okuyabilirsiniz:
import os
import pandas as pd
root_dir = "./artifacts"
directory_prefix = "meta_llama-3.1-8b-instruct-openai-chat-concurrency"
concurrencies = [1, 2, 5, 10, 50, 100, 250]
RPS = []
TTFT = []
for con in concurrencies:
df = pd.read_csv(os.path.join(root_dir, directory_prefix+str(con), f"200_5_genai_perf.csv"))
RPS.append(float(df.iloc[8]['avg'].replace(',', '')))
TTFT.append(float(df.iloc[0]['avg'].replace(',', '')))
Sonuçları analiz edip veri toplayarak gecikme-throughput eğrisini aşağıdaki kod ile oluşturabilirsiniz. Burada, her bir veri noktası bir eş zamanlılık değerine karşılık gelir:
import matplotlib.pyplot as plt
plt.plot(TTFT, RPS, 'x-')
plt.xlabel('TTFT(ms)')
plt.ylabel('RPS')
labels = [1, 2, 5, 10, 50, 100, 250]
# Her bir veri noktasına etiket ekleyin
for i, label in enumerate(labels):
plt.annotate(label, (TTFT[i], RPS[i]), textcoords="offset points", xytext=(0,10), ha='center')
Şekil 2, GenAI-Perf ölçüm verileri kullanılarak elde edilen çizimi gösterir.
Şekil 2. GenAI-Perf ile ölçeklenebilir ölçüm verileri kullanarak oluşturulmuş gecikme-throughput eğrisi
Sonuçları Yorumlamak
Şekil 2, x ekseninde TTFT, y ekseninde toplam sistem throughput'u ve her noktada eş zamanlılıkları göstermektedir. Grafiği kullanmanın birkaç yolu vardır:
Bir LLM uygulama sahibi, bir gecikme bütçesi belirleyip, bu değeri x için kullanarak karşılık gelen y değerini ve eş zamanlılıkları bulabilir; böylece o gecikme bütçesiyle en yüksek throughput’u elde edebilir.
Bir LLM uygulama sahibi, eş zamanlılık değerlerine göre grafikteki karşılık gelen noktaları bulup, bu noktalardaki x ve y değerlerini inceleyebilir.
Grafikte aynı zamanda latensinin hızlı arttığı ve çok az throughput kazancı elde edildiği eş zamanlılık değerleri de görünmektedir. Örneğin, concurrency=50 bu durumlardan biridir.
Buna benzer grafikler, ITL, e2e_latency veya TPS_per_user gibi diğer metrikler kullanılarak da oluşturulabilir; bu da toplam sistem throughput’u ile her bir kullanıcının gecikmesi arasındaki dengeyi gösterebilir.
Özelleştirilmiş LLM’leri Benchmarking
Günümüzde LLM’ler, açık QA veya toplantı özeti gibi birçok yaygın görevi iyi bir şekilde yapabiliyor.
Ancak, LLM’leri özelleştirerek daha fazla avantaj sağlanabilir; bu, şirket içi bilgi tabanında eğitilerek, iç iş kültürleri, bilgi ve protokoller, belirli ürün portföyleri ve kısaltmalar hakkında bilgi sahibi olmalarını sağlar. Bunun yanı sıra, iç verimlilik araçlarını da kullanabilirler.
NIM, özelleştirilmiş modellerin hizmet vermesini sağlar. NIM, low-rank adaptation (LoRA) yöntemini destekler; bu, LLM’leri belirli alanlarda ve kullanım durumlarına göre ince ve etkili bir şekilde uyarlamanın basit bir yoludur. LLM’yi LoRA ile özelleştirmek için NVIDIA NeMo‘yu kullanabilirsiniz. Bu işlemi tamamladıktan sonra, NIM ile birden fazla LoRA adaptörünü yükleyip dağıtabilirsiniz.
Öncelikle, NVIDIA NeMo ile eğitilen LoRA adaptörlerini belirli bir dizin yapısına yerleştirin ve ardından NIM’e adaptör klasör adını bir ortam değişkeni olarak aktarın. Daha fazla bilgi için Parameter-Efficient Fine-Tuning bölümüne göz atabilirsiniz. NIM, ayrıca HuggingFace’in PEFT kütüphanesi ile eğitilmiş LoRA adaptörlerini de destekler.
LoRA modeli, temel model ile benzer şekilde sorgulanabilir; bu durumda temel modelin kimliğini, LoRA model adı ile değiştirirsiniz:
curl -X 'POST'
'http://0.0.0.0:8000/v1/completions'
-H 'accept: application/json'
-H 'Content-Type: application/json'
-d '{
"model": "llama3-8b-instruct-lora_vhf-math-v1",
"prompt": "John buys 10 packs of magic cards. Each pack has 20 cards and 1/4 of those cards are uncommon. How many uncommon cards did he get?",
"max_tokens": 128
}'
GenAI-Perf ile LoRA modellerinin dağıtım metrikleri de benchmarking üzerinden test edilir; bu durumda LoRA modellerinin kimliklerini -m argümanı ile geçmeniz yeterlidir:
Bu durumda, üç adet LoRA modeli test edilmektedir:
llama-3-8b-lora_1
llama-3-8b-lora_2
llama-3-8b-lora_3
--model-selection-strategy {round_robin,random} parametresi, bu adaptörlerin yuvarlak-robin veya rastgele çağrılıp çağrılmayacağını belirtir.
Sonuç
NVIDIA GenAI-Perf aracı, ölçekli LLM hizmetleri için gereken benchmarking çözümlerini karşılamak amacıyla geliştirilmiştir. Bu araç, NVIDIA NIM ile birlikte çalışır; ayrıca diğer OpenAI uyumlu LLM hizmetlerine de destek verir.
Bu yazı, sektör genelinde model benchmarking sürecini standartlaştırmanıza yardımcı olacak en önemli ve popüler metrikler ve parametreler hakkında bilgi sundu.