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) giderek daha karmaşık görevler için, birden fazla üretim çağrısı, gelişmiş.prompting teknikleri, kontrol akışı ve yapılandırılmış girişler/çıkışlar gerektiren görevler için giderek daha fazla 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. SGLang, bir ön uç dili ve bir çalışma zamanı içerir. Ön uç, üretim ve paralellik kontrolü için primitifler sağlayan programlamayı basitleştirir, mentre çalışma zamanı, RadixAttention gibi yeni optimizasyonlar sayesinde çalıştırma hızını artırır. KV önbelleği yeniden kullanımını sağlayan RadixAttention ve yapılandırılmış çıktı kodlamasını hızlandıran sıkıştırılmış sonlu durum makineleri gibi optimizasyonlar 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 kodlama, geri alma-artırma üretim hatları ve çok turlu sohbet gibi görevleri ele alan state-of-the-art çıkarım sistemlerine kıyasla %6.4’e varan daha yüksek bir verimlilik elde ettiğini göstermektedir.

LLM yeteneklerinde recent gelişmeler, onların faydasını genişletmiştir, böylece daha geniş bir görev yelpazesi ile başa çıkabilen ve bağımsız ajanlar olarak işlev görebilen bir dizi görevi gerçekleştirebilmektedir. Bu uygulamalarda, LLM’ler, çok tur planlaması, akıl yürütme ve dış ortamlarla 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 ile sağlanır. Bu yeni kullanım durumları, genellikle bağımlı LLM üretim çağrıları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 daha sofistike bir programatik LLM kullanımına işaret eder, burada programlar LLM’lerin üretim süreçlerini planlar ve kontrol eder. Bu programlar “Dil Modeli Programları” (LM Programları) olarak adlandırılır. Gelişmiş prompting teknikleri ve ajans 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 LLM çağrıları ile kontrol akışını içerir. (2) LM programları yapılandırılmış girişler alır ve yapılandırılmış çıktılar üretir, böylece LM programlarının bileşimi ve mevcut yazılım sistemlerine entegrasyonu sağlanır.

Bu makalede, SGLang çerçevesine daha derinlemesine bir bakış atacağız, mimarisini keşfedeceğiz, performansını analiz edeceğiz ve state-of-the-art çerçevelerle karşılaştıracağız. Böylece başlayalım.

SGLang’a Giriş

LM programlarının yaygın kullanımı rağmen, bunları 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 zahmetli ve zordur. Bu, geniş dize işlemleri, deneysel prompting ayarlamaları, kırılgan çıktı işlemleri, çoklu girdi modalitelerini işleme ve paralellik mekanizmalarının uygulanmasını 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 verimsizdir, çünkü tekrar eden hesaplamalar ve bellek kullanımı vardır. State-of-the-art çı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 tensörlerden oluşur. Mevcut sistemler, KV önbelleğinin birden fazla LLM çağrısı arasında paylaşımını sağlayan etkili mekanizmalardan yoksundur, 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ış kodlama, yalnızca bir tokeni bir kez kodlayabilen mevcut sistemler nedeniyle alt düzeydedir.

Bu zorlukları çözmek için, SGLang, LLM’ler için bir Yapılandırılmış Üretim Dili tanıtılır. Temel fikir, LM programlarında çoklu çağrı yapısını verimli çalıştırma için sistemli olarak kullanmaktır. Aşağıdaki şekilden de görülebileceği gibi, SGLang iki parçadan oluşur: 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’a gömülü bir alan özgü dildir ve üretim (örneğin, extend, gen, select) ve paralellik kontrolü (örneğin, fork, join) için primitifler sağlar. Python kontrol akışıyla ve kütüphaneleriyle uyumludur, böylece kullanıcılar, yerel Python sözdizimi ile gelişmiş prompting iş akışlarını kolayca geliştirebilirler. SGLang, bir yorumlayıcı ve bir derleyici içerir. Yorumlayıcı,.prompt durumunu bir akış olarak yönetir ve asenkron yürütme için ilkel işlemleri akışa gönderir, böylece senkronizasyon ve intra-program paralellik üzerinde doğru kontrolü sağlar. Ayrıca, SGLang programları izlenebilir ve daha fazla optimizasyon için derlenebilir. 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 üretim çağrısı arasında otomatik olarak yeniden kullanılmasını sağlar. Mevcut çıkarım motorlarında, bir isteğin KV önbelleği, işleme sonrasında 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ğini bir LRU önbelleği olarak yönetir ve radix ağacını KV önbelleğinin efektif eşleştirilmesi, eklenmesi ve atılması için kullanır. Bu, çalışma zamanının çeşitli yeniden kullanım modellerini 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ış kodlama sağlar. Mevcut sistemler, yalnızca bir sonraki token için kısıtlamaları takip eder, bu da yalnızca bir tokeni bir kez kodlayabilmesini sağlar. SGLang ise, kısıtlamaları analiz eder ve onları temsil etmek için bir sıkıştırılmış sonlu durum makinesi oluşturur, böylece birden fazla tokeni bir defada kodlayabilir ve daha hızlı bir hız sağlar.
  • API Spekülatif Çalıştırma: API-only modeller için, SGLang, API spekülatif çalıştırma önerir, bu da multi-çağrı programlarını optimize eder.

