- llama2.c adalah solusi pelatihan dan inferensi “fullstack” yang melatih arsitektur LLM Llama 2 dengan PyTorch, lalu menjalankan inferensi lewat berkas C sederhana
run.c - Fokus utamanya adalah minimalisme dan kesederhanaan; ini adalah implementasi edukatif yang meng-hardcode arsitektur Llama 2 dan terdiri dari satu berkas inferensi C murni tanpa dependensi
- Dari sudut pandang bahwa LLM yang sangat kecil pun dapat berkinerja kuat jika domainnya cukup dipersempit, proyek ini menyediakan model contoh berbasis TinyStories
- Model 15M parameter berukuran unduhan sekitar 60MB dan dapat dijalankan dengan
./run stories15M.binsetelahmake run - Model 42M dan 110M parameter juga disediakan, dan model 110M disebut berukuran sama dengan GPT-1
- Model 15M parameter berukuran unduhan sekitar 60MB dan dapat dijalankan dengan
- Model Llama 2 dari Meta juga dapat diinferensikan karena arsitektur neural network-nya sama, tetapi checkpoint harus diperoleh sesuai panduan Meta lalu dikonversi ke format llama2.c menggunakan
export.py- Saat ini
run.chanya melakukan inferensi fp32, sehingga model yang lebih besar dari 7B kemungkinan besar sulit dimuat secara produktif - Model 13B ke atas saat ini tidak berjalan karena integer overflow pada aritmetika pointer, dan masih belum diperbaiki
- Saat ini
- Inferensi kuantisasi int8 diimplementasikan di
runq.c; dengan skema Q8_0, bobot yang terlibat dalam matmul dikuantisasi, sementara activation juga dikuantisasi dan didekuantisasi secara dinamis saat runtime- Export fp32 Llama 2 7B menghasilkan berkas 26GB, sedangkan export terkuantisasi version 2 menghasilkan berkas 6,7GB
- Di lingkungan penulis dengan OpenMP 64 thread, fp32 berjalan pada 4,6 tok/s dan int8 pada 14 tok/s, sehingga ukuran checkpoint berkurang 4× dan kecepatan meningkat sekitar 3×
- Cara penggunaan mencakup menjalankan inferensi C, memasukkan prompt, mengontrol sampling temperature dan top-p, menjalankan mode chat, serta menentukan tokenizer kustom
- Contoh eksekusi berbentuk
./run stories42M.bin -t 0.8 -n 256 -i "One day, Lily met a Shoggoth" - Model chat dijalankan dengan flag
-m chat, seperti./run llama2_7b_chat.bin -m chat - Tokenizer kustom diekspor ke format
.binlewattokenizer.py, lalu ditentukan dengan flag-z
- Contoh eksekusi berbentuk
- Model di Hugging Face yang menggunakan arsitektur Llama 2 dapat diekspor menjadi berkas
.bindengan flag--hfpadaexport.py - Alur pelatihan berlanjut dari mengunduh dan melakukan pra-tokenisasi TinyStories, menjalankan
train.py, mengekspor model, lalu melakukan inferensi dengan C- Contoh TinyStories bawaan saat ini adalah satu-satunya contoh dataset yang disediakan
- Pelatihan tokenizer kustom menggunakan
sentencepiece, dengan contoh pengaturan--vocab_size=4096
- Build terkait performa dibagi menjadi
make run,make runfast, danmake runomp; build OpenMP mengaktifkan#pragma omp parallel fordi dalam matmul dan attention untuk membagi pekerjaan loop ke beberapa prosesor - Panduan build platform disediakan untuk Windows, Centos 7, Amazon Linux 2018, dan Mac
- Windows menggunakan
build_msvc.batataumake win64 - Centos 7 dan Amazon Linux 2018 menggunakan
make rungnuataumake runompgnu - Build OpenMP di Mac menggunakan
make runomp CC=/opt/homebrew/opt/llvm/bin/clangsetelah memasang clang dari brew
- Windows menggunakan
- Pengujian menyediakan
pytestdan pengujian Cmake testcc;test_all.pymenjalankan forward 200 langkah di C dan Python lalu membandingkannya dengan output ekspektasi yang diketahui - Tujuan proyek ini adalah mempertahankan implementasi referensi sederhana yang terdiri dari 2 berkas
.pykode pelatihan yang mudah dibaca dan kode inferensi C, bukan mengejar framework kompleks atau banyak opsi - Lisensinya adalah MIT
1 komentar
Komentar Hacker News
Melihat ini diposting di HN terasa menyenangkan :) Checkpoint aslinya berjalan di MacBook Air M1 pada 100 tok/s yang jauh lebih cepat dari perkiraan saat dikompilasi dengan
-O3, jadi sekarang sedang melatih model 44M yang lebih besarMeski begitu, sepertinya masih bisa dijalankan secara interaktif, dan mungkin model 7B Llama juga bisa mulai terjangkau
nanoGPTdan mencoba pra-melatih model 12M dengan 2GB data buatan GPT-4 dari TinyStories, dan hasilnya cukup mengejutkanSetelah itu saya sedikit mengadaptasikannya dengan Wikipedia, lalu jadilah mesin penghasil omong kosong yang masuk akal, jauh lebih pintar dan jauh lebih kecil daripada model n-gram yang dihaluskan. Sepertinya LLM kecil akan jadi arus utama di banyak area, dan target berikutnya adalah mengecilkan Llama2 7B menjadi 10~100M tanpa membuatnya jauh lebih bodoh
Menyewa instance GPU di tempat seperti Linode jauh lebih mahal daripada server web app biasa, jadi saya ingin tahu apakah ini benar-benar wilayah yang mustahil, atau pendekatan seperti ini maupun cara lain masih merupakan jalan yang realistis
Ada versi yang dijalankan di browser dengan Emscripten oleh Georgi Gerganov, yang terkenal karena llama.cpp: https://ggerganov.com/llama2.c/
Thread Twitter yang sedang berjalan ada di https://twitter.com/ggerganov/status/1683174252990660610
Baik versi asli maupun karya ini sama-sama sangat keren, dan meski lebih merupakan pembuktian konsep dengan model yang sangat kecil, LLM yang mengutamakan lokal terasa sangat menarik. Gagasan bahwa web app bisa dibuat dengan inferensi lokal itu bagus
Jika ini berlanjut ke optimisasi, riset model yang lebih kecil, unduhan parsial, dan pemanfaatan WebGPU, ini bisa menjadi titik awal cara baru membuat aplikasi privat berbasis LLM lokal. Kemampuannya mungkin tidak akan setara dengan LLM yang dihosting di klaster GPU kelas atas berskala besar, tetapi ada banyak use case yang bisa dibuka oleh pendekatan seperti ini
Misalnya dimulai dengan “Once upon a time...”, tampak seperti kisah Lily dan Timmy, lalu berubah menjadi output yang benar-benar rusak dengan campuran seperti “Butterfly would pauseWhy”, “TextField”,
querySelector,HttpRequest, dan potongan dari berbagai bahasaBagi yang penasaran, ada juga versi Rust. Dalam mode rilis kecepatannya sekitar 106 tokens/second
https://github.com/garrisonhess/llama2.c/blob/517a1a3e487f31...
Versi non-web mendukung GPU sepenuhnya, tetapi sama sekali tidak minimalis
Terkadang itu juga memecah upaya komunitas untuk memperbaiki proyek
Sepertinya tidak banyak orang yang memahami betapa beraninya langkah ini
Andrej menerima bayaran besar dari OpenAI(MSFT), tetapi tetap membantu Apple, Facebook, dan yang lebih penting, gerakan open source. Meski begitu, akan sulit menyingkirkannya, karena ia bisa langsung pindah ke Tesla atau xAI
Rasanya Llama-2 memiliki filter keamanan yang terlalu kuat sampai-sampai tak bisa dipakai untuk pekerjaan kreatif: https://i.imgur.com/GFY0wSL.png
Namun fenomena ini hanya agak bisa direproduksi saat dikirim sebagai pesan kedua di TGI Hugging Face Llama2-70b-chat, dan mungkin ada keanehan di cara prompting yang menyebabkan perilaku seperti ini. Saya belum sempat menyelidikinya lebih jauh dengan menjalankan modelnya sendiri
Chat/instruct memang punya kelebihan karena mudah didistribusikan ke pengguna pihak ketiga, prompt-nya sederhana, dan ada pengaman, tetapi untuk pemakaian pribadi kualitasnya benar-benar jauh di bawah model pra-latih. Di titik ini Llama 2 mungkin punya keunggulan dibanding OpenAI, karena OpenAI tampaknya sudah membuang model pra-latih GPT-3 dan ke depan hanya akan menyediakan model chat
Saya tidak mau gunting pengaman. Membatasi hal-hal yang berjalan di server mereka sendiri tidak masalah, tetapi jangan memberi saya model yang tidak bisa saya modifikasi dan gunakan sesuka saya di komputer saya sendiri
Andrej memposting detail lebih lanjut di sini: https://twitter.com/karpathy/status/1683143097604243456?s=46...
Sebagai catatan, kalau tertarik pada bidang seperti ini, kode ini bisa dibangun dengan rapi menggunakan WASI SDK dan berjalan di runtime Wasm tanpa modifikasi
Penasaran berapa banyak memori yang dibutuhkan untuk menjalankan jaringan saraf
Apakah cukup dengan membaca hanya dua layer pertama dari disk dan menghitung nilai aktivasi semua node, lalu membuang layer pertama, membaca layer ketiga dan menghitung lagi, lalu membuang layer kedua, dan seterusnya? Kalau begitu, apakah memori yang dibutuhkan cukup sebesar kapasitas untuk menampung dua layer saja?
Singkatnya, RAM maksimum bergantung pada metode kuantisasi, dan kira-kira model 7B berada di kisaran 4~8GB, model 13B di 8~15GB, model 30B di 13~33GB, dan model 70B di 31~75GB
Tiba-tiba terpikir, saat ini LLM mengembalikan distribusi probabilitas, lalu sampler acak memilih satu dan menambahkannya ke output, lalu mengulang
Sebagai gantinya, mungkinkah memilih N token yang mendekati distribusi itu, meminta LLM menghasilkan N distribusi baru, lalu menggabungkannya dengan suatu cara dan dari distribusi gabungan itu memilih lagi N token?
Contohnya bisa dilihat di https://huggingface.co/docs/transformers/internal/generation...
Hanya saja saya tidak tahu bagaimana cara melakukannya
Tentu saja, itu membutuhkan N kali lipat komputasi untuk setiap generasi token. Anda bisa memilih N teratas, atau jika perlu menerapkan pengaturan suhu pada logit untuk men-sampling N buah
Apakah ini untuk pembelajaran? Melihat keberhasilan llama.cpp dan proyek ini, sepertinya industri sedang bergerak ke arah memiliki kode sumber terpisah untuk setiap model yang dirilis, alih-alih memakai framework umum seperti PyTorch, TensorFlow, atau ONNX Runtime
Dan tidak juga. Berbeda dengan namanya, llama.cpp tidak hanya mendukung llama. Ini juga bukan sesuatu yang sepenuhnya kustom, melainkan dibangun di atas library/framework tensor
ggmlyang lebih umumNamun, kalau ditemukan model yang bekerja dengan baik, perkembangannya biasanya dimasukkan ke versi framework berikutnya. Itulah sebabnya TensorFlow memiliki elemen dasar seperti CNN, GRU, dan TransformerEncoder, sambil pada saat yang sama juga dibuat implementasi perangkat keras tertentu yang mengorbankan generalitas demi kecepatan