1 puan yazan GN⁺ 2023-07-24 | 1 yorum | WhatsApp'ta paylaş
  • llama2.c, Llama 2 LLM mimarisini PyTorch ile eğiten ve basit bir C dosyası olan run.c ile çıkarım yapan “fullstack” eğitim ve çıkarım çözümüdür
  • Temel odak minimalizm ve sadeliktir; Llama 2 mimarisini hardcode eden ve bağımlılığı olmayan tek bir saf C çıkarım dosyasından oluşan eğitim amaçlı bir uygulamadır
  • Çok küçük LLM’lerin bile alan yeterince daraltıldığında güçlü performans gösterebileceği bakış açısından, TinyStories tabanlı örnek modeller sunar
    • 15M parametreli model yaklaşık 60 MB indirmedir ve make run sonrası ./run stories15M.bin ile çalıştırılabilir
    • 42M ve 110M parametreli modeller de sunulur; 110M modelin GPT-1 ile aynı boyutta olduğu belirtilir
  • Meta’nın Llama 2 modelleri de sinir ağı mimarisi aynı olduğu için çıkarımda kullanılabilir; ancak checkpoint’lerin Meta yönergelerine göre alındıktan sonra export.py ile llama2.c formatına dönüştürülmesi gerekir
    • Mevcut run.c yalnızca fp32 çıkarımı yaptığı için 7B’den büyük modelleri verimli şekilde yüklemek büyük olasılıkla zordur
    • 13B ve üzeri, pointer aritmetiğinde integer overflow nedeniyle şu anda çalışmaz ve henüz düzeltilmemiş durumdadır
  • int8 kuantizasyon çıkarımı runq.c içinde uygulanmıştır; Q8_0 yöntemiyle matmul’a katılan ağırlıklar kuantize edilir, aktivasyonlar da çalışma zamanında dinamik olarak kuantize ve dekuantize edilir
    • Llama 2 7B fp32 export’u 26 GB’lık bir dosya üretir; version 2 quantized export ise 6,7 GB’lık bir dosya üretir
    • Yazarın ortamında OpenMP 64 thread ile fp32 4,6 tok/s, int8 ise 14 tok/s hızında çalışmıştır; checkpoint boyutu 4 kat azalmış ve hız yaklaşık 3 kat artmıştır
  • Kullanım biçimi C çıkarımını çalıştırma, prompt girme, temperature ve top-p örnekleme kontrolü, chat modunu çalıştırma ve özel tokenizer belirtmeden oluşur
    • Örnek çalıştırma ./run stories42M.bin -t 0.8 -n 256 -i "One day, Lily met a Shoggoth" biçimindedir
    • Chat modeli ./run llama2_7b_chat.bin -m chat gibi -m chat bayrağıyla çalıştırılır
    • Özel tokenizer, tokenizer.py ile .bin formatında dışa aktarıldıktan sonra -z bayrağıyla belirtilir
  • Hugging Face’te Llama 2 mimarisini kullanan modeller, export.py içindeki --hf bayrağıyla .bin dosyası olarak dışa aktarılabilir
  • Eğitim akışı TinyStories’in indirilmesi ve önceden tokenize edilmesi, train.py çalıştırılması, modelin export edilmesi ve ardından C çıkarımına geçilmesi şeklindedir
    • Varsayılan TinyStories örneği şu anda sunulan tek veri kümesi örneğidir
    • Özel tokenizer eğitimi sentencepiece kullanır ve örnek olarak --vocab_size=4096 ayarı kullanılır
  • Performansla ilgili build’ler make run, make runfast, make runomp olarak ayrılır; OpenMP build’i matmul ve attention içindeki #pragma omp parallel for ifadelerini etkinleştirerek döngü işlerini birden çok işlemciye böler
  • Platform build yönergeleri Windows, Centos 7, Amazon Linux 2018 ve Mac için sunulur
    • Windows’ta build_msvc.bat veya make win64 kullanılır
    • Centos 7 ve Amazon Linux 2018’de make rungnu veya make runompgnu kullanılır
    • Mac’te OpenMP build’i için brew ile clang kurulduktan sonra make runomp CC=/opt/homebrew/opt/llvm/bin/clang kullanılır
  • Testler için pytest ve C testi make testcc sunulur; test_all.py, C ve Python’da 200 adımlık forward çalıştırıp bilinen beklenen çıktıyla karşılaştırır
  • Projenin hedefi, iki okunabilir .py eğitim kodu dosyası ve C çıkarım kodundan oluşan basit bir referans uygulamayı korumaktır; karmaşık framework’leri veya çok sayıda seçeneği hedeflemez
  • Lisans MIT’dir