SGLang kullanarak, çeşitli LLM uygulamaları gerçekleştirilmiştir, bunlar arasında ajan kontrolü, mantıksal akıl yürütme, birkaç örnek öğrenme benchmark’ları, JSON kodlama, geri alma-artırma üretim hatları, çok tur lu sohbet ve çok modlu işleme bulunur. 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 üzerinde test edilmiştir. Deneysel sonuçlar, SGLang’in, çeşitli iş yükleri, modeller ve donanım kurulumları üzerinde, mevcut programlama ve çıkarım sistemlerine kıyasla %6.4’e varan daha yüksek bir verimlilik elde ettiğini göstermektedir.

SGLang: Programlama Modeli ve Yöntemi

SGLang programlama modeli, bir örnek üzerinden tanıtılmaktadır, dil primitiflerini ve çalışma modlarını açıklamaktadır ve çalışma zamanı optimizasyonu fırsatlarını belirlemektedir. Bu model, çoklu çağrı iş akışlarındaki (örneğin, dize işlemleri, API çağrıları, kısıtlama belirtimi, paralellik) zahmetli işlemleri, esnek ve bileşik primitifler sağlayarak basitleştirir. SGLang, Python’a gömülü bir alan özgü dildir. Aşağıdaki şekil, bir makaleyi bir görüntüye göre değerlendiren bir programı göstermektedir.

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, makale metnidir. Yeni dizeler ve SGLang primitifleri, + operatörü kullanılarak durum s’ye eklenerek yürütülür. İlk olarak, fonksiyon, görüntüyü ve makaleyi prompt’a ekler. Ardından, makale ile görüntünün ilgili olup olmadığını select kullanarak kontrol eder ve sonucu s[“related”]’e depolar. İlişkili ise, prompt, üç kopyaya paralel olarak bölünür ve gen kullanarak sonuçlar f[“judgment”]’e depolanır. Sonrasında, hükümler birleştirilir, bir özet üretilir ve bir harf notu atanır. Son olarak, sonuçlar JSON formatında, bir düzenli ifade kısıtlaması tarafından tanımlanan bir şema izleyerek döndürülür. SGLang, bu programı büyük ölçüde basitleştirir, çünkü eşdeğer bir program, OpenAI API benzeri bir arayüze sahip olmak için 2.1 kat daha fazla satır kod gerektirecektir.

SGLang, prompt durumunu, üretimi ve paralellik kontrolünü kontrol etmek için primitifler sağlar. Bunlar, Python sözdizimi ve kütüphaneleri ile kullanılabilir. İşte primitifler:

gen: Bir modeli çağırır, üretimi sağlar ve sonucu bir değişkene depolar, ilk argüman tarafından belirtilen adla. Ayrıca, bir düzenli ifade tarafından tanımlanan bir grameri takip eden çıktıları kısıtlamak için bir regex argümanını destekler.

  • select: Bir modeli çağırır, en yüksek olasılıklı seçeneği seçer ve sonucu bir değişkene depolar.
  • += veya extend: Bir dizeyi prompt’a ekler.
  • [değişken_adı]: Üretimin sonucunu 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.

SGLang programlarını çalıştırmak için en basit yol, bir yorumlayıcı kullanmaktır, burada bir prompt, asenkron bir akış olarak işlenir. İlkel işlemler, extend, gen ve select, akışa asenkron yürütme için gönderilir. Bu non-bloke çağrılar, Python kodunun, üretimin tamamlanmasını beklemeden devam etmesini sağlar. 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. Üretim sonuçlarını alma, sonuçlar hazır olana kadar bloke eder, böylece doğru senkronizasyon sağlanır. Alternatif olarak, SGLang programları, hesaplama grafikleri 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 destekler ve ayrıca OpenAI ve Anthropic gibi API 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 üretilen promt’lar sağlar, örneğin DSPy’nin prompt optimizer’ı. Düşük seviye sistemler, genellikle promt’ları değiştirmez, ancak promt’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 kendi tasarlanmış çalışma zamanına sahiptir, bu da yeni optimizasyonları sağlar. Yüksek seviye diller (örneğin, DSPy), düşük seviye dillere (örneğin, SGLang) derlenebilir. DSPy’de SGLang’in, daha iyi çalışma zamanı verimliliği için bir arka uç olarak entegrasyonu, daha sonra gösterilir.

