Connect with us

SGLang: Yapılandırılmış Dil Modeli Programlarının Verimli Çalıştırılması

Yapay Zekâ

SGLang: Yapılandırılmış Dil Modeli Programlarının Verimli Çalıştırılması

mm
SGLang: Efficient Execution of Structured Language Model Programs

Büyük dil modelleri (LLM’ler) artan olarak, birden fazla oluşturma çağrısı, gelişmiş.prompting teknikleri, kontrol akışı ve yapılandırılmış girişler/çıkışlar gerektiren karmaşık görevler için kullanılmaktadır. Ancak, bu uygulamaları programlamak ve çalıştırmak için verimli sistemler eksikliği vardır. SGLang, bu sorunu çözmeyi amaçlayan yeni bir sistemdir ve yapılandırılmış dil modeli programlarının verimli çalıştırılmasını sağlar. SGLang, bir ön uç dili ve bir çalışma zamanından oluşur. Ön uç, oluşturma ve paralellik kontrolü için primitifler sağlayarak programlamayı basitleştirir, çalışma zamanı ise RadixAttention gibi yeni optimizasyonlar aracılığıyla çalıştırma hızını artırır. KV önbelleği yeniden kullanımını sağlar ve daha hızlı yapılandırılmış çıktı çözme için sıkıştırılmış sonlu durum makineleri sağlar. Deneyimler, SGLang’in, çeşitli büyük dil ve çok modelli modellerde, ajan kontrolü, mantıksal akıl yürütme, birkaç örnek öğrenme benchmark’ları, JSON çözme, geri getirme-artırma oluşturma boru hatları ve çok turlu sohbet gibi görevleri ele alarak, mevcut en iyi çıkarım sistemlerine kıyasla %6,4’e kadar daha yüksek bir verimlilik sağladığını göstermektedir.

LLM yeteneklerinde recent gelişmeler, onların faydasını genişletmiştir ve onları daha geniş bir genel görev yelpazesi ile başa çıkmaya ve özerk ajanlar olarak işlev görmeye ermögüştür. Bu uygulamalarda, LLM’ler, dış ortamlarla etkileşim içinde, çok tur planlama, akıl yürütme ve etkileşim içerisindedir. Bu, araç kullanımı, çoklu girdi modaliteleri ve birkaç örnek öğrenme, self-consistency, iskelet-düşünce ve ağaç-düşünce gibi çeşitli prompting teknikleri aracılığıyla kolaylaştırılır. Bu yeni kullanım durumları, genellikle bağımlı olan birden fazla LLM oluşturma çağrısını gerektirir, bu da karmaşık görevleri tamamlamak için çoklu çağrı yapılarını kullanma eğilimini gösterir.

Bu geçiş, basit sohbetten, LLM’lerin daha sofistike bir programatik kullanımına işaret eder, burada programlar, LLM’lerin oluşturma süreçlerini zamanlar ve kontrol eder. Bu programlar, “Dil Modeli Programları” (LM Programları) olarak adlandırılır. Gelişmiş prompting teknikleri ve ajan iş akışları, LM programlarının kapsamına girer. LM programlarının iki ortak özelliği vardır: (1) LM programları genellikle, karmaşık görevleri tamamlamak ve genel kaliteyi artırmak için, kontrol akışıyla karıştırılan birden fazla LLM çağrısını içerir. (2) LM programları, yapılandırılmış girişler alır ve yapılandırılmış çıktılar üretir, bu da LM programlarının bileşimini ve mevcut yazılım sistemlerine entegrasyonunu sağlar.

Bu makalede, SGLang çerçevesine daha derinlemesine bakacağız, mimarisini keşfedeceğiz, performansını analiz edeceğiz ve onu mevcut en iyi çerçeve sistemleriyle karşılaştıracağız. Yani başlayalım.

SGLang’e Giriş

