Bu blog yazısında, NVIDIA TensorRT-LLM özelliği olan *chunked prefill* (parçalı ön doldurma) yöntemine daha yakından bakacağız. Bu özellik, GPU kullanımını artırır ve geliştiriciler için dağıtım deneyimini kolaylaştırır. Önceki yazımızda, TensorRT-LLM’de yer alan gelişmiş *KV cache* optimizasyon özelliklerinin, sistem ön doldurmalarında performansı %500’e kadar artırdığını açıklamıştık.
Geleneksel Prefill ve Decode Zorlukları
Bir kullanıcı bir modele istek gönderdiğinde, işlem iki farklı hesaplama aşamasından geçer: *prefill* ve *decode*. Her aşama, GPU hesaplama kaynaklarını farklı şekillerde kullanır.
*Prefill* aşamasında sistem, tüm giriş token’larını işleyerek *KV cache* oluşturur; bu cache, çıktının ilk token’ını üretmek için kullanılır. Bu aşama, yüksek hesaplama gücü gerektirdiği için GPU’nun geniş paralel hesaplama kaynaklarını etkili bir şekilde kullanır.
*Decode* aşamasında ise sistem, çıkış token’larını sırayla üretir ve her yeni token ile birlikte, *prefill* aşamasından gelen ara durumları günceller. Ara durumların hesaplamaları, *prefill* aşamasında yoğun bir şekilde gerçekleştirildiğinden, *decode* aşaması yalnızca yeni üretilen token’ı işlemekle sınırlıdır ve bu nedenle daha az hesaplama yoğunluğuna sahiptir.
TensorRT-LLM, birden fazla isteği aynı anda işleyen *in-flight batching* desteği sunar. Bu özellik, *prefill* ve *decode* aşamalarının eş zamanlı olarak işlenmesini sağlar. Ancak, *decode* aşaması, *prefill* istekleri tamamlanmadan başlamayacağı için latency’ye (gecikmeye) neden olabilir. Bunun üstünde, Şekil 1’in üst kısmı bu durumu anlatmaktadır.
Prefill ve Decode Aşamalarını Dengelemek
TensorRT-LLM’deki *chunked prefill* yöntemi ile token’lar daha küçük birimlere, yani parçalara ayrılarak daha hızlı işlenir. Bu, *prefill* aşamasının bir darboğaz haline gelmesini engeller, *decode* aşaması token’ları ile daha fazla paralelleşmeyi mümkün kılar ve GPU kullanımını artırır. Şekil 1’in alt kısmı bu durumu gözler önüne sermektedir.
Ayrıca, TensorRT-LLM *chunked prefill* kullanarak, GPU sistemleri daha uzun bağlamları ve daha yüksek eşzamanlılık seviyelerini işleyebilir hale gelir. Bellek kullanımı, her iterasyonda işlenen token sayısına bağlı olduğundan, *prefill* parçaları, gelen isteklerin bağlam uzunluğuna bağlı bellek tüketimini ayrıştırır. Böylece sistem, bağlam uzunluğunu artırmadan daha uzun bağlamları işleyebilir.
Dinamik Chunk Boyutu ile TensorRT-LLM Motoru Oluşturma
Şekil 1, chunk boyutunun kullanıcı etkileşimi ve genel sistem verimliliği üzerindeki etkisini göstermektedir. Büyük bir chunk boyutu, ön doldurma dizilerinin işlenmesi için gereken iterasyon sayısını azaltarak ilk token’a kadar geçen süreyi (TTFT) kısaltır.
Ancak aynı zamanda, devam eden isteklerin *decode* aşamasının tamamlanma süresini artırır; bu da sorgu tamamlama süresini uzatır ve çıktı token’larının sayısını (TPS) azaltır. Doğru dengeyi bulmak bazen geliştiriciler için zaman alabilir. TensorRT-LLM, GPU kullanım metriklerine dayalı olarak kullanıcıya en ideal önerileri sunarak dinamik chunk boyutlandırma imkanı sağlar.
Dinamik ön doldurma chunk boyutu ile ayrıca TensorRT-LLM motoru oluşturma süreci de basitleşir. Daha önce geliştiricilerin, motor oluşturma sırasında aktivasyon tamponları için maksimum giriş dizisi uzunluğunu belirlemesi gerekiyordu. En karmaşık kullanıcı sorgularını karşılayabilmek için maksimum dizgi uzunluğu yazılıma olarak belirlenmeliydi. Bu yaklaşım, GPU kaynaklarını en kötü senaryolara göre optimize ettiği için bellek kullanımında verimsizliklere sebep oluyordu.
Dinamik ön doldurma chunk boyutlandırma ile geliştiricilerin artık maksimum giriş uzunluğunu manuel olarak belirtmesi gerekmiyor. Bunun yerine, aktivasyon tamponlarının boyutları, TensorRT-LLM tarafından ayarlanan chunk boyutuna göre otomatik olarak belirlenir. Bu, manuel ayar gereksinimini ortadan kaldırır ve çalışma sırasında daha verimli bellek kullanımını sağlar.
TensorRT-LLM Parçalı Ön Doldurma ile Başlamak
TensorRT-LLM *chunked prefill* kullanımı, sistem performansını ve verimliliğini ciddi ölçüde artırır. Geleneksel sıralı *prefill* aşamasını daha küçük, işlenebilir parçalara ayırmak, *decode* aşaması ile daha iyi paralelleşmesini sağlar ve tıkanıklıkları azaltarak sorgu tamamlama süresini hızlandırır.
Chunk boyutlarının dinamik ayarlanması, TensorRT-LLM motoru yapılandırma sürecini de basit hale getirir; böylece geliştiricilerin, daha önce verimsiz bellek kullanımına yol açan aktivasyon tamponu boyutlarını manuel olarak ayarlamaları gerekmez. Dinamik chunk boyutlandırma, bellek kullanımını optimize eder ve sistemin farklı LLM kullanıcı taleplerine sorunsuz bir şekilde uyum sağlamasını garanti eder.
TensorRT-LLM *chunked prefill* kullanmaya başlamak için GitHub belgelerimizi inceleyin. Ayrıca, NVIDIA AI İnferans çözümlerini keşfedin ve en son AI inferans performans güncellemelerinden haberdar olun.