1 puan yazan GN⁺ 2023-12-15 | 1 yorum | WhatsApp'ta paylaş
  • 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 --image ve prompt ile görsel açıklamasını standart çıktıya veriyor; işletim sistemine göre Xcode, binfmt_misc, .exe uzantısı gibi hazırlıklar gerekebiliyor
  • Otomasyona eklerken çıktıyı daraltmak için BNF dilbilgisi kısıtları, --temp 0, -n token sınırı kullanılmalı; dosya adı üretiminde öngörülemez çıktılardan ve ENAMETOOLONG hatasından kaçınmak önemli
  • URL özetleme, HTML'yi links ile 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ş .llamafile dosyası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_misc yorumlayıcısı, Windows'ta ise .exe uzantısı gerekebilir

Görsel özetleme: LLaVA'yı standart çıktıya çağırmak

  • llava-v1.5-7b-q4.llamafile varsayılan olarak çok kipli görsel model kullanır; --mmproj '' verilirse bu davranış değişir
  • Görsel --image GRAPHIC bayrağıyla verilir; jpeg, png, tga, bmp, psd, gif, hdr, pic, pnm dosyalarını kabul eder
  • Soru --silent-prompt -p PROMPT biçiminde verilir ve yanıt standart çıktıya gelir
  • Örnek tek satır komut lemurs.jpg için What do you see? sorusunu sorar ve --temp 0 ile deterministik çıktı kullanır
  • GPU offload için -ngl 999 gerekir
  • 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 sed ile boşluklar alt çizgiye çevrilip .jpg eklenir
  • Dosya adı üreten tek satır komut --grammar 'root ::= [a-z]+ (" " [a-z]+)+' ile birlikte -n 16 kullanır
  • -n 16 ile azami üretim token sayısı sınırlandırılmazsa LLM çok uzun metin üretip ENAMETOOLONG hatası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.sh betiği de var ve ~/Pictures üzerinde çalıştırma örneği veriliyor

URL özetleme: links ve Mistral 7B birleşimi

  • Mistral 7B instruct llamafile, links komutunun çıktısını pipe ederek HTML URL özetlemede kullanılabiliyor
  • links bir komut satırı web tarayıcısı ve MacOS'ta genellikle brew install links ile kurulabiliyor
  • Paket yöneticisi olmadığında kullanılabilecek önceden derlenmiş APE ikilisi de sağlanıyor
    • links v2.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 URL ile web sayfası metne dönüştürülüyor
    • sed 's/*/ /g' ile bazı karakterler temizleniyor
    • [/INST] eklenip ardından Mistral llamafile'a -f /dev/stdin ile veriliyor
  • Ö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ır
    • sed 's/ */ /g' ile yinelenen boşluklar azaltılabilir
    • dd 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 --nobrowser ile çalıştırılıyor
  • Ayrı bir terminalde curl ile http://localhost:8080/v1/chat/completions adresine istek gönderiliyor ve dönen JSON Python ile okunaklı biçimde yazdırılıyor
  • İstek JSON'u, model değeri olarak gpt-3.5-turbo verip system·user mesaj dizisini gönderen OpenAI Chat Completions biçimini izliyor
  • Örnek yanıtta, özyineleme kavramını şiirle açıklayan bir assistant mesajı ile completion_tokens, prompt_tokens, total_tokens kullanı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 llamafile akışı 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ıç, Researcher ile Digital Athena arası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 -r ile belirtilen reverse prompt token'ının çıkıp uygun noktada durma olasılığı artar
    • Daha kesin durdurmak için -n 100 ile yanıt 100 token ile sınırlandırılabilir
  • Örnek çıktı, for döngüsüyle src'den dst'ye size kadar kopyalayarak dst döndüren bir memcpy() 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

 
GN⁺ 2023-12-15
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

    • Son 9 ay boyunca Hacker News ve Twitter ana sayfamın %70’i türlü türlü LLM CLI konuşmalarıyla doluydu
      Ş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
    • İşte https://github.com/go-go-golems/geppetto’yu çok kullanıyorum; CLI modu ve TUI sohbet modu var
      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
    • Güzel bağlantılar. https://github.com/npiv/chatblade ve https://github.com/tbckr/sgpt kullanıyordum; LLM+CLI’ın kusursuz uyumlu bir kombinasyon olduğuna tamamen katılıyorum
      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
    • CLI merkezli iş akışlarına yönelik heyecan giderek azalıyor gibi görünüyor
      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/null ile gizlenen error: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop' hatasını veriyor
    Sonra 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üyor
    GPU offloading desteklenmediğine dair bir uyarı da çıkıyor; muhtemelen WSL yüzündendir. Bu Windows makinede GPU programlama yapmıyorum

    • zsh’de komutun başına sh eklemek sorunu çözüyor: sh ./llava-v1.5-7b-q4-main.llamafile
      Bu, zsh ve APE’ye özgü garip bir davranış; https://justine.lol/ape.html adresinde bununla ilgili içerik var
    • Bu bir ZSH hatasıydı ve birkaç ay önce düzeltildi. Görünüşe göre eski bir ZSH kullanıyorsunuz
    • RTX 4070 olan Windows makinemde denemeyi düşünüyordum ama WSL’de GPU kullanılmıyormuş gibi geliyor
      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

    • Sorunun yanıtını bilmiyorum ama bağımsız çalıştırılabilir llamafile-server dosyasını indirip herhangi bir gguf modelle birlikte kullanabileceğini biliyor muydun merak ettim
  • 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

    • Temel özellik --grammar seç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 iyi
      Bunun 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
    • https://news.ycombinator.com/item?id=38464057
    • llamafile Docker kullanmaz. Sadece çalıştırılabilir bir dosyadır
      llamafile’ı indirip chmod +x yaptıktan sonra ./run ile çalıştırman yeterli
      Ancak 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

    • llamafile temelde, kendin derlemen gerekmeyen llama.cpp’ye yakın
      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ç

    • Model diskten memory-mapped olarak eşlenir; bu yüzden onu belleğe okuma işini kernel halleder
      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
    • llama.cpp’nin main’ini çalıştırmakla server + POST HTTP isteği kullanmak arasındaki fark oldukça büyük, ama dünyayı altüst edecek kadar değil
      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

    sudo wget -O /usr/bin/ape [https://cosmo.zip/pub/cosmos/bin/ape-$(uname](<https://cosmo.zip/pub/cosmos/bin/ape-$(uname>) -m).elf  
    sudo chmod +x /usr/bin/ape  
    sudo sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"  
    sudo sh -c "echo ':APE-jart:M::jartsr::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"  
    
  • 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ı yok
    llamafile ve modeli ayrı ayrı indirip llamafile.exe -m llava-v1.5-7b-Q4_K.gguf de denedim ama aynı sorun devam ediyor
    Benzer bir sorun bulamadım ve bana göre antivirüs kaynaklı da değil gibi

    • cmd.exe veya PowerShell’de çalıştırmayı denedin mi merak ediyorum
      --strace ya da mümkünse --ftrace bayrağını verip neler olduğunu kontrol edebilirsin
    • Windows’ta indirilen .llamafile dosyasının adını .exe olarak değiştirmen gerekiyor
    • Windows’ta .llamafile dosyasını .exe olarak yeniden adlandırmak gerekiyor