LM programlarının yaygın kullanımı rağmen, onları ifade etmek ve çalıştırmak için mevcut sistemler verimsizdir. SGLang, LM programlarının verimli kullanımıyla ilgili iki temel zorluğu tanımlar:

  • Programlama Karmaşıklığı: LM programlarını geliştirmek, LLM’lerin belirsiz doğası nedeniyle zahmetlidir ve zorludur. Bu, geniş dize işlemleri, deneysel prompting ayarlamaları, kırılgan çıktı işlemleri, çoklu girdi modalitelerini işleme ve paralellik mekanizmalarını uygulama içerir. Bu karmaşıklık, даже basit programların okunabilirliğini önemli ölçüde azaltır.
  • Çalıştırma Verimsizliği: LM programlarını çalıştırmak, tekrar eden hesaplamalar ve bellek kullanımı nedeniyle verimsizdir. En iyi çıkarım motorları, gecikmeyi azaltmak ve verimliliği artırmak için optimize edilmiştir, ancak iş yükü hakkında doğrudan bilgiye sahip değildir, bu da önemli verimsizliklere yol açar. Bir örnek, KV önbelleğinin yeniden kullanımını içerir, bu, generatif çıkarım için gerekli olan yeniden kullanılabilir ara tensorsden oluşur. Mevcut sistemler, birden fazla LLM çağrısı arasında ortak bir ön ek paylaştıklarında KV önbelleğinin yeniden kullanımını kolaylaştırmak için etkili mekanizmalara sahip değildir, bu da gereksiz hesaplamalara ve boşa harcanan belleğe yol açar. Ayrıca, JSON modu gibi yapılandırılmış çıktılar için kısıtlanmış çözme, mevcut sistemlerin yalnızca bir tokeni bir seferde çözdüğü için alt düzeydedir.

Bu zorlukları çözmek için, SGLang, LLM’ler için bir Yapılandırılmış Oluşturma Dili tanıtır. Temel fikir, LM programlarında çoklu çağrı yapısını verimli çalıştırma için sistemli bir şekilde sömürmektir. Aşağıdaki şekil, SGLang’in iki parçasını gösterir: bir ön uç dili ve bir arka uç çalışma zamanı.

Ön uç, LM programlarının programlamasını basitleştirir ve çalışma zamanı, onların çalıştırma hızını artırır. Bu parçalar, daha iyi performans için birlikte çalışabilir veya bağımsız olarak işlev görebilir.

SGLang, Python’da gömülü bir alan özgü dildir ve oluşturma (örneğin, extend, gen, select) ve paralellik kontrolü (örneğin, fork, join) için primitifler sağlar. Python’un kontrol akışıyla ve kütüphaneleriyle uyumludur, bu da gelişmiş prompting iş akışlarını yerel Python sözdizimiyle kolayca geliştirmeyi sağlar. SGLang, bir yorumlayıcı ve bir derleyici içerir. Yorumlayıcı,.prompt durumunu bir akış olarak yönetir ve ilkel işlemleri akışa asenkron olarak çalıştırma için gönderir, bu da senkronizasyon ve intra-program paralellik üzerinde doğru kontrolü sağlar. Ayrıca, SGLang programları izlenebilir ve derlenerek daha fazla optimizasyon için kullanılabilir. SGLang’in çalışma zamanı, LM programlarının çalıştırma hızını artırmak için beberapa yeni optimizasyon önerir:

  • RadixAttention: Bu teknik, KV önbelleğinin birden fazla oluşturma çağrısı arasında otomatik olarak yeniden kullanımını sağlar. Mevcut çıkarım motorlarında, bir isteğin KV önbelleği, işleme之后 atılır, bu da birden fazla çağrı arasında yeniden kullanımını engeller ve çalıştırma hızını azaltır. SGLang, bir radix ağacında KV önbelleğinin bir LRU önbelleğini korur, KV önbelleğini geleneksel bir önbellek olarak yönetir ve radix ağacını verimli eşleme, ekleme ve çıkarma için kullanır. Bu, çalışma zamanının çeşitli yeniden kullanım kalıplarını verimli bir şekilde işleyebilmesini sağlar.
  • Sıkıştırılmış Sonlu Durum Makinesi: Bu teknik, yapılandırılmış çıktılar için daha hızlı kısıtlanmış çözme sağlar. Mevcut sistemler, yalnızca bir sonraki token için kısıtlamaları takip eder, bu da yalnızca bir tokeni bir seferde çözebilmelerine yol açar. Bunun yerine, SGLang, kısıtlamaları analiz eder ve onları temsil etmek için bir sıkıştırılmış sonlu durum makinesi oluşturur, bu da mümkün olduğunda çok tokenli bir yolu tek adımda bir yola sıkıştırır, bu da birden fazla tokeni bir seferde çözmeyi ve daha hızlı bir hız sağlamayı sağlar.
  • API Spekülatif Çalıştırma: API-only modelleri için, SGLang, API spekülatif çalıştırma sağlar, bu da çoklu çağrı programlarını optimize eder.

