1 poin oleh GN⁺ 2023-07-24 | 1 komentar | Bagikan ke WhatsApp
  • 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.bin setelah make run
    • Model 42M dan 110M parameter juga disediakan, dan model 110M disebut berukuran sama dengan GPT-1
  • 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.c hanya 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
  • 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 .bin lewat tokenizer.py, lalu ditentukan dengan flag -z
  • Model di Hugging Face yang menggunakan arsitektur Llama 2 dapat diekspor menjadi berkas .bin dengan flag --hf pada export.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, dan make runomp; build OpenMP mengaktifkan #pragma omp parallel for di 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.bat atau make win64
    • Centos 7 dan Amazon Linux 2018 menggunakan make rungnu atau make runompgnu
    • Build OpenMP di Mac menggunakan make runomp CC=/opt/homebrew/opt/llvm/bin/clang setelah memasang clang dari brew
  • Pengujian menyediakan pytest dan pengujian C make testcc; test_all.py menjalankan 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 .py kode pelatihan yang mudah dibaca dan kode inferensi C, bukan mengejar framework kompleks atau banyak opsi
  • Lisensinya adalah MIT

1 komentar

 
GN⁺ 2023-07-24
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 besar
    Meski begitu, sepertinya masih bisa dijalankan secara interaktif, dan mungkin model 7B Llama juga bisa mulai terjangkau

    • Saya sedikit memodifikasi nanoGPT dan mencoba pra-melatih model 12M dengan 2GB data buatan GPT-4 dari TinyStories, dan hasilnya cukup mengejutkan
      Setelah 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
    • Seperti biasa, pekerjaan ini memberi inspirasi. Pertanyaan pemula: saya penasaran jalur paling praktis untuk menjalankan LLM dengan ukuran yang masuk akal untuk web app hobi di server Linux biasa tanpa GPU mewah itu apa
      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
    • Saya penasaran apakah sudah ada kesan awal tentang kualitas/kinerja relatif model Llama-2 kecil dibanding model GPT-2 kecil
    • Saya penasaran apakah menurut Anda trainer C murni juga bisa dibuat, alih-alih Python
    • Saya penasaran model-model seperti ini biasanya dilatih di mana: perangkat rumahan, M1, atau cloud
  • 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

    • Output yang cukup aneh muncul dari tautan pertama. Awalnya seperti dongeng yang masuk akal, tetapi lalu dipenuhi salah ketik dan runtuh menjadi ocehan tak menentu, sambil mencampurkan bahasa asing dan istilah teknis/pemrograman
      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 bahasa
  • Bagi yang penasaran, ada juga versi Rust. Dalam mode rilis kecepatannya sekitar 106 tokens/second
    https://github.com/garrisonhess/llama2.c/blob/517a1a3e487f31...

    • Ada versi Rust lainnya juga. Ini menggunakan library ML candle yang saya kerjakan sejak bulan lalu, dan juga bisa dijalankan di browser: https://laurentmazare.github.io/candle-llama2/index.html
      Versi non-web mendukung GPU sepenuhnya, tetapi sama sekali tidak minimalis
    • Seperti yang sering terlihat di Rust, kadang sesuatu yang sudah ada hanya dipindahkan apa adanya semata-mata karena itu memungkinkan, tanpa memberi manfaat apa pun
      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

    • Secara pribadi saya merasa atas nama “keamanan”, filternya justru berputar 180 derajat hingga bisa memperkuat stereotip yang penuh kebencian atau negatif: https://i.imgur.com/xkzXrPK.png dan https://i.imgur.com/3HQ8FqL.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
    • Jika ada model pra-latih, lebih baik tidak memakai model instruct/chat
      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
    • Kalau dibayangkan, hasilnya seperti Casca dan Brutus tidak menikam Caesar, melainkan dengan sopan menghadapinya soal kemungkinan penyalahgunaan kekuasaan dan kecenderungan diktatorialnya
    • Yang terlalu difilter itu bukan keseluruhan “llama-2”, melainkan Llama-2 chat
    • Orang-orang “AI etis” harus disingkirkan. Makin lama makin jelas bahwa mereka benar-benar menjengkelkan
      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?

    • TheBloke dari Hugging Face telah mendokumentasikan kebutuhan memori untuk setiap versi kuantisasi dari model-model populer: https://huggingface.co/TheBloke
      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
    • Tidak perlu menangani proses baca-lalu-buang itu sendiri. Cukup mmap seluruh jaringan dan biarkan sistem operasi yang menanganinya
    • Itu memang bisa, tetapi dengan begitu akan dibatasi oleh bandwidth disk
    • Setahu saya, pada inferensi transformer O(N²), semua nilai aktivasi harus di-cache
  • 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?

    • Kedengarannya hampir seperti beam search, dan memang itu teknik generasi yang umum: https://en.wikipedia.org/wiki/Beam_search
      Contohnya bisa dilihat di https://huggingface.co/docs/transformers/internal/generation...
    • Terdengar seperti jalur yang layak diteliti, tetapi mungkin perlu menghasilkan jauh lebih dari 2 token ke depan. Mungkin melihat sekitar 20 token, namun tentu tidak ingin menjalankan LLM sebanyak N^20 kali, jadi mungkin lebih baik mengambil sekitar 200 sampel representatif dari kombinasi 20 token berikutnya
      Hanya saja saya tidak tahu bagaimana cara melakukannya
    • Saya masih pemula, tapi saya suka idenya. Saya tidak tahu jawabannya, tetapi sepertinya bisa dicoba lewat eksperimen, dan kemungkinan besar peneliti sudah pernah mencobanya
      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

    • Ini tampaknya sepenuhnya untuk tujuan pembelajaran
      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 ggml yang lebih umum
    • Bahkan di dalam framework pun ada kode sumber terpisah untuk tiap model. Model adalah kode kustom yang menggabungkan elemen-elemen dasar framework, bukan sesuatu yang dibuat murni hanya dengan framework. Memang seperti itulah sifat riset eksploratif
      Namun, 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
    • Karena ini single-threaded, rasanya tepat jika dianggap untuk pembelajaran