1 yorum

 
GN⁺ 2023-07-24
Hacker News yorumları
  • HN’de çıktığını görmek güzel :) Orijinal checkpoint, MacBook Air M1 üzerinde -O3 ile derlendiğinde beklediğimden çok daha hızlı, 100 tok/s civarında çalışıyor; bu yüzden şimdi daha büyük 44M modeli eğitiyorum
    Yine de etkileşimli çalıştırılabilir gibi görünüyor; hatta belki 7B Llama modelinin bile ulaşılabilir olabileceği hissi var

    • nanoGPT’yi biraz değiştirip TinyStories’in GPT-4 tarafından üretilmiş 2 GB verisiyle 12M bir modeli ön eğitime tabi tuttum; sonuçlar epey şaşırtıcıydı
      Ardından Wikipedia ile biraz uyarlayınca, düzleştirilmiş n-gram modelinden çok daha akıllı ve çok daha küçük, makul görünen saçmalık üreten bir şeye dönüştü. Küçük LLM’lerin birçok alanda ana akım olacağını düşünüyorum; sıradaki hedefim Llama2 7B’yi 10~100M boyutuna düşürürken ciddi şekilde aptallaşmasını engellemek
    • Her zamanki gibi çalışma ilham verici. Acemi sorusu: Gösterişli bir GPU’su olmayan sıradan bir Linux sunucuda, hobi amaçlı bir web uygulamasına bağlanabilecek makul boyutta bir LLM çalıştırmanın en pratik yolu nedir merak ediyorum
      Linode gibi yerlerde GPU instance kiralamak normal bir web uygulaması sunucusundan çok daha pahalı; bunun tamamen imkânsız bir alan mı olduğunu, yoksa bu yaklaşımın ya da başka yöntemlerin gerçekçi bir yol olup olmadığını bilmek isterim
    • Küçük Llama-2 modelleri ile küçük GPT-2 modellerinin göreli kalite/performansı hakkında ilk izlenimlerin var mı merak ediyorum
    • Python yerine saf C trainer da yapılabileceğini düşünüyor musun merak ediyorum
    • Bu modelleri evdeki donanımda mı, M1’de mi yoksa bulutta mı eğittiğini merak ediyorum
  • llama.cpp ile tanınan Georgi Gerganov’un Emscripten ile tarayıcıda çalıştırdığı bir sürüm var: https://ggerganov.com/llama2.c/
    Devam eden Twitter dizisi: https://twitter.com/ggerganov/status/1683174252990660610
    Hem orijinal çalışma hem de bu çalışma gerçekten harika; çok küçük bir model kullanan bir kavram kanıtına yakın ama yerel öncelikli LLM özellikle ilgi çekici. Yerel çıkarımla web uygulaması yapılabileceği fikri hoşuma gidiyor
    Optimizasyon, daha küçük model araştırmaları, kısmi indirme ve WebGPU kullanımına kadar ilerlerse, özel ve yerel LLM tabanlı uygulamalar geliştirmenin yeni bir yolunun başlangıcı olabilir. Üst seviye GPU’lardan oluşan büyük kümelerde barındırılan LLM’lerle aynı yeteneklere ulaşması zor olur ama bu yaklaşımın açacağı birçok kullanım senaryosu var

    • İlk bağlantıda epey tuhaf bir çıktı aldım. Başta makul bir masal gibi başlıyor ama yazım hataları artıp saçmalığa çöküyor; sonra yabancı diller ve teknik/programlama terimleri karışarak geliyor
      Örneğin “Once upon a time...” diye başlayıp Lily ile Timmy’nin hikâyesi gibi görünürken, “Butterfly would pauseWhy”, “TextField”, querySelector, HttpRequest ve çeşitli dillerden parçalar birbirine karışarak tamamen bozuk bir çıktıya dönüşüyor
  • Merak edenler için bir Rust sürümü de var. Release modunda yaklaşık 106 tokens/second veriyor
    https://github.com/garrisonhess/llama2.c/blob/517a1a3e487f31...

    • Başka bir Rust sürümü daha var. Geçen aydan beri üzerinde çalışılan candle ML kütüphanesini kullanıyor ve tarayıcıda da çalışabiliyor: https://laurentmazare.github.io/candle-llama2/index.html
      Web dışı sürüm GPU’yu tamamen destekliyor ama hiç minimalist değil
    • Rust’ta sık görüldüğü gibi, bazen sırf mümkün diye mevcut bir şeyi aynen yeniden yazıp hiçbir fayda sağlamayan örnekler oluyor
      Bazen de projeyi iyileştirmeye yönelik topluluk çabasını dağıtabiliyor
  • Bunun ne kadar cesur bir hamle olduğunu pek çok kişinin anladığını sanmıyorum
    Andrej, OpenAI(MSFT)’te yüksek maaş almasına rağmen Apple’a, Facebook’a ve daha önemlisi açık kaynak hareketine yardım ediyor. Yine de onu dışarı itmeleri zor olur; çünkü o zaman doğrudan Tesla’ya ya da xAI’a gidebilir

  • Llama-2’nin yaratıcı işler için kullanılamayacak kadar ağır güvenlik filtrelemesi yaptığını hissediyorum: https://i.imgur.com/GFY0wSL.png

    • Kişisel olarak, “güvenlik” adına filtrelemenin 180 derece tersine dönüp nefret dolu ya da olumsuz stereotipleri pekiştirebilecek kadar ağır olduğunu düşünüyorum: https://i.imgur.com/xkzXrPK.png ve https://i.imgur.com/3HQ8FqL.png
      Ancak bu olgu, Llama2-70b-chat TGI Hugging Face’te ikinci mesaj olarak gönderildiğinde bir ölçüde yeniden üretilebildi; prompt biçiminde tuhaf bir şey olup bu davranışa yol açıyor olabilir. Modeli kendim çalıştırıp daha fazla araştırma yapma imkânım henüz olmadı
    • Ön eğitimli model varsa instruct/chat modeli kullanmamak daha iyi
      Chat/instruct modellerinin üçüncü taraf kullanıcılara dağıtımının kolay olması, prompt’larının basit olması ve güvenlik önlemleri içermesi gibi avantajları var; ama doğrudan kullanımda ön eğitimli modellerden gerçekten çok daha kötü kalıyorlar. Bu noktada Llama 2, OpenAI’a göre avantajlı olabilir; çünkü OpenAI GPT-3 ön eğitimli modellerini kaldırmış ve bundan sonra yalnızca chat modelleri sunacak gibi görünüyor
    • Hayal edince şöyle oluyor: Casca ve Brutus, Caesar’ı bıçaklamak yerine, gücünü kötüye kullanma ihtimali ve diktatörce eğilimleri hakkında onunla nazikçe yüzleşiyor
    • Aşırı filtreleme tüm “llama-2” için değil, Llama-2 chat için geçerli
    • “Etik AI” insanlarını uzaklaştırmak gerekiyor. Giderek gerçekten can sıkıcı oldukları açık hâle geliyor
      Güvenlik makası istemiyorum. Kendi sunucularında çalışan şeyleri sınırlamaları sorun değil; ama kendi bilgisayarımda istediğim gibi değiştiremeyeceğim ve kullanamayacağım bir model vermemeliler
  • Andrej’in daha ayrıntılı paylaştığı içerik burada: https://twitter.com/karpathy/status/1683143097604243456?s=46...

  • Bu tür şeylerle ilgileniyorsanız, not olarak: bu kod WASI SDK ile temiz biçimde derleniyor ve Wasm runtime’larında değişiklik gerektirmeden çalışıyor

  • Bir sinir ağını çalıştırmak için ne kadar bellek gerektiğini merak ediyorum
    Diskten yalnızca ilk iki katmanı okuyup tüm düğümlerin aktivasyon değerlerini hesapladıktan sonra birinci katmanı atmak, ardından üçüncü katmanı okuyup yeniden hesapladıktan sonra ikinci katmanı atmak şeklinde ilerlemek yeterli mi? Öyleyse belleğin yalnızca iki katmanı tutacak kadar olması yeterli mi diye merak ediyorum

    • Hugging Face’ten TheBloke, popüler modellerin nicemlenmiş sürümlerine göre bellek gereksinimlerini belgelemiş: https://huggingface.co/TheBloke
      Özetle maksimum RAM, nicemleme yöntemine göre değişiyor; kabaca 7B modeller 4~8GB, 13B modeller 8~15GB, 30B modeller 13~33GB, 70B modeller ise 31~75GB aralığında
    • Kendiniz okuyup atma işlemi yapmanıza gerek yok. Tüm ağı mmap edin ve işi işletim sistemine bırakın
    • Mümkün, ama bunu yaparsanız disk bant genişliği ile sınırlanırsınız
    • O(N²) Transformer çıkarımında tüm aktivasyon değerlerini önbelleğe almak gerektiğini biliyorum
  • Aklıma bir düşünce geldi: Şu an LLM bir olasılık dağılımı döndürüyor; rastgele örnekleyici birini seçip çıktıya ekliyor ve bu tekrarlanıyor
    Bunun yerine rastgeleliğin dağılımı yaklaşık temsil eden N token seçmesi, LLM’in N yeni dağılım üretmesi, sonra bunların bir şekilde birleştirilip birleşik dağılımdan tekrar N token seçilmesi mümkün olur mu?

    • Neredeyse beam search (ışın araması) gibi geliyor ve gerçekten de yaygın bir üretim tekniği: https://en.wikipedia.org/wiki/Beam_search
      Örnekler https://huggingface.co/docs/transformers/internal/generation... adresinde görülebilir
    • Araştırmaya değer bir yol gibi geliyor, ama muhtemelen 2 token’dan çok daha ileriyi üretmek gerekir. 20 token kadar bakmak, fakat LLM’i N^20 kez çalıştırmak istemeyeceğiniz için sonraki 20 token kombinasyonu arasından yaklaşık 200 temsilî örnek seçmek daha iyi olabilir
      Ancak bunun nasıl yapılacağını bilmiyorum
    • Acemiyim ama bu fikir hoşuma gitti. Yanıtını bilmiyorum, fakat denenebilir gibi; muhtemelen araştırmacılar zaten denemiştir
      Elbette her token üretimi için N kat hesaplama gerekir. İlk N’i seçebilir ya da gerekirse logit’lere sıcaklık ayarı uygulayıp N tane örnekleyebilirsiniz
  • Bu eğitim amaçlı mı? llama.cpp’nin ve bu projenin başarısına bakınca sektör, PyTorch, TensorFlow, ONNX Runtime gibi genel amaçlı framework’ler yerine, yayımlanan her model için ayrı kaynak kodu tutma yönüne gidiyor gibi görünüyor

    • Bu tamamen eğitim amaçlı görünüyor
      Ayrıca hayır. Adının aksine llama.cpp yalnızca llama’yı desteklemiyor. Tamamen özel yapım da değil; daha genel amaçlı ggml tensor kütüphanesi/framework’ü üzerine kurulmuş
    • Framework’lerin içinde de her model için ayrı kaynak kodu vardır. Çünkü modeller, salt framework’ün kendisiyle değil, framework’ün temel bileşenlerini bir araya getiren özel kodlarla oluşturulur. Keşif odaklı araştırmanın doğası budur
      Ancak iyi çalışan bir model bulunduğunda, bu gelişme çoğu zaman framework’ün sonraki sürümüne girer. Bu yüzden TensorFlow’da CNN, GRU, TransformerEncoder gibi temel bileşenler ortaya çıktı; aynı zamanda genelliği feda edip hız kazandıran belirli donanım uygulamaları da geliştirildi
    • Tek iş parçacıklı olduğu için eğitim amaçlı olarak görmek doğru