SGLang kullanarak, çeşitli LLM uygulamaları gerçekleştirildi, bunlar arasında ajan kontrolü, mantıksal akıl yürütme, birkaç örnek öğrenme benchmark’ları, JSON çözme, geri getirme-artırma oluşturma boru hatları, çok turlu sohbet ve çoklu modellik işleme yer aldı. Performans, Llama-7B/70B, Mistral-8x7B, LLaVA-v1.5-7B (görüntü) ve LLaVA-NeXT-34B (video) modellerinde NVIDIA A10G ve A100 GPU’larında test edildi. Deneysel sonuçlar, SGLang’in, çeşitli iş yükleri, modeller ve donanım ayarları boyunca, mevcut programlama ve çıkarım sistemlerine kıyasla %6,4’e kadar daha yüksek bir verimlilik sağladığını göstermektedir.

SGLang: Programlama Modeli ve Yöntemi

SGLang programlama modeli, bir çalıştırma örneği aracılığıyla tanıtılır, dil primitiflerini ve çalışma modlarını açıklar ve çalışma zamanı optimizasyonu fırsatlarını belirtir. Bu model, çoklu çağrı iş akışlarında (örneğin, dize işlemleri, API çağrıları, kısıtlama belirtimi, paralellik) zahmetli operasyonları basitleştirir ve esnek ve bileşik primitifler sağlar. SGLang, Python’da gömülü bir alan özgü dildir. Aşağıdaki şekil, bir yazı hakkında bir görüntüyü değerlendiren bir programı gösterir, bu program dal-solve-birleştirmeye yönelik prompting yöntemini kullanır.

`multi_dimensional_judge` fonksiyonu, üç argüman alır: `s`, `path` ve `essay`. s, prompt durumunu yönetir, path, görüntü dosyası yolu ve essay, yazı metnidir. Yeni dizeler ve SGLang primitifleri, `+=` operatörü kullanılarak çalıştırma için durum s’e eklenabilir. İlk olarak, fonksiyon, görüntüyü ve yazıyı prompt’a ekler. Sonra, yazının görüntüyle ilgili olup olmadığını `select` kullanarak kontrol eder ve sonucu `s[“related”]` içinde depolar. İlişkili ise, prompt, üç kopyaya paralel olarak değerlendirmek için `fork` kullanılarak bölünür, `gen` kullanarak sonuçlar `f[“judgment”]` içinde depolanır. Daha sonra, hükümler birleştirilir, bir özet oluşturulur ve bir harf notu atanır. Son olarak, sonuçlar, bir regular expression kısıtlaması tarafından tanımlanan bir şema izleyerek JSON formatında döndürülür.

SGLang, prompt durumunu, oluşturmayı ve paralellik kontrolünü kontrol etmek için primitifler sağlar, bu primitifler Python sözdizimi ve kütüphaneleriyle birlikte kullanılabilir. İşte primitifler:

gen: Bir modeli çağırır ve sonucu, ilk argümanında belirtilen adla bir değişkende depolar. Ayrıca, bir `regex` argümanını destekler, bu da çıktının, bir regular expression tarafından tanımlanan bir grameri izlemesini sağlar (örneğin, bir JSON şeması).

  • select: Bir modeli çağırır ve listeden en yüksek olasılıklı seçeneği seçer.
  • += veya extend: Bir dizeyi prompt’a ekler.
  • [değişken_adı]: Oluşturma sonuçlarını alır.
  • fork: Prompt durumunun paralel kopyalarını oluşturur.
  • join: Prompt durumunu birleştirir.
  • image ve video: Görüntü ve video girişlerini alır.

Bir SGLang programını çalıştırmak için en basit yol, bir yorumlayıcı kullanmaktır, burada bir prompt, asenkron bir akış olarak işlenir. `extend`, `gen` ve `select` gibi primitifler, asenkron olarak çalıştırma için akışa gönderilir. Bu engelsiz çağrılar, Python kodunun, oluşturma işleminin bitmesini beklemeden çalışmaya devam etmesini sağlar, bu da CUDA çekirdeklerinin asenkron olarak başlatılmasına benzer. Her prompt, bir arka plan işleminde bir akış yürütücüsü tarafından yönetilir, bu da intra-program paralellik sağlar. Oluşturma sonuçlarını alma, sonuçlar hazır olana kadar engeller, bu da doğru senkronizasyonu sağlar. Alternatif olarak, SGLang programları, hesaplamalı grafikler olarak derlenebilir ve bir grafik yürütücüsü ile çalıştırılabilir, bu da daha fazla optimizasyon sağlar. Bu makale, varsayılan olarak yorumlayıcı modunu kullanır ve derleyici modu sonuçlarını Ek D’de tartışır. SGLang, kendi SGLang Çalışma Zamanı (SRT) ile açık ağırlıklı modelleri ve API modellerini (örneğin, OpenAI ve Anthropic modellerini) destekler.

