SON DAKİKA

Nvdia

NVIDIA NIM Performansını GenAI-Perf ile Ölçme: LLM Performans Ölçümleme Rehberi

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.

NIM ve GenAI-Perf geliştikçe, GenAI-Perf ile Benchmarking Kullanma belgesine göz atmayı unutmayın.

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:

from openai import OpenAI
client = OpenAI(base_url="http://0.0.0.0:8000/v1", api_key="not-used")
prompt = "Bir zamanlar"
response = client.completions.create(
    model="meta/llama-3.1-8b-instruct",
    prompt=prompt,
    max_tokens=16,
    stream=False
)
completion = response.choices[0].text
print(completion)

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.

export RELEASE="24.12" # güncel sürümleri kullanmak önerilir

docker run -it --net=host --gpus=all -v $PWD:/workdir nvcr.io/nvidia/tritonserver:${RELEASE}-py3-sdk

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:

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 localhost:8000 
    --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.1-8B-Instruct 
    -- 
    -v 
    --max-threads=256

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:

Sample output by genAI-perf includes metrics such as the average time to first token, inter token latency, and request latency.
Ş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.

artifacts
├── meta_llama-3.1-8b-instruct-openai-chat-concurrency1
│   ├── 1000_200.json
│   ├── 1000_200_genai_perf.csv
│   ├── 1000_200_genai_perf.json
│   ├── 200_1000.json
│   ├── 200_1000_genai_perf.csv
│   ├── 200_1000_genai_perf.json
│   ├── 200_200.json
│   ├── 200_200_genai_perf.csv
│   ├── 200_200_genai_perf.json
│   ├── 200_5.json
│   ├── 200_5_genai_perf.csv
│   ├── 200_5_genai_perf.json
│   └── inputs.json
├── meta_llama-3.1-8b-instruct-openai-chat-concurrency10
│   ├── 1000_200.json
│   ├── 1000_200_genai_perf.csv
│   ├── 1000_200_genai_perf.json
│   ├── 200_1000.json
│   ├── 200_1000_genai_perf.csv
│   ├── 200_1000_genai_perf.json
│   ├── 200_200.json
│   ├── 200_200_genai_perf.csv
│   ├── 200_200_genai_perf.json
│   ├── 200_5.json
│   ├── 200_5_genai_perf.csv
│   ├── 200_5_genai_perf.json
│   └── inputs.json
├── meta_llama-3.1-8b-instruct-openai-chat-concurrency100
│   ├── 1000_200.json
…

*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.

A line plot shows the x-axis being time to first token and the y-axis representing the total system throughput (requests per second). As the number of concurrent users increases, latency increases, becoming worse, while throughput increases, becoming better.
Ş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:

genai-perf profile 
            -m llama-3-8b-lora_1 llama-3-8b-lora_2 llama-3-8b-lora_3 
       --model-selection-strategy random 
            --endpoint-type completions 
            --service-kind openai 
            --streaming 

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.

Daha fazla bilgi ve AI uygulamanızın performansını optimize etme konusunda uzmanlık tavsiyeleri için, LLM Çıktı Büyüklüğü: Uçtan Uca Çıktı Sistemleri Benchmarking GTC oturumuna başvurabilirsiniz.

Kaynak

Nvdia Blog

Düşüncenizi Paylaşın

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

İlgili Teknoloji Haberleri