Meta’nın Llama koleksiyonu, büyük dil modelleri (LLM’ler) ile birlikte sürekli olarak büyümeye devam ediyor. Bu sefer eklenen model, Llama 3.3 70B, yalnızca metin odaklı bir modeldir ve daha önceki Llama 3.1 70B modeline göre geliştirilmiş performans sunmaktadır. Hatta Llama 3.1 405B gibi daha büyük ve hesaplama açısından daha pahalı olan modelin yetenekleriyle birçok görevde yarışabiliyor; bunlar arasında matematik, mantık yürütme, kodlama ve çok dilli destek gibi alanlar yer alıyor.
NVIDIA TensorRT-LLM, en son LLM’ler üzerinde devrim niteliğinde performans sunan güçlü bir çıkarım motorudur. Özellikle Llama 3.3 70B çıkarsama verimliliğini artırmak için birçok optimizasyon içermektedir. Bu optimizasyonlar arasında uçuş halindeki gruplama, KV önbellekleme, özel FP8 kuantizasyonu, spekülatif ayrıştırma ve daha fazlası gibi yenilikler bulunmaktadır.
Uçuş halindeki gruplama, varsayılan olarak etkinleştirilmiş bir çalışma zamanı yapılandırma parametresidir. TensorRT-LLM, aynı anda birden fazla farklı isteği işleme alarak daha yüksek bir sunum verimliliği sağlar. İstekleri bağlam ve üretim aşamalarında birbirine karıştırarak, uçuş halindeki eski istekler devam ederken yeni istekleri işleme alır ve böylece gecikmeyi azaltır ve GPU kullanımını artırır. Tamamlanan istekler gruptan çıkarılır, böylece sonraki istekler için yer açılır.
Önceki tokenların anahtar-değer elemanlarının değerlerini önbelleğe almak, bir sonraki token kümesi için bu tensörlerin yeniden hesaplanmasının önüne geçer ve bu da önemli hesaplama tasarrufları sağlar. Ancak, KV önbelleği, gruplama isteklerinin sayısı ve bağlam uzunluğuna göre lineer olarak büyüdüğünden daha fazla bellek gereksinimi doğurur.
TensorRT-LLM KV önbelleklemesi, büyüyen bellek boyutu ve gereksiz, maliyetli yeniden hesaplama önlemek arasındaki zorlu dengeyi sağlamak için birkaç optimizasyon içerir: sayfada KV önbelleği, kuantize edilmiş KV önbelleği, dairesel tampon KV önbelleği ve KV önbellek yeniden kullanımı gibi yenilikler bulunmaktadır.
Spekülatif ayrıştırma, daha hızlı ve maliyet etkin LLM çıkarımı için yaygın bir tekniktir ve çıktı üretiminin kalitesini doğrulamaya yönelik yerleşik bir mekanizma sunmaktadır. Bu yöntem, gelecek (taslak) tokenların birden fazla dizisini üretmenin, otoregresif ayrıştırmada tek bir token işlemekten daha verimli olduğu varsayımına dayanmaktadır. Hedef model, bu taslak tokenlardan kaç tanesinin kabul edileceğine karar verir, bu da her iterasyonda bir token üretmekten çok daha verimlidir. TensorRT-LLM, taslak hedef, Medusa, Eagle ve ilerleme ayrıştırması gibi bir dizi spekülatif ayrıştırma tekniğini desteklemektedir.
Bu yazıda, NVIDIA HGX H200 platformu ve NVLink ile NVSwitch’in de kullanılacağı Llama 3.3 70B modelini çalıştırma performansını nasıl artırabileceğimizi gösteriyoruz. Llama 3.3 70B ile TensorRT-LLM’yi kullanarak spekülatif ayrıştırmayı işler hale getirmek için gereken adımları açıklıyoruz. Daha fazla bilgi için, diğer optimizasyonlar, farklı modeller ve çoklu GPU çalıştırmaları hakkında, TensorRT-LLM örnekleri bağlantısını ziyaret edebilirsiniz.
Spekülatif Ayrıştırma ile Verimlilik Hızlandırma
Tablo 1 ve Şekil 2, Llama 3.3 70B hedef modeli ile spekülatif ayrıştırma kullanılmadığında (yani, taslak model olmadan) ve çeşitli boyutlardaki taslak modellerle karşılaştırıldığında throughput (çıkış tokeni/saniye) hız artışlarını vurgulamaktadır.
Throughput Performansı – Çıkış Tokeni/Saniye Bir NVIDIA H200 Tensor Core GPU ile |
||||
Taslak | Hedef Modeller | Llama 3.2 1B | Llama 3.1 405B | Llama 3.2 3B | Llama 3.1-405B | Llama 3.1 8B | Llama 3.1 405B | Llama 3.1 405B (taslak model olmadan) |
Token/saniye | 181.74 | 161.53 | 134.38 | 51.14 |
Hızlanma (taslak modüller ile olmayan) | 3.55x | 3.16x | 2.63x | N/A |
Veriler 11 Aralık 2024 tarihinde ölçülmüştür. Çıkış tokeni/saniye, ilk tokenin üretilmesi için harcanan zamanı içerir – tok/s = toplam üretilen token / toplam gecikme. DGX H200, TP1, FP8, grup boyutu=1, TensorRT Model Optimizer versiyonu 0.21, TensorRT-LLM versiyonu 0.15.0.
Spekülatif ayrıştırmayı TensorRT-LLM içinde kullanarak bu performans kazançlarını yeniden üretmek için gereken adımlar burada sunulmaktadır.
# Model kontrol noktalarını Hugging Face'ten indirin ve kurulum süreci için kolay erişim sağlamak amacıyla bir dizinde saklayın.
git lfs install
# Hedef modelleri indirin
git clone https://huggingface.co/meta-llama/Meta-Llama-3.3-70B-Instruct
# Taslak modelleri indirin
git clone https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct
git clone https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct
git clone https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct
Model kontrol noktaları indirildikten sonra, TensorRT-LLM’yi kurmalısınız.
# Temel docker imajı ortamını elde edip başlatın (opsiyonel).
docker run --rm --ipc=host --runtime=nvidia --gpus all --entrypoint
/bin/bash -it nvidia/cuda:12.5.1-devel-ubuntu22.04
# Bağlantılı kütüphaneleri yükleyin. TensorRT-LLM, Python 3.10 gerektirir.
apt-get update && apt-get -y install python3.10 python3-pip openmpi-bin
libopenmpi-dev git git-lfs
# Kütüphaneyi indirin
git clone -b v0.15.0 https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM
# TensorRT-LLM'nin en son versiyonunu kurun.
pip3 install tensorrt_llm -U --extra-index-url https://pypi.nvidia.com
# Kurulumu kontrol edin
python3 -c "import tensorrt_llm"
Daha sonra, indirilen model kontrol noktalarını taslak ve hedef TensorRT motorlarına derleyin. Bu motorlar, en iyi doğruluk ve en yüksek verimlilikle çıkarım yapmak için optimize edilmiştir.
cd examples
# 1 H200 üzerinde FP8 hassasiyetinde hedef ve taslak modelleri oluşturma adımları
# FP8 kontrol noktalarını oluşturun
python3 quantization/quantize.py --model_dir <taslak model dizini> --dtype float16 --qformat fp8 --kv_cache_dtype fp8
--output_dir /ckpt-draft --calib_size 512 --tp_size 1
python3 quantization/quantize.py
--model_dir=<hedef model dizini>
--output_dir=./ckpt-target-70b
--dtype=float16 --qformat fp8 --kv_cache_dtype fp8
--calib_size 512 --tp_size 1
# Taslak ve hedef motorları inşa edin
# Motor derleme sürecinde önemli bayraklar:
# --use_paged_context_fmha=enable, taslak/hedef model için KV önbellek yeniden kullanımını sağlamak için belirtilmelidir.
# --speculative_decoding_mode=draft_tokens_external ve --max_draft_len, hedef model için belirtilmelidir.
trtllm-build
--checkpoint_dir ./ckpt-draft
--output_dir=./draft-engine
--gpt_attention_plugin float16
--workers 1
--gemm_plugin=fp8
--use_paged_context_fmha=enable
--multiple_profiles enable
--max_batch_size=32
--max_seq_len=131072
trtllm-build
--checkpoint_dir=./ckpt-target-70b
--output_dir=./target-engine
--gpt_attention_plugin float16
--workers 1
--gemm_plugin=fp8
--use_paged_context_fmha=enable
--multiple_profiles enable
--max_batch_size=32
--max_seq_len=131072
--low_latency_gemm_plugin fp8
--speculative_decoding_mode=draft_tokens_external
--max_draft_len 10
Son olarak, TensorRT-LLM içinde spekülatif ayrıştırmayı çalıştırın.
# Çözümleme çalıştırma
# Çalıştırma sürecinde en önemli bayraklar:
#--draft_engine_dir ve --engine_dir, taslak ve hedef motorlar için belirtilmelidir.
#--draft_target_model_config, Taslak-Hedef-Model konfigürasyonuna karşılık gelmektedir. Bir örnek olarak [4,[0],[1],False], taslak_len=4,
# taslak modelinin cihazı GPU0, hedef modelinin cihazı ise GPU1'dır.
# Sadece CPP oturumu (düşük seviyeli API olarak çalıştırıcı kullanarak) desteklenirken,
# Python oturumu (--use_py_session) desteklenmemektedir.
# Llama 3.3 70B hedef model ile çalıştırma
mpirun -n 1 --allow-run-as-root python3 ./run.py
--tokenizer_dir <taslak model dizini>
--draft_engine_dir ./draft-engine
--engine_dir ./target-engine
--draft_target_model_config = "[10,[0,1,2,3,4,5,6,7],[0,1,2,3,4,5,6,7], False]"
--kv_cache_free_gpu_memory_fraction=0.35
--max_output_len=1024
--kv_cache_enable_block_reuse
--input_text="<|begin_of_text|><|start_header_id|>user<|end_header_id|>nA 3-basamaklı bir tam sayı, 1, 3 ve 5 rakamlarının her birini içermektedir. Bu tam sayının 5'e tam bölünebilme olasılığı nedir?<|eot_id|><|start_header_id|>assistant<|end_header_id|>n"
# Model tarafından üretilen çıktı:
Çıktı [Metin 0 Büyü 0]: "## Adım 1: 1, 3 ve 5 rakamlarını kullanarak oluşturulabilecek toplam 3-basamaklı tam sayıların sayısını belirleyin.
Farklı 3-basamaklı tam sayılar oluşturmak için 3! = 6 yol vardır.
## Adım 2: Bir sayının 5'e bölünebilmesi için koşulu tanımlayın.
Bir sayının 5'e bölünebilmesi için son rakamının ya 0 ya da 5 olması gerekir.
## Adım 3: 5'in son rakam olduğu durumları belirleyin.
5 sayısı son rakam olduğunda tam sayının 5'e bölünebilmesi için son pozisyonda 5 olmalıdır. Diğer iki pozisyon 1 ve 3 ile doldurulabilir, bu da 2! = 2 yol vardır.
## Adım 4: Tam sayının 5'e bölünebilme olasılığını hesaplayın.
Olasılık, uygun çıkışların sayısı (5'in son rakam olduğu düzenlemeler) ile toplam mümkün çıkışların sayısı (1, 3 ve 5 rakamlarının toplam düzenlemeleri) bölünerek hesaplanır.
## Adım 5: Olasılığı hesaplayın.
Olasılık = (Uygun Çıkışların Sayısı) / (Toplam çıkışların sayısı) = 2 / 6 = 1/3.
Son cevap: $boxed{frac{1}{3}}$"
Spekülatif ayrıştırma olmadan throughput performansını değerlendirmek için aşağıdaki adımları izleyebilirsiniz:
# Hedef model için taslak model olmadan throughput benchmark'ı çalıştırma
trtllm-build --checkpoint_dir ./ckpt-target-70b --output_dir /data/70B-TRT/
--gpt_attention_plugin float16 --workers 1 --max_batch_size 32
--max_seq_len 131072 --use_fused_mlp enable --reduce_fusion enable
--use_paged_context_fmha enable --multiple_profiles enable --gemm_plugin fp8
python3 /app/tensorrt_llm/benchmarks/cpp/prepare_dataset.py --output
token-norm-dist.json --tokenizer /llama-3_3-70b/ token-norm-dist
--num-requests 1000 --input-mean 500 --input-stdev 0 --output-mean 200
--output-stdev 0 > /tmp/synthetic.txt
trtllm-bench --model <hedef model dizini> latency --engine_dir
/data/70b-TRT/ --dataset /tmp/synthetic.txt
Özet
NVIDIA, Meta ile birlikte dünyanın önde gelen açık kaynaklı modellerinin yaratılması, optimize edilmesi ve ivmelendirilmesi konularında birlikte çalışmaktadır. NVIDIA, Llama’yı destekleyerek, açık topluluk yapay zeka modelleri ve yazılımlarını büyütme taahhüdünün bir parçası olarak kullanıcılara özel yüklerini özelleştirip karşılamaları için imkan tanımaktadır. NVIDIA, geliştiriciler, bakıcılar ve vakıflarla işbirliği yaparak birçok açık kaynak projesine katılmaktadır.
NVIDIA TensorRT-LLM, farklı model mimarilerini optimize etmek ve etkili bir şekilde çalıştırmak için birçok özellik sunmaktadır. Bu optimizasyonlar, aynı donanımda önemli hızlanmalar sağlar, daha az kaynak ile aynı iş yükünü karşılar, enerji maliyetlerini düşürür ve toplam sahip olma maliyetini iyileştirir. Üretime hazır dağıtımlarlaNVIDIA NIM mikro hizmetleri kullanılarak bu TensorRT optimizasyonları, generatif yapay zeka uygulamalarınızın NVIDIA destekli altyapıya hızlı bir şekilde dağıtımını sağlar; bu dağıtım bulut, veri merkezi veya çalışma istasyonu gibi birçok alanda gerçekleşebilir.