LLM’ler için programlama sistemleri, yüksek seviye (örneğin, LangChain, DSPy) ve düşük seviye (örneğin, LMQL, Guidance, SGLang) olarak sınıflandırılabilir. Yüksek seviye sistemler, önceden tanımlanmış veya otomatik olarak oluşturulmuş prompt’lar sağlar, Örneğin, DSPy’nin prompt optimizatörü. Düşük seviye sistemler, genellikle prompt’ları değiştirmez, ancak prompt’ları ve primitifleri doğrudan manipüle etmeyi sağlar. SGLang, LMQL ve Guidance gibi bir düşük seviye sistemdir. Aşağıdaki tablo, उनक özelliklerini karşılaştırır.

SGLang, çalışma zamanı verimliliği üzerinde daha fazla odaklanır ve yeni optimizasyonlar için kendi tasarlanmış çalışma zamanına sahiptir. Yüksek seviye diller (örneğin, DSPy), düşük seviye dillere (örneğin, SGLang) derlenebilir. DSPy’de, daha iyi çalışma zamanı verimliliği için arka uç olarak SGLang’ın entegrasyonu gösterilir.

Yukarıdaki örnek, RadixAttention işlemlerini, bir LRU atma politikası ile, dokuz zaman noktasında gösterir, bu da çeşitli isteklere yanıt olarak radix ağacının dinamik evrimini gösterir. Bu isteklere, iki sohbet oturumu, birkaç örnek öğrenme sorgusu ve self-consistency örneklemesi dahildir. Her ağaç kenarı, bir alt dize veya token dizisini gösteren bir etiket taşır. Düğümler, farklı durumları yansıtmak için renklendirilir: yeni eklenen düğümler için yeşil, zaman noktasında erişilen önbellek düğümleri için mavi ve atılan düğümler için kırmızı.

Adım 1: Radix ağacı başlangıçta boştur.

Adım 2: Sunucu, gelen bir kullanıcı mesajı “Merhaba” işler ve LLM çıkışı “Merhaba!” ile yanıt verir. Sistem prompt’u, kullanıcı mesajı “Merhaba!” ve LLM cevabı “Merhaba!” birleştirilir ve ağaca tek bir kenar olarak bağlanan yeni bir düğüm olarak eklenir.

Adım 3: Yeni bir prompt gelir ve sunucu, prompt’un ön ekini (yani, sohbetin ilk turunu) radix ağacında bulur ve KV önbelleğini yeniden kullanır. Yeni tur, ağaca yeni bir düğüm olarak eklenir.

Adım 4: Yeni bir sohbet oturumu başlar. Adım 3’ten düğme, iki sohbet oturumunun sistem prompt’unu paylaşmasına izin vermek için iki düğüme bölünür.

Adım 5: İkinci sohbet oturumu devam eder. Ancak, bellek sınırları nedeniyle, Adım 4’ten bir düğme atılmalıdır. Yeni tur, kalan Adım 4’ten düğme之后 eklenir.

Adım 6: Sunucu, birkaç örnek öğrenme sorgusu alır, işler ve ağaca ekler. Kök düğme, yeni sorgunun mevcut düğümlerle ortak bir ön ek paylaştığından bölünür.

Adım 7: Sunucu, birkaç örnek öğrenme sorgusu alır. Bu sorgular, aynı birkaç örnek kümesini paylaşır, bu nedenle Adım 6’dan bir düğme, paylaşımı ermögüştürmek için bölünür.

Adım 8: Sunucu, ilk sohbet oturumundan bir mesaj alır. En az recently kullanılan düğümler olarak, ikinci sohbet oturumundan tüm düğümleri atar.

Adım 9: Sunucu, Adım 8’den bir düğmeyle ilgili daha fazla cevap örneklemesi isteği alır, muhtemelen self-consistency prompting için. Bu isteklere yer açmak için, birkaç düğme atılır.

Bu örnek, RadixAttention’ın, çeşitli isteklere yanıt olarak radix ağacındaki düğümlerin dinamik atamasını ve atılmasını nasıl işlediğini gösterir, bu da KV önbelleği yeniden kullanımını ve bellek yönetimini sağlar.

SGLang: Değerlendirme ve Sonuçlar

Açık Ağırlıklı Modeller Üzerindeki Sonuçlar

