LLM teknolojileri daha fazla yaygınlaştıkça ve ekosistem olgunlaşmaya başladıkça, kuruluşlar LLM teknolojilerini kullanmanın sınırlarını ve maliyetlerini anlamaya başlıyor. Başlangıçta LLM teknolojilerinin uygulanması konusunda hevesli olan birçok kuruluş, merkezi girişimleri terk etti ve bunun yerine ChatGPT ve Claude gibi hizmetleri iş akışlarına dahil etmek için merkezi olmayan çabaları teşvik etme stratejisini izledi.
Bu fenomenin birkaç nedeni var. Yüksek Lisans uzmanlığının eksikliği, MLOps gereksinimleri ve özel GPU altyapısına güvenmek, büyük ölçekli yapay zeka girişimlerinin uygulanmasının önündeki engellerdir. Ancak bunlardan en çetrefilli konu GPU'lara olan bağımlılıktır.
Bu makalede GPU bağımlılığının yarattığı belirli zorlukları tartışacağız, potansiyel bir çözümü araştıracağız ve bu alanda çalışan çığır açan şirketlerden birinden heyecan verici bir örneğe bakacağız.
GPT-4, Llama 2 ve Claude gibi halka açık ve yüksek performanslı modellerin çoğu, son derece uzmanlaşmış GPU altyapısına dayanır. Piyasada bulunan en büyük modellerden biri olan GPT-4'ün 8 adet A100 GPU'dan oluşan bir küme üzerinde çalıştığı biliniyor. Llama 2'nin çok daha küçük olan 70B modelinin makul bir hızda çalışması için hâlâ en az A40 GPU gerekiyor.
Bu düzeydeki GPU gereksinimi, pratik olarak bu modelleri yerel olarak çalıştırma olasılığını ortadan kaldırır - bir A100 GPU'nun, bir satıcı bulabileceğinizi varsayarsak, maliyeti 25.000 $'a yakındır. GPU'ları aldıktan sonra sunucuları kurmak ve bakımını yapmak için özel becerilere ihtiyacınız vardır. Çok az kuruluş LLM teknolojilerini denemek için böyle bir harcama yapmaya istekli olacaktır.
Bu sorunu çözmek için birçok startup ve bulut sağlayıcısı kapsamlı PaaS teklifleri geliştirdi. Geçmiş makale ve projelerde kullandığım Replicate gibi bazı hizmetler, kullanıcıların GPU sunucuları kiralamasına ve kullanılan işlem süresi için ödeme yapmasına olanak tanıyor. OpenAI ve Anthropic gibi diğer sağlayıcılar, modellerini token başına API olarak sunarak altyapı karmaşıklıklarını daha da ortadan kaldırıyor. Ancak bu hizmetler, verilerin harici bir ağa gönderilmesini gerektirir; bu da, gizlilik bilincine sahip kuruluşlar için bu hizmetlerin kullanımını başlangıç dışı hale getirir. Ek olarak, bu hizmetlerin çoğu, GPU kullanımının kullanılabilirliği aşması nedeniyle talep artışları sırasında kesintiler yaşıyor ve bu da onları üretim açısından kritik iş yükleri için güvenilmez seçenekler haline getiriyor.
Ek olarak, GPU süresi, ne kadar ücretlendirilirse alınsın, büyük bilgi işlem görevleri için pahalıdır; sonuçta bu GPU'lara sahip olan ve onları işleten şirketlerin yatırımlarının geri dönüşüne ihtiyacı vardır. Bu maliyetler deneysel kullanım durumları için neredeyse göz ardı edilebilir olsa da, ticari kullanım durumları genellikle büyük bağlamların yerleştirilmesini, ince ayarların veya çoklu çekim örneklerinin yapılmasını gerektirir. Bu maliyetler, özellikle büyük veri kümelerine sahip veya büyük ABD firmalarının mali kaynaklarına sahip olmayan kuruluşlar için benimsemenin önünde önemli bir engel teşkil etmektedir.
Önceki bir makalede, parametre sıkıştırmayı GPU'lara bağımlılığı azaltmaya yönelik bir strateji olarak araştırdık. Bugünkü yazımızda kuantizasyon adı verilen başka bir heyecan verici tekniği keşfedeceğiz.
Ancak araştırmaya dalmadan önce kuantizasyon hakkında biraz bilgi edinmek isteyebiliriz.
Bu bölümde kuantizasyonun temellerini kısaca ele alacağız. Ancak, güçlü LLM'leri bilgisayarınızda yerel olarak çalıştırmanın bir yolunu arıyorsanız, şimdilik bu bölümü atlayıp daha sonra geri dönebilirsiniz. Bugün teknolojisini kullanacağımız şirket olan LLMWare, tüm bunların ardındaki en incelikli C/C++ uygulamalarına girmek zorunda kalmadan nicelenmiş modellere başlamanıza olanak tanıyan bazı harika araçlar geliştirdi.
Niceleme, daha düşük hassasiyetli sayısal türleri kullanarak bir LLM'yi çalıştırmanın hesaplama ve bellek gereksinimlerini azaltmayı amaçlayan bir tekniktir. Llama, Falcon ve Alpaca gibi birçok popüler açık kaynaklı model, temel çerçeve olarak PyTorch'u kullanır. Varsayılan olarak PyTorch modelleri 32 bit kayan noktalar kullanır; bu, tek bir parametrenin GPU belleğinde 32 "bit" yer kapladığı anlamına gelir. Niceleme, bu parametreleri 16 bitlik kayan noktalarla, 8 bitlik tam sayılarla ve hatta 4 bitlik tam sayılarla değiştirmeyi amaçlamaktadır. Başarılı niceleme, hesaplama hızında çarpıcı gelişmelere ve bellek kullanımında azalmalara yol açar; bu da büyük modellerin alt düzey GPU'larda, yerleşik grafik yongalarında ve hatta CPU'larda çalıştırılabileceği anlamına gelir. Bu fikir bir süredir ortalıkta dolaşıyor; teknoloji olgunlaştıkça PyTorch'un kendisi 16 bitlik kayan noktalar ve model derlemeleri için destek ekledi, ancak PyTorch çerçevesindeki erken tasarım kararları nedeniyle ilerleme yavaş oldu.
Bu noktada şunu düşünmek doğaldır: Bu, modelin doğruluğunu ciddi şekilde bozmaz mı? Kısa cevap evet, ancak bunu yalnızca dikkatsizce yaparsanız. Her optimizasyon, doğası gereği ödünleşimlerle birlikte gelir, ancak bazı özel tekniklerle araştırmacılar, yüksek düzeyde nicelenmiş modellerden inanılmaz derecede istikrarlı performans elde etmeyi başardılar. Aşırı teknik ayrıntılara girmesek de, şu anda kullanılan en yaygın stratejilerin genel hatlarıyla üzerinden geçelim. Daha fazlasını öğrenmek istiyorsanız HuggingFace'in kılavuzundan bu konuda daha fazla bilgi edinebilirsiniz.
Kalibre edilmiş nicemleme
Kuantizasyon işlemi sırasında model üzerinden bir kalibrasyon veri seti çalıştırılır. Her parametrenin değeri kaydedilir ve aralık, parametrelerin nasıl nicelendirileceğini belirlemek için kullanılır. Kalibrasyon veri setinin modelin karşılaşacağı girdileri temsil ettiğini varsayarsak, bu, ortaya çıkan modelin doğruluğunun artmasıyla sonuçlanır.
Niceleme Farkındalığı
Kalibre Edilmiş Niceleme eğitimden sonra gerçekleşirken, Nicelemeye Duyarlı Eğitim, eğitim sırasında modeli optimize etmeye çalışır. Model eğitilirken, aktivasyonlar, muhtemelen kuantizasyon süreci tarafından ortaya çıkacak hataları simüle eden bir "sahte kuantizasyon" yoluyla gerçekleştirilir. Model daha sonra hatalara uyum sağlayabilir ve bu da potansiyel bozulmalara özel olarak uyum sağlayabilen daha sağlam bir modelle sonuçlanır.
PyTorch niceleme ve optimizasyonları uzun süredir çerçeve tasarımı nedeniyle engellenmiş olsa da, yeni iki açık kaynak teknolojisi bu engelleri aştı ve nicemleme teknolojilerini genel halk için çok daha erişilebilir hale getirdi. Aşağıda kısaca bunları ele alalım.
Lama.cpp
Llama.cpp, Georgi Gerganov'un Llama modelini C/C++'a taşımaya yönelik bir projesiydi. Bu, PyTorch'un getirdiği karmaşıklıktan kurtuldu ve yerel uygulama, nicelemenin doğrudan uygulanmasına izin verdi. Bu nedenle, ortaya çıkan model, 4 bit'e kadar tamsayı nicelemeyle çalışabilir ve yüksek parametre sayılı Lama modellerinin özel bir GPU olmadan çalıştırılmasına olanak tanır.
Proje o zamandan beri topluluk tarafından Falcon ve Mistral gibi popüler modeller de dahil olmak üzere bir dizi açık kaynaklı modeli içerecek şekilde genişletildi.
GGUF
GGUF, Llama.cpp'nin model bilgilerini depolamak ve aktarmak için kullanılan dosya formatıdır. Nicelenen modeller, son kullanıcı tarafından yüklenip çalıştırılabilmesi için bu formatta saklanır. GGUF, GGML'nin devamı olan formattır ve daha fazla genişletilebilirlik, geriye dönük uyumluluk ve kararlılık sağlarken aynı zamanda hızlı gelişime de izin vererek GGML'yi geliştirmeyi amaçlamaktadır.
Evrensel bir dosya formatının geliştirilmesi, açık kaynak topluluğunun Llama.cpp'yi diğer modelleri optimize edecek şekilde genişletmesinin kapısını açtı ve TheBloke ve LLMWare gibi yenilikçiler son birkaç aydır popüler açık kaynak modellerini minyatürleştirmek için çalışıyorlar.
Bugünkü örnekte, özel RAG iş akışlarını hızlı bir şekilde oluşturmak için uygun araçlar sağlayan LLMWare tarafından sağlanan açık kaynak kitaplıkları ve nicelenmiş modelleri kullanacağız.
Hukuk ve finans endüstrilerinde uzmanlaşmış üretken bir yapay zeka şirketi olan LLMWare, nicemleme topluluğunda aktif olarak yer almaktadır. Daha önce de yazdığım gibi, mahremiyet bilincine sahip sektörlere odaklanmaları, onları minyatürleştirme teknolojilerinde denemeler yapmak ve yenilikler yapmak için doğal bir aday haline getiriyor.
Daha önce, sözleşme incelemesi ve mali analiz gibi özel görevler için 1 ila 3 milyar parametreli modellerden inanılmaz performansı sıkıştıran RAG için optimize edilmiş BLING modelleri hakkında yazmıştım. Bu tür parametre sayımlarına sahip açık kaynaklı modellerin çoğu yalnızca oyuncak sorunları için faydalı olma eğilimindeyken, LLMWare, bu modelleri dar hedefli görevler için eğiterek üretime hazır performans üretebilmektedir. Bu minyatürleştirilmiş modeller daha sonra harici bir GPU olmadan çalışabiliyor ve bu da daha fazla gizlilik ve ölçeklenebilirlik sağlıyor.
Dragon, BLING kuzenlerinin daha güçlü versiyonları olarak düşünülebilecek bir LLM koleksiyonudur. Dragon'un asıl amacı, aynı talimat ince ayar tekniklerini kullanarak daha yüksek parametreli bir model eğitmek, daha fazla performansa ihtiyaç duyan ve daha düşük seviye GPU'lara erişimi olan kullanıcılara bir seçenek sunmaktı.
Eklenen parametre sayısı, daha büyük bağlam pencerelerinden yararlanabilen ve daha karmaşık çıktılar üretebilen daha güçlü modellerin ortaya çıkmasına neden oldu, ancak kullanıcının GPU'ya yerleşik bir dizüstü bilgisayar veya GPU takılı bir bulut bilgi işlem kapsayıcısı gibi daha özel bir donanıma sahip olmasını gerektirdi. Ancak yine de son derece büyük modellere kıyasla, kıt A40 veya A100 GPU'lara erişim için beklemeyi gerektirecek bir gelişmeyi temsil ediyorlardı.
Yukarıdakiler göz önüne alındığında, nicelemenin LLMWare'in yapay zeka araçları paketine neden önemli bir destek sağladığını anlamak kolaydır. Kuantizasyon ile bir kullanıcı Dragon katmanlı modelleri BLING modelleriyle aynı ortamda çalıştırabilir ve bu da ticari bilgisayarlarda çok daha güçlü analizlere olanak tanır.
Geçtiğimiz ay boyunca, LLMWare birçok Dragon modelinin sayısallaştırılmış versiyonlarını yayınladı. Bugün LLMWare'in Llama üzerine kurduğu Dragon modelini yasal analiz RAG problemi ile değerlendirip benzer bir BLING modeliyle karşılaştıracağız. İlgilenenler diğer modelleri de keşfedebilirler; Mistral tabanlı bir model ve Yi Tabanlı bir model, bu yazının yazıldığı sırada LLMWare'de mevcuttu. Ek olarak LLMWare , gguf modellerinin PyTorch tabanlı modellerle sorunsuz bir şekilde değiştirilmesine olanak tanıyan ctransformers kitaplığıyla sıkı entegrasyonları sayesinde Llama.cpp modellerinde çalıştırma çıkarımlarını kolaylaştırdı.
Bu deney için M1 Çipli bir Macbook Air kullanacağız, yani bu alıştırma için yalnızca yaygın olarak bulunabilen donanımları kullanacağız.
Önceki yazımda mevzuat araştırması odaklı bir RAG uygulaması oluşturduğumuzu unutmayın. Birçok büyük mevzuatı hızlı bir şekilde aramak için vektör aramayı kullandık, Nitelikli Fırsat Bölgesi Ortaklığı İlgisi hakkındaki sorumuzla ilgili bölümleri bulduk ve soruyu bir BLING modeli aracılığıyla inceledik. Bugünkü yazımızda aynı soruyu LLMWare'in nicelenmiş Dragon modeli üzerinden yürüteceğiz ve BLING modellerinden daha iyi performans gösterip göstermediğini belirleyeceğiz.
Model karşılaştırmasına odaklanmak ve gereken ön bilgi miktarını azaltmak için, PDF ayrıştırma ve vektör arama işlemlerinin çoğunu manuel olarak yapacağız. Bunun, sorunu model için yapay olarak zorlaştırma gibi ek bir faydası da var - LLMWare'in varsayılan yerleştirme araması, kaynak materyali yaklaşık 1000 jetona böler, ancak ayrıştırmayı manuel olarak yapmak, bağlamı yaklaşık 3000 jetona kadar çıkarmamıza olanak tanır. Bu, Dragon ve BLING modelleri arasındaki farkı net bir şekilde göstermemize yardımcı olacaktır.
Ancak LLMWare'deki son makalemdeki kurulum adımlarını takip ederek araçlarından yararlanmak istiyorsanız LLMWare ekosisteminin geri kalanıyla kolayca entegre olabilmelisiniz. Aslında, BLING modellerinin adını bu makaledeki nicelenmiş Dragon modeliyle değiştirirseniz her şey sorunsuz bir şekilde çalışmalıdır.
Daha fazla uzatmadan başlayalım!
Öncelikle gerekli bağımlılıkları içe aktaralım:
import sklearn import sklearn.metrics # for cosine similarity from llmware.prompts import Prompt import time import os from openai import OpenAI from PyPDF2 import PdfReader client = OpenAI() # the library now loads the key automatically as an environment variable.
Artık PDF'yi yükleyebiliriz. Önceki örnekte birçok büyük mevzuatı yükledik ancak bugün için yalnızca 2017 tarihli Vergi Kesintileri ve İstihdam Yasasının PDF versiyonuna odaklanacağız.
reader = PdfReader([path to PDF of tax cuts and jobs act])
Artık her sayfa için yerleştirmeleri oluşturabiliriz:
embeddings = [] for pg in reader.pages: text = pg.extract_text() embeddings.append(client.embeddings.create( input=text, model="text-embedding-ada-002" ).data[0].embedding)
Ayrıca soracağımız soru için yerleştirmeleri de oluşturalım:
question = 'What is a qualified opportunity zone partnership interest?' q_embed = client.embeddings.create( input=question, model="text-embedding-ada-002" ).data[0].embedding
Elimizde gömme ile bir vektör araması yapabiliriz. Arama alanımız küçük olduğundan bunu manuel olarak yapabiliriz.
cos_sim = [(idx, sklearn.metrics.pairwise.cosine_similarity([e], [q_embed])[0][0]) for idx, e in enumerate(embeddings)]
Artık en alakalı sayfayı alabiliriz (sonuçları doğrulamak istiyorsanız bu, dizin 132 veya sayfa 133'tür):
most_relevant = sorted(cos_sim, key=lambda x: x[1], reverse=True)[0][0]
Ve böylece en önemli aşamaya geldik. Nicelenmiş Llama Dragon modeliyle bir LLMWare Prompter nesnesini başlatacağız. Prompter sınıfı burada anahtardır çünkü bizim için istem mühendisliğini yönetir ve istemimizin Dragon'un eğitim verilerinin yapısıyla tutarlı olmasını sağlar. Prompt sınıfı aynı zamanda llamacpp bağlamayı da otomatik olarak yönetir, böylece nicelenmiş Dragon modelini tam olarak diğer modeller gibi kullanabilirsiniz.
model_name = "llmware/dragon-llama-7b-gguf" prompter = Prompt().load_model(model_name) response = prompter.prompt_main(question, context='\n\n'.join([reader.pages[132].extract_text()]), prompt_name="default_with_context", temperature=0.3)
Biraz bekleyin, işlev çağrısının geri döndüğünü görmelisiniz. Şimdi sonuçları yazdırın:
print(response['llm_response'])
Ve aşağıdakine benzer bir şey görmelisiniz:
• A capital or profits interest acquired by the qualified opportunity fund after December 31, 2017, from the partnership solely in exchange for cash; •As of the time such interest was acquired, the partnership was a qualified opportunity zone business (or, in the case of a new partnership, it was being organized for purposes of being a qualified opportunity zone business); •During substantially all of the qualified opportunity fund's holding period for such interest, the partnership qualified as a qualified opportunity zone business.
Bu oldukça iyi bir cevap!
Karşılaştırma için, bir BLING modelinin aynı problem üzerinde nasıl performans göstereceğini görelim. Bekleyebileceğimiz sorunlardan biri, büyük bağlam boyutunun daha düşük parametreli bir modeli "boğabilmesi" ve daha az bilgilendirici bir cevaba yol açabilmesidir. Önceki deneylerimde, kırpılmış lama 2.7b bu sorun için en iyi performans gösterenlerden biriydi, bu yüzden bunu BLING modellerinin temsilcisi olarak kullanmaya karar verdim.
model_name_2 = "llmware/bling-sheared-llama-2.7b-0.1" prompter2 = Prompt().load_model(model_name_2) response = prompter2.prompt_main(question, context='\n\n'.join([reader.pages[132].extract_text()]), prompt_name="default_with_context", temperature=0.3)
Biraz işlemden sonra buna benzer bir şey görmelisiniz.
A qualified opportunity zone partnership interest is a capital or profits interest in a domestic partnership if such interest is acquired by the qualified opportunity fund after December 31, 2017, from the partnership solely in exchange for cash.
Yanıt hala iyi ancak Dragon modelinin yakaladığı bazı detayları gözden kaçırıyor. Özellikle cevap, elde tutma süresi gerekliliğini ve yeni iş durumunu gözden kaçırıyor. Bu, düşük parametreli modellerin daha büyük bağlamları işlemedeki zorluklarına ilişkin beklentilerimizle uyumludur. İlgilenen okuyucular, daha düşük parametreli modeller kullanarak veya verilen bağlamın boyutunu artırarak bu deneyi genişletebilirler. Etkinin giderek daha belirgin hale geldiğini göreceksiniz, ardından model kısa, bozuk bir yanıt verecektir.
Bu deneyden, nicelenmiş Dragon modellerinin, modelin doğruluğundan gözle görülür bir şekilde ödün vermeden, amaçlanan kullanım durumları için daha düşük parametreli modellerden daha iyi performans gösterebildiği açıkça anlaşılmalıdır.
Ve bununla birlikte, gerçek dünyadaki bir kullanım durumunu çözmek için nicelenmiş bir model kullandık ve bu süreçte performans özelliklerini öğrendik!
Bugün, heyecan verici LLM niceleme alanını araştırdık ve LLMWare gibi şirketlerin kendi uzmanlaşmış dil modellerini geliştirmek için bu gelişmelerden nasıl yararlandığına baktık. Daha önce de tartıştığım gibi minyatürleştirme, yapay zeka teknolojilerinin yaygın şekilde benimsenmesine yönelik en umut verici yollardan birini temsil ediyor. Yapay zeka alanındaki yenilikçiler, uzmanlaşma, ince ayar ve nicelemeyi birleştirerek gerçek dünya sorunlarını çözen ölçeklenebilir ve performanslı modeller oluşturabilir.
LLMWare'in RAG çerçevesini Github'da ve DRAGON ve BLING modellerini LLMWare'in Hugging Face deposunda bulabilirsiniz.
Bu arada, gelişen dünyada eğitimde devrim yaratmak için dil yapay zekasını ve minyatürleştirmeyi kullanmayı amaçlayan heyecan verici bir proje üzerinde çalışıyorum. Dünya çapında inanılmaz aktivistler ve eğitimcilerle çalışıyoruz ve küresel dijital uçurumu kapatmak için çalışıyoruz. Projem hakkında daha fazla bilgi edinmek veya yalnızca LLM alanındaki heyecan verici gelişmeler hakkında konuşmak istiyorsanız lütfen Github veya LinkedIn üzerinden bana ulaşmaktan çekinmeyin.