Aşağıdaki örnek, RadixAttention işlemlerini, bir LRU atma politikası ile birlikte, dokuz zaman noktasında gösterir, bu da çeşitli isteklere yanıt olarak radix ağacının dinamik olarak tahsisini ve atılmasını gösterir. Bu istekler, iki sohbet oturumu, birkaç örnek öğrenme sorgusu ve self-consistency sampling’i içerir. Her ağaç kenarı, bir alt dize veya token dizisini gösteren bir etiket taşır. Düğümler, farklı durumları yansıtmak için renklendirilmiştir: yeni eklenen düğümler için yeşil, önbellekteki düğümler 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, bir gelen kullanıcı mesajı “Merhaba” işler ve “Merhaba” cevabını verir. Sistem promt’u, kullanıcı mesajı ve LLM cevabı, bir kenar olarak ağaça eklenir.

Adım 3: Yeni bir promt gelir ve sunucu, promt’un ön ekini (sohbetin ilk turunu) radix ağacında bulur ve KV önbelleğini yeniden kullanır. Yeni tur, ağaçta 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 promt’unu paylaşabilmesi için ikiye 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 düğme之后 eklenir.

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

Adım 7: Sunucu, birkaç örnek öğrenme sorgusu daha alır. Bu sorgular, aynı birkaç örnek öğrenme örneklerini paylaşırlar, bu nedenle Adım 6’dan bir düğme bölünür, böylece paylaşımı sağlar.

Adım 8: Sunucu, ilk sohbet oturumundan bir mesaj alır. En az recently kullanılan düğümler, yani ikinci sohbet oturumundan düğümler atılır.

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

Bu örnek, RadixAttention’ın, çeşitli isteklere yanıt olarak düğümlerin dinamik olarak tahsisini 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österilmektedir. 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ış kodlamadan kaynaklanmaktadır.

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

Tensor Paralelliği ile Daha Büyük Modeller Üzerindeki Sonuçlar

Daha büyük modeller, Mixtral-8x7B ve Llama-70B, aynı benchmark’lerde tensor paralelliği ile test edilmiştir ve sonuçlar aşağıdaki şekillerde rapor edilmiştir. Daha büyük modeller üzerindeki hızlanma, küçük modellerde gözlenen eğilime benzer bir eğilim gösterir, bu da SGLang’in optimizasyonunun daha büyük modellere de genellendiğini gösterir. Guidance ve LMQL, tensor paralelliği için verimli uygulamaların eksikliği nedeniyle atlanmıştır.

Çok Modlu Modeller Üzerindeki Sonuçlar

SGLang, image ve video primitifleri ile çok modlu modelleri destekler. Bu makaledeki optimizasyonlar, çok modlu modellerle uyumludur. RadixAttention için, girdi görüntülerinin karması, radix ağacında bir anahtar olarak kullanılır, bu da aynı görüntüden gelen token’lerin KV önbelleğinin yeniden kullanımını sağlar. LLaVA-v1.5-7B (görüntü) llava-bench-in-the-wild’de ve LLaVA-NeXT-34B (video) ActivityNet’de çalıştırılmıştır. Bu modeller, diğer temel sistemler tarafından iyi desteklenmediğinden, bu modellerin Hugging Face Transformers’daki orijinal uygulamaları temel olarak kullanılmıştır. Aşağıdaki tabloda gösterildiği gibi, SGLang bu benchmark’lerde %6’ya kadar daha yüksek bir verimlilik sağlar.

Üretim Dağıtımı

SGLang, açık ağırlıklı modelleri sunmak için Chatbot Arena’da dağıtılmıştır. Düşük trafik nedeniyle, her model için yalnızca bir SGLang işçi görevlidir. Bir ay sonra, LLaVA-Next-34B için %52.4 ve Vicuna-33B için %74.1’lik bir RadixAttention önbellek isabet oranı gözlemlenmiştir. Önbellek isabetleri, ortak sistem mesajları, sıkça kullanılan örnek görüntüleri ve çok tur lu sohbet geçmişinden gelmiştir. Bu, Vicuna-33B için ortalama ilk token gecikmesini %1.7 oranında azaltmıştır.

Son Düşünceler

Bu makalede, SGLang’i, karmaşık 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ı içerir. Ön uç, programlamayı basitleştirir, mentre çalışma zamanı, RadixAttention ve sıkıştırılmış sonlu durum makineleri gibi optimizasyonlar sayesinde ç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 kodlama, geri alma-artırma üretim hatları ve çok tur lu sohbet gibi görevleri ele alan state-of-the-art çıkarım sistemlerine kıyasla %6.4’e varan daha yüksek bir verimlilik elde ettiğini 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ış.