Llama2.c: Saf C dosyasında Llama 2 çıkarımı
(github.com/karpathy)- llama2.c, Llama 2 LLM mimarisini PyTorch ile eğiten ve basit bir C dosyası olan
run.cile çı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 runsonrası./run stories15M.binile çalıştırılabilir - 42M ve 110M parametreli modeller de sunulur; 110M modelin GPT-1 ile aynı boyutta olduğu belirtilir
- 15M parametreli model yaklaşık 60 MB indirmedir ve
- 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.pyile llama2.c formatına dönüştürülmesi gerekir- Mevcut
run.cyalnı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
- Mevcut
- int8 kuantizasyon çıkarımı
runq.ciç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 chatgibi-m chatbayrağıyla çalıştırılır - Özel tokenizer,
tokenizer.pyile.binformatında dışa aktarıldıktan sonra-zbayrağıyla belirtilir
- Örnek çalıştırma
- Hugging Face’te Llama 2 mimarisini kullanan modeller,
export.pyiçindeki--hfbayrağıyla.bindosyası 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
sentencepiecekullanır ve örnek olarak--vocab_size=4096ayarı kullanılır
- Performansla ilgili build’ler
make run,make runfast,make runompolarak ayrılır; OpenMP build’i matmul ve attention içindeki#pragma omp parallel forifadelerini 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.batveyamake win64kullanılır - Centos 7 ve Amazon Linux 2018’de
make rungnuveyamake runompgnukullanılır - Mac’te OpenMP build’i için brew ile clang kurulduktan sonra
make runomp CC=/opt/homebrew/opt/llvm/bin/clangkullanılır
- Windows’ta
- Testler için
pytestve C testimake testccsunulur;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
.pyeğ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
Hacker News yorumları
HN’de çıktığını görmek güzel :) Orijinal checkpoint, MacBook Air M1 üzerinde
-O3ile 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ğitiyorumYine 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
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
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
Ö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,HttpRequestve çeşitli dillerden parçalar birbirine karışarak tamamen bozuk bir çıktıya dönüşüyorMerak 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...
Web dışı sürüm GPU’yu tamamen destekliyor ama hiç minimalist değil
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
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ı
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
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
Ö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
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?
Örnekler https://huggingface.co/docs/transformers/internal/generation... adresinde görülebilir
Ancak bunun nasıl yapılacağını bilmiyorum
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
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ı
ggmltensor kütüphanesi/framework’ü üzerine kurulmuş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