Gecikme ve verimlilik sonuçları aşağıdaki şekillerde gösterilir. SGLang, verimliliği %6,4’e kadar artırır ve gecikmeyi %3,7’ye kadar azaltır. Bu gelişmeler, KV önbelleği yeniden kullanımından, tek bir program içindeki paralellikten ve daha hızlı kısıtlanmış çözmeden kaynaklanır.

Bu benchmark’lar üzerinde, önbellek isabet oranı %50 ile %99 arasında değişir. Şekil 13 (Ek), tümü için elde edilen ve optimal önbellek isabet oranlarını listeler, SGLang’in önbellek bilincine sahip zamanlama yaklaşımının, ortalama olarak, optimal isabet oranının %96’sına ulaştığını gösterir.

Tensör Paralelliği ile Daha Büyük Modeller Üzerindeki Sonuçlar

Daha büyük modeller, Mixtral-8x7B ve Llama-70B, aynı benchmark’lar üzerinde tensör paralelliği ile test edildi ve sonuçlar aşağıdaki şekillerde raporlandı. Daha büyük modeller üzerindeki hızlanma, küçük modellerde gözlenen eğilime benzer bir trend gösterir, bu da SGLang’in optimizasyonunun daha büyük modellere genellemesini gösterir. Guidance ve LMQL, tensör paralelliğinin verimli uygulamalarının eksikliği nedeniyle atlandı.

Çok Modelli Modeller Üzerindeki Sonuçlar

SGLang, çok modelli modeller için yerel destek sağlar, image ve video primitifleri ile. Bu makaledeki optimizasyonlar, çok modelli modellerle uyumludur. RadixAttention için, girdi resimlerinin hash’ı hesaplanır ve radix ağacında bir anahtar olarak kullanılır, bu da aynı resimden resim tokenlerinin KV önbelleğinin yeniden kullanımını sağlar. LLaVA-v1.5-7B (resim) llava-bench-in-the-wild üzerinde ve LLaVA-NeXT-34B (video) ActivityNet üzerinde çalıştırıldı. Bu modeller, diğer temel sistemler tarafından iyi desteklenmediğinden, model yazarlarının Hugging Face Transformers’daki orijinal uygulaması temel olarak kullanıldı. Aşağıdaki tabloda gösterildiği gibi, SGLang bu benchmark’lar üzerinde %6’ya kadar daha yüksek bir verimlilik sağlar. llava-bench-in-the-wild’de, aynı resim hakkında birden fazla soru işlenir ve SGLang çalışma zamanı bu durumda KV önbelleğini yeniden kullanır.

Üretim Dağıtımı

SGLang, açık ağırlıklı modelleri sunmak için Chatbot Arena’da dağıtıldı. Düşük trafik nedeniyle, her model için yalnızca bir SGLang işleyici hizmet vermektedir. Bir ay sonra, LLaVA-Next-34B için %52,4’lük bir RadixAttention önbellek isabet oranı ve Vicuna-33B için %74,1’lik bir oran gözlemlendi. Önbellek isabetleri, ortak sistem mesajlarından, sıkça kullanılan örnek resimlerden ve çok turlu sohbet tarihlerinden geldi. Bu, Vicuna-33B için ortalama olarak ilk token gecikmesini %1,7 oranında azalttı.

Son Düşünceler

Bu makalede, SGLang’i, yapılandırılmış dil modeli programlarının verimli çalıştırılmasını sağlayan yeni bir sistem olarak tanıttık. SGLang, bir ön uç dili ve bir çalışma zamanından oluşur. Ön uç, programlamayı basitleştirir, çalışma zamanı ise RadixAttention ve sıkıştırılmış sonlu durum makineleri gibi yeni optimizasyonlar aracılığıyla çalıştırma hızını artırır. Deneyimler, SGLang’in, çeşitli büyük dil ve çok modelli modellerde, ajan kontrolü, mantıksal akıl yürütme, birkaç örnek öğrenme benchmark’ları, JSON çözme, geri getirme-artırma oluşturma boru hatları ve çok turlu sohbet gibi görevleri ele alarak, mevcut en iyi çıkarım sistemlerine kıyasla %6,4’e kadar daha yüksek bir verimlilik sağladığını göstermektedir.

Mesleği mühendis, kalbi yazar. Kunal, AI ve ML'ye derin bir sevgi ve anlayışla technical writer, bu alanlardaki karmaşık kavramları etkileyici ve bilgilendirici belgelerle basitleştirmeye adanmış.