LLM'ler için Bash tek satır teknikleri
(justine.lol)- Mozilla ile birlikte geliştirilen açık kaynaklı llamafile, bir kabuk aracı gibi kullanılarak yerel LLM'leri tek bir çalıştırılabilir dosya olarak çalıştırıyor ve görsel·web sayfası·API·sohbet·kod·e-posta işlerini Bash tek satır komutlarıyla işliyor
- LLaVA tabanlı
.llamafile, yalnızca--imageve prompt ile görsel açıklamasını standart çıktıya veriyor; işletim sistemine göre Xcode,binfmt_misc,.exeuzantısı gibi hazırlıklar gerekebiliyor - Otomasyona eklerken çıktıyı daraltmak için BNF dilbilgisi kısıtları,
--temp 0,-ntoken sınırı kullanılmalı; dosya adı üretiminde öngörülemez çıktılardan veENAMETOOLONGhatasından kaçınmak önemli - URL özetleme, HTML'yi
linksile metne dönüştürüp ardından Mistral 7B llamafile'a pipe etme yöntemiyle yapılıyor; örnekte 3.774 kelimelik web sayfası 129 kelimelik özete indiriliyor - Yerel OpenAI uyumlu API, terminal sohbet botu, kod tamamlama ve e-posta yazımı da mümkün; ancak kodlama amaçlı LLM'lerin matematik ve doğrulama konularında sınırlı olması nedeniyle onları bilinmeyen konuları keşfetmeye yardımcı araçlar olarak görmek daha güvenli
llamafile'ı yerel bir LLM kabuk aracı olarak kullanmak
- llamafile, Mozilla ile birlikte yürütülen açık kaynaklı bir proje ve LLM'lerin kullanıcının bilgisayarında doğrudan çalışmasını sağlıyor
- Proje GitHub'da 8.3k stars, Hacker News'te 1073 upvotes aldı ve Hackaday'de haber oldu
- Örneklerde kullanılan sürüm 0.8.12 ve yazı bu sürümle nelerin yapılabildiğini gösteriyor
- Başlangıç, Hugging Face'ten önceden derlenmiş
.llamafiledosyasını indirip çalıştırma izni vermekle yapılıyor- Kullanılan model, çok kipli görsel model LLaVA için
llava-v1.5-7b-q4.llamafile - MacOS, Linux, Windows ve BSD'de çalışabiliyor
- Sorun yaşanırsa README'deki Gotchas bölümüne bakılmalı; MacOS'ta Xcode, Linux'ta
binfmt_miscyorumlayıcısı, Windows'ta ise.exeuzantısı gerekebilir
- Kullanılan model, çok kipli görsel model LLaVA için
Görsel özetleme: LLaVA'yı standart çıktıya çağırmak
llava-v1.5-7b-q4.llamafilevarsayılan olarak çok kipli görsel model kullanır;--mmproj ''verilirse bu davranış değişir- Görsel
--image GRAPHICbayrağıyla verilir; jpeg, png, tga, bmp, psd, gif, hdr, pic, pnm dosyalarını kabul eder - Soru
--silent-prompt -p PROMPTbiçiminde verilir ve yanıt standart çıktıya gelir - Örnek tek satır komut
lemurs.jpgiçinWhat do you see?sorusunu sorar ve--temp 0ile deterministik çıktı kullanır - GPU offload için
-ngl 999gerekir - Aynı görsel özetleme komutunun çalışma süresi donanıma göre büyük ölçüde değişebilir
- Mac Studio: 4 saniye, fiyat $8,300, M2 Ultra, 800 GB/s bellek bant genişliği, 60 GPU cores
- Windows PC: 10 saniye, 4 yıllık NVIDIA GeForce RTX 2080 Ti, o dönem Amazon fiyatı $500~$1,000
- Hewlett Packard ProDesk 600 G5: 45 saniye, $1,653, Intel Core i9-9900, 2667 MT/s veya 19.8 GB/s bellek bant genişliği, GPU yok
- Örnek çıktı, yetişkin bir lemurun üç yavrudan ikisini tuttuğunu ve yeşil bir ortamda koruma ile sıcaklık sağladığını anlatıyor
Güvenli dosya adı üretimi: dilbilgisi kısıtları ve token sınırı
- LLaVA ile görsel dosya adı üretirken temel risk, LLM çıktısının genel olarak öngörülemez olmasıdır
--grammar, Backus-Naur Form ile üretilebilecek token'ları sınırlar- Örneğin
root ::= "yes" | "no", çıktıyı yalnızca"yes\n"veya"no\n"olmaya zorlar - Dosya adı örneğinde önce yalnızca küçük harfli kelimeler ve boşluklar üretilir, ardından
sedile boşluklar alt çizgiye çevrilip.jpgeklenir
- Örneğin
- Dosya adı üreten tek satır komut
--grammar 'root ::= [a-z]+ (" " [a-z]+)+'ile birlikte-n 16kullanır -n 16ile azami üretim token sayısı sınırlandırılmazsa LLM çok uzun metin üretipENAMETOOLONGhatasına yol açabilir- Dilbilgisi, modelin doğal üretim biçimiyle bir ölçüde uyumlu olmalıdır
- LLaVA alt çizgili cümleler üretmek üzere eğitilmediğinden, BNF içine doğrudan alt çizgi koymak tutarsız çıktılara neden olabilir
- Küçük harfli çıktı LLaVA'nın kapsamı içindeydi
- JSON gibi web'de çok toplanmış biçimler, dilbilgisi kısıtlarıyla halüsinasyonlu JSON sözdizimi hatalarını azaltan bir guardrail olabilir
- Daha tamamlanmış biçimde
rename-pictures.shbetiği de var ve~/Picturesüzerinde çalıştırma örneği veriliyor
URL özetleme: links ve Mistral 7B birleşimi
- Mistral 7B instruct llamafile,
linkskomutunun çıktısını pipe ederek HTML URL özetlemede kullanılabiliyor linksbir komut satırı web tarayıcısı ve MacOS'ta genelliklebrew install linksile kurulabiliyor- Paket yöneticisi olmadığında kullanılabilecek önceden derlenmiş APE ikilisi de sağlanıyor
linksv2.29, 7.7MB- AMD64+ARM64, Linux+Windows+FreeBSD+NetBSD+OpenBSD için
- URL özetleme tek satır komutu şu akışla çalışıyor
- Önce
[INST]Summarize the following text:yazdırılıyor links -codepage utf-8 -force-html -width 500 -dump URLile web sayfası metne dönüştürülüyorsed 's/*/ /g'ile bazı karakterler temizleniyor[/INST]eklenip ardından Mistral llamafile'a-f /dev/stdinile veriliyor
- Önce
- Örnek hedef olan “Real Programmers Don’t Use Pascal” sayfası 3.774 kelimeden 129 kelimelik özete düşüyor
- Aynı yöntemle metin hakkında rastgele sorular da sorulabiliyor
- Örnekte yazarın zihinsel olarak dengesiz görünüp görünmediği soruluyor ve Mistral, abartı ve hiperbol olduğunu ama bunun 1983 tarihli satirik bir yazı olduğunu dikkate alıyor
--grammar 'root ::= "yes" | "no"'kullanılırsa, betiklerde kullanımı kolay bir YES/NO biçimine sınırlandırılabilir
- Önemli kısıt, Mistral v0.2'nin 32k token bağlam boyutunu aşmamaktır
-width 500, paragrafların yeniden akmasını önleyerek gereksiz satır sonlarını azaltırsed 's/ */ /g'ile yinelenen boşluklar azaltılabilirdd bs=1 count=80000, uzun web sayfalarını kabaca kesmek için son savunma hattı olarak kullanılabilir
Yerel OpenAI uyumlu API
- “server” llamafile, yerelde OpenAI API uyumlu endpoint sunuyor
- Örnek Mixtral 8x7B kullanıyor ve 30 gibibyte'lık modeli çalıştırabilecek güçlü bir GPU gerektiriyor
- Sunucu
mixtral-8x7b-instruct-v0.1.Q5_K_M-server.llamafile --nobrowserile çalıştırılıyor - Ayrı bir terminalde
curlilehttp://localhost:8080/v1/chat/completionsadresine istek gönderiliyor ve dönen JSON Python ile okunaklı biçimde yazdırılıyor - İstek JSON'u,
modeldeğeri olarakgpt-3.5-turboverip system·user mesaj dizisini gönderen OpenAI Chat Completions biçimini izliyor - Örnek yanıtta, özyineleme kavramını şiirle açıklayan bir
assistantmesajı ilecompletion_tokens,prompt_tokens,total_tokenskullanım bilgileri yer alıyor
Terminal sohbet botu: Digital Athena prompt'u
- llamafile, release sayfasındaki sıkıştırılmış ikili dosya indirilerek ya da kaynaktan derlenerek standart bir UNIX komut satırı aracı gibi kullanılabiliyor
git clone,make -j8,sudo make install,man llamafileakışı gösteriliyor
- Bu yaklaşım, Hugging Face'in GGUF weights dosyalarıyla kullanımını kolaylaştırıyor
- Sohbet botu örneği, Facebook'un araştırma amaçlı yayımladığı özgün LLaMA modelini kullanıyor
- Prompt'un, modeli kişileştirmeden akademik bir tonda konuşturacak şekilde kurulması önemli
- İsim, bilgelik ve bilginin Yunan tanrıçası Athena'dan gelen Digital Athena
- Başlangıç,
ResearcherileDigital Athenaarasında bir diyalog biçiminde yapılıyor
- Etkileşimli çalıştırmada
--interactive,--color,--ctx_size 4096,--reverse-prompt 'Researcher:'gibi seçenekler kullanılıyor --temp 0, çıktının deterministik ve yeniden üretilebilir olmasını sağlar- Kullanılmazsa llamafile, 0.8.12'nin rastgelelik düzeyini kullanır ve her seferinde benzersiz yanıt alınır
- Kişileştirilmiş bir sohbet botu istenirse, özgün LLaMA modelinin kullanıcıyı Reddit'teki yabancılar gibi görme yönündeki varsayılan eğilimi nedeniyle bunu yönetmek zor olabilir
Kod tamamlama: Wizard Coder kullanımı
- Wizard Coder llamafile indirilirse Emacs veya Vim'de mevcut satır otomatik tamamlama için kullanılabiliyor
- Örnek model Python odaklı fine-tune edilmiş olsa da C dilinde
memcpy()uygulaması üretiyor - Prompt, İngilizce açıklama olmadan yalnızca Markdown kod bloğu başlangıcı ve fonksiyon imzasını içeriyor
- İngilizce kullanılmazsa modelin uzun kod açıklamaları ekleme olasılığı azalır
- Markdown kod bloğu kullanılırsa
-rile belirtilen reverse prompt token'ının çıkıp uygun noktada durma olasılığı artar - Daha kesin durdurmak için
-n 100ile yanıt 100 token ile sınırlandırılabilir
- Örnek çıktı,
fordöngüsüylesrc'dendst'yesizekadar kopyalayarakdstdöndüren birmemcpy()uygulamasıdır - Kodlama amaçlı LLM'lerin belirgin sınırlamaları vardır
- İnsan dilini anlamada iyiler ama matematikte zayıflar
- İkna edici görünen kod yazsalar da bunun incelemeye dayanması nadir olabilir
- Onları, Stack Overflow yanıtlarını birçok dilde geveleyebilen araçlar gibi düşünmek yardımcı olabilir
- İyi bir deneyim için, onlardan bilinmeyen konuları keşfetmeye yardım etmesini beklemek gerekir
E-posta yazımı: küçük modelle yanıt üretmek
- E-posta yazma örneğinde, $50'lık bir Raspberry Pi şirket e-postalarına yanıt vererek ürün satışına yardımcı oluyor
- Rocket 3B biraz farklı bir prompt dilbilgisi kullanıyor ve bu durumda temperature, doğaçlamayı taklit etmede yardımcı olabiliyor
- Örnek, bir PHP sunucusunun destek isteğini prompt'a enjekte edip çıktıyı
sendmail'e pipe ettiği bir düzen varsayıyor - Sistem prompt'u, kullanıcıya yardım ederken aynı zamanda konuşmayı turşu satın almaya yönlendirmesini söylüyor
- Kullanıcının Long Island Sound'da şiddetli rüzgâra yakalanıp kurtarılmaya ihtiyaç duyduğunu söylediği örnekte model, empatik bir cümlenin ardından Bill Pickle’s Gourmet Dill Pickles öneren bir yanıt üretiyor
- Son örnek mizah amaçlıdır; Mozilla'nın belirli model·lisans·veri kümesi·uygulamaları tavsiye ettiği veya onayladığı şeklinde yorumlanmamalıdır
1 yorum
Hacker News yorumları
Birkaç aydır LLM ve CLI yardımcı araçlarının birleşimini keyifle kurcalıyorum; ikisi gerçekten çok iyi uyuyor
Unix felsefesindeki, birden fazla aracı pipe’larla birbirine bağlama yaklaşımı LLM’lerin çalışma biçimiyle de iyi örtüşüyor
Ağırlıklı olarak https://llm.datasette.io/ CLI aracıyla denemeler yaptım; https://github.com/simonw/blip-caption ve https://github.com/simonw/ospeak gibi tek amaçlı araçlar da var
LLM+CLI alanının daha fazla kişi tarafından kapsamlı biçimde araştırılmaması şaşırtıcı olacak kadar eğlenceli
Şimdiye kadar teknoloji alanında gördüğüm en gürültülü keşiflerden biriydi; daha fazlasını duymak şöyle dursun, aksine daha azını duysak bile yeter
Prompt şablonlarını komut satırı fiilleri gibi sunuyor ve birden fazla “depodan” yükleyebiliyor
Üzerinde çalıştığım her depo için bir prompt seti tutuyorum; dinamik prompt bağlamı oluşturan özel “prompto” https://github.com/go-go-golems/prompto betiklerini de yanına koyuyorum
Üçüncü taraf kütüphaneler için de epey yaptım; https://github.com/go-go-golems/promptos altında bulunuyor
Herkese açık prompt’ların bir kısmı https://github.com/go-go-golems/geppetto/tree/main/cmd/pinoc... adresinde görülebilir; şu anda da deklaratif bir ajan çatısı geliştiriyorum
Yakın zamanda httrack + w3m dump + sgpt images + GPT vision ile 278 bin token’lık belirli bir bilgi tabanı oluşturdum ve bilginin ana hat yapısını koruyan özel bir Perl hack’iyle RAG kurdum
Girdi işleme ve yerel RAG için Unix felsefesine iyi uyan araçlar görüp görmediğinizi merak ediyorum
Ek olarak bakınca, asıl yazının yazarının ilgili konuda epey iş çıkarmış olduğunu ve https://simonwillison.net/2023/Oct/23/embeddings/ adresinde derlediğini gördüm
Şu anda takıldığım nokta, embedding oluşturulacak içeriği chunk’lara ayıran araç zinciri. Kaynak metinde “2.1 Failover” veya “Chapter 8: The dream” gibi konum bağlamını algılaması, 80 karakter genişlikli kaynaklardaki satır sonlarını açması, paragrafları koruyan akıllı bölme yapması vb. iyi olurdu
Bunun başlıca nedeninin VS Code olduğunu düşünüyorum; destek verdiğim geliştiriciler de terminal ve CLI yerine daha çok işaretle-tıkla istiyor
Yakın zamandaki ilgili yazılar
Llamafile – The easiest way to run LLMs locally on your Mac - https://news.ycombinator.com/item?id=38522636 - Aralık 2023, 17 yorum
Llamafile is the new best way to run a LLM on your own computer - https://news.ycombinator.com/item?id=38489533 - Aralık 2023, 47 yorum
Llamafile lets you distribute and run LLMs with a single file - https://news.ycombinator.com/item?id=38464057 - Kasım 2023, 287 yorum
Gerçekten harika. LLM ile görüntü dosyalarının adını açıklayıcı şekilde değiştirme örneği özellikle hoşuma gitti
Windows masaüstündeki NVIDIA GeForce RTX 3080 Ti üzerinde çalıştırdım; çalışır hâle getirene kadar birkaç engelle karşılaştım
WSL, one-liner’da
/dev/nullile gizlenenerror: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop'hatasını veriyorSonra zsh’de
zsh: exec format error: ./llava-v1.5-7b-q4-main.llamafileçıktı; bash’te çalıştırmam gerekti. Başlıkta bash yazıyor gerçi ama zsh’de çalışmaması tuhaf görünüyorGPU offloading desteklenmediğine dair bir uyarı da çıkıyor; muhtemelen WSL yüzündendir. Bu Windows makinede GPU programlama yapmıyorum
sheklemek sorunu çözüyor:sh ./llava-v1.5-7b-q4-main.llamafileBu, zsh ve APE’ye özgü garip bir davranış; https://justine.lol/ape.html adresinde bununla ilgili içerik var
Yalnızca CPU kullanıldığında testin çok yavaş olup olmadığını merak ediyorum
Hugging Face’te hızlıca aratınca TinyLlama civarında, yaklaşık 1B ölçekli birkaç Llamafile görünüyor
Zaten var olan 3 llamafile’a ekleyince toplam 6 ediyor; doğada başka llamafile’lar da var mı merak ediyorum
HN’in llamafile ve modelfile’a (https://github.com/jmorganca/ollama/blob/main/docs/modelfile...) nasıl baktığını merak ediyorum
İkisi de Dockerfile benzeri bir deneyimi akla getiriyor. Modelfile doğrudan Dockerfile gibi görünüyor ama llamafile yazması daha zor gibi duruyor ve gerçek biçimi hemen zihinde canlanmıyor. Terminalde çalıştırılan bir komut dizisi mi merak ediyorum
Teorik olarak neden doğrudan Dockerfile kullanılmadığını da merak ediyorum
--grammarseçeneği; LLM çıktısının logit’lerini kısıtlayarak her tür doğal dil işleme sınıflandırma işi yapan bash betikleri için çok iyiBunun dışında yerel LLM gerekiyorsa ollama kullanıyorum, GPU sunucusu kiraladığımda vllm kullanıyorum, yalnızca en iyi model gerekiyorsa OpenAI API kullanıyorum
llamafile’ı indirip
chmod +xyaptıktan sonra./runile çalıştırman yeterliAncak Docker + llamafile birleşimi de mümkün. https://github.com/ajbouh/cosmos içinde oldukça iyi bir Dockerfile kurulumu var
Ana yazıda kullanılan llamafile ile ollama’nın artılarını ve eksilerini merak ediyorum
Bu yüzden en az çabayla her türlü ayar düğmesini kullanabiliyorsun. Özellikle “server” llamafile’ı indirirsen, bir tarayıcı sekmesinde yerel LLM ayağa kaldırmanın en hızlı yolu oluyor
https://huggingface.co/jartine/llava-v1.5-7B-GGUF/tree/main
llamafile komut satırı chatbot’u olarak da kullanılabilir ama bu amaç için ollama çok daha temiz ve cilalı bir deneyim sunuyor
Doğru anlayıp anlamadığımı kontrol etmek istiyorum. Bir shell betiğinde llamafile’ı çalıştırıp bir dizindeki dosya adlarını değiştirmek gibi kullanırsam, her yeni dosya adı geldiğinde çalıştırılabilir dosyanın açılıp yüklenmesi mi gerekiyor?
O zaman bu bellek her seferinde yüklenip boşaltılıyor mu, yoksa bilmediğim harika bir önbellekleme mi var merak ediyorum
Görsel açıklaması örneğini M1 Pro’da ilk çalıştırdığımda 13 saniye, ikincisinde 8 saniye sürdü; sonraki çalıştırmalar da benzer sürelerde kaldı
Çok fazla dosya işleyeceksem ağırlıkları yalnızca bir kez yükleyip süreç döngüde çalışırken bellekte tutan bir yönteme gerçekten ihtiyaç var gibi
Yine de hâlâ çok faydalı ve ilginç
O RAM’i başka bir şey talep etmediği sürece, ilgili sayfalar komut çağrıları arasında da bellekte önbellekte kalır
128 GB’lık bir iş istasyonunda CPU ile birden fazla 7B model kullansam da hepsi önbellekte kalıyor
8 GB VRAM’li modelde birkaç satırlık tamamlama için kabaca 6 saniyeye karşı 2 saniye civarı; 3090 ve 96 GB RAM’de çıkarımın tamamı GPU’da dönüyor
Gerçekten batch işlem yapıyorsan, tamamlamalar arasında modeli çalışır durumda tutmak kesinlikle daha iyi
Öte yandan server olarak yüklenen modele bağlı kalma dezavantajı var. Gerektikçe yüklersen modeli değiştirip takabilirsin
Bu, çok modlu görsel sorguları için önemli; çünkü diğer modeller projekte edilmiş görsel token’larını anlamıyor
Kurulum adımlarında şu komut var; bunun güvenli olup olmadığını merak ediyorum
Windows 10’da llamafile çalıştırmak için bir şey yapmak gerekiyor mu merak ediyorum
llava-v1.5-7b-q4-server.llamafile’ı git bash’te çalıştırınca “Segmentation fault” ile hemen çöküyor, cmd’de ise hiçbir çıktı yokllamafile ve modeli ayrı ayrı indirip
llamafile.exe -m llava-v1.5-7b-Q4_K.ggufde denedim ama aynı sorun devam ediyorBenzer bir sorun bulamadım ve bana göre antivirüs kaynaklı da değil gibi
cmd.exeveya PowerShell’de çalıştırmayı denedin mi merak ediyorum--straceya da mümkünse--ftracebayrağını verip neler olduğunu kontrol edebilirsin.llamafiledosyasının adını.exeolarak değiştirmen gerekiyor.llamafiledosyasını.exeolarak yeniden adlandırmak gerekiyor