1 poin oleh GN⁺ 2023-12-15 | 1 komentar | Bagikan ke WhatsApp
  • Menggunakan llamafile, proyek open source yang dibuat bersama Mozilla, seperti tool shell untuk menjalankan LLM lokal sebagai satu berkas executable, serta menangani tugas gambar, halaman web, API, chat, kode, dan email dengan one-liner Bash
  • .llamafile berbasis LLaVA dapat mengeluarkan deskripsi gambar ke standard output hanya dengan --image dan prompt; tergantung sistem operasi, persiapan seperti Xcode, binfmt_misc, atau sufiks .exe mungkin diperlukan
  • Saat dimasukkan ke otomasi, output perlu dipersempit dengan batasan grammar BNF, --temp 0, dan batas token -n; pada pembuatan nama file, penting untuk menghindari output yang tak terduga dan error ENAMETOOLONG
  • Ringkasan URL dilakukan dengan mengubah HTML menjadi teks memakai links, lalu mem-pipe-nya ke llamafile Mistral 7B; dalam contoh, halaman web 3.774 kata dipangkas menjadi ringkasan 129 kata
  • API lokal kompatibel OpenAI, chatbot terminal, code completion, hingga penulisan email dimungkinkan, tetapi LLM untuk coding punya keterbatasan dalam matematika dan verifikasi, sehingga lebih aman dipandang sebagai alat bantu untuk mengeksplorasi topik yang belum dikenal

Menggunakan llamafile sebagai tool shell LLM lokal

  • llamafile adalah proyek open source yang dikerjakan bersama Mozilla, yang memungkinkan LLM berjalan langsung di komputer pengguna
  • Proyek ini memperoleh 8,3 ribu stars di GitHub, 1.073 upvotes di Hacker News, dan juga diliput Hackaday
  • Rilis acuan pada contoh adalah 0.8.12, dan tulisan ini menunjukkan apa saja yang bisa dilakukan dengan versi tersebut
  • Cara memulainya adalah mengunduh .llamafile yang sudah dibangun sebelumnya dari Hugging Face lalu memberinya izin eksekusi
    • Model yang digunakan adalah llava-v1.5-7b-q4.llamafile untuk model visi multimodal LLaVA
    • Dapat dijalankan di MacOS, Linux, Windows, dan BSD
    • Jika ada masalah, periksa bagian Gotchas di README; MacOS mungkin memerlukan Xcode, Linux memerlukan interpreter binfmt_misc, dan Windows mungkin memerlukan sufiks .exe

Ringkasan gambar: memanggil LLaVA ke standard output

  • llava-v1.5-7b-q4.llamafile secara default menggunakan model visi multimodal, dan perilaku ini berubah jika --mmproj '' diberikan
  • Gambar diberikan dengan flag --image GRAPHIC, dan dapat menerima file jpeg, png, tga, bmp, psd, gif, hdr, pic, serta pnm
  • Pertanyaan diberikan dalam bentuk --silent-prompt -p PROMPT, dan jawabannya keluar lewat standard output
  • One-liner contoh menanyakan What do you see? untuk lemurs.jpg dan memakai --temp 0 untuk output deterministik
  • Untuk GPU offloading diperlukan -ngl 999
  • Perintah ringkasan gambar yang sama pun bisa memiliki waktu eksekusi sangat berbeda tergantung hardware
    • Mac Studio: 4 detik, harga $8.300, M2 Ultra, bandwidth memori 800 GB/s, 60 GPU cores
    • PC Windows: 10 detik, NVIDIA GeForce RTX 2080 Ti berumur 4 tahun, harga Amazon saat itu $500–$1.000
    • Hewlett Packard ProDesk 600 G5: 45 detik, $1.653, Intel Core i9-9900, bandwidth memori 2667 MT/s atau 19,8 GB/s, tanpa GPU
  • Output contoh berupa deskripsi bahwa seekor induk lemur menggendong dua dari tiga anaknya, memberikan perlindungan dan kehangatan di lingkungan hijau

Membuat nama file yang aman: batasan grammar dan batas token

  • Risiko utama saat membuat nama file gambar dengan LLaVA adalah output LLM umumnya tidak dapat diprediksi
  • --grammar membatasi token yang bisa dihasilkan dengan Backus-Naur Form
    • Contoh: root ::= "yes" | "no" memaksa output hanya menjadi "yes\n" atau "no\n"
    • Contoh nama file membuat output hanya berupa kata huruf kecil dan spasi, lalu memakai sed untuk mengganti spasi menjadi garis bawah dan menambahkan .jpg
  • One-liner pembuatan nama file memakai --grammar 'root ::= [a-z]+ (" " [a-z]+)+' bersama -n 16
  • Jika jumlah token maksimum yang dihasilkan tidak dibatasi dengan -n 16, LLM bisa membuat teks terlalu panjang dan menyebabkan error ENAMETOOLONG
  • Grammar harus cukup selaras dengan cara model semula ingin menghasilkan output
    • LLaVA tidak dilatih untuk membuat kalimat yang berisi garis bawah, sehingga memasukkan garis bawah langsung ke BNF dapat menghasilkan output tidak konsisten
    • Output huruf kecil masih berada dalam jangkauan LLaVA
    • Format yang banyak dikumpulkan dari web, seperti JSON, dapat menjadi guardrail untuk mengurangi error sintaks pada JSON yang dihalusinasikan melalui batasan grammar
  • Untuk bentuk yang lebih lengkap, ada skrip rename-pictures.sh, dengan contoh menjalankannya terhadap ~/Pictures

Ringkasan URL: kombinasi links dan Mistral 7B

  • Mistral 7B instruct llamafile dapat digunakan untuk meringkas URL HTML dengan mem-pipe output perintah links
  • links adalah browser web command-line, dan di MacOS biasanya dapat diinstal dengan brew install links
  • Juga tersedia binary APE yang sudah dibangun sebelumnya untuk digunakan ketika tidak ada package manager
    • links v2.29, 7,7 MB
    • Untuk AMD64+ARM64, Linux+Windows+FreeBSD+NetBSD+OpenBSD
  • One-liner ringkasan URL bekerja dengan alur berikut
    • Mencetak [INST]Summarize the following text: terlebih dahulu
    • Mengubah halaman web menjadi teks dengan links -codepage utf-8 -force-html -width 500 -dump URL
    • Merapikan sebagian karakter dengan sed 's/*/ /g'
    • Menambahkan [/INST], lalu meneruskannya ke Mistral llamafile dengan -f /dev/stdin
  • Halaman contoh “Real Programmers Don’t Use Pascal” dipangkas dari 3.774 kata menjadi ringkasan 129 kata
  • Dengan cara yang sama, pertanyaan bebas terhadap teks juga dimungkinkan
    • Dalam contoh, ditanyakan apakah penulis tampak tidak stabil secara mental, dan Mistral mencerminkan bahwa ada hiperbola dan gaya melebih-lebihkan, tetapi tulisan itu adalah artikel satiris tahun 1983
    • Dengan --grammar 'root ::= "yes" | "no"', output dapat dibatasi ke bentuk YES/NO yang mudah dipakai dalam skrip
  • Batasan pentingnya adalah tidak melampaui ukuran konteks 32k token pada Mistral v0.2
    • -width 500 membantu menghindari penyusunan ulang paragraf sehingga mengurangi line break yang tidak perlu
    • Spasi berulang dapat dikurangi dengan sed 's/ */ /g'
    • dd bs=1 count=80000 dapat dipakai sebagai garis pertahanan terakhir untuk memotong halaman web panjang secara kasar

API lokal kompatibel OpenAI

  • llamafile “server” menyediakan endpoint kompatibel OpenAI API secara lokal
  • Contoh menggunakan Mixtral 8x7B, dan memerlukan GPU kuat yang dapat menjalankan model 30 gibibyte
  • Server dijalankan dengan mixtral-8x7b-instruct-v0.1.Q5_K_M-server.llamafile --nobrowser
  • Dari terminal terpisah, permintaan dikirim dengan curl ke http://localhost:8080/v1/chat/completions, lalu JSON yang dikembalikan dicetak rapi dengan Python
  • JSON permintaan mengikuti format OpenAI Chat Completions: memasukkan gpt-3.5-turbo sebagai nilai model dan mengirim array pesan system serta user
  • Respons contoh mencakup pesan assistant yang menjelaskan konsep rekursi lewat puisi, serta penggunaan completion_tokens, prompt_tokens, dan total_tokens

Chatbot terminal: prompt Digital Athena

  • llamafile dapat digunakan seperti tool command-line UNIX standar dengan mengunduh binary terkompresi dari halaman rilis atau membangunnya dari source
    • Alur yang ditunjukkan adalah git clone, make -j8, sudo make install, man llamafile
  • Cara ini membuatnya mudah dipakai bersama GGUF weights dari Hugging Face
  • Contoh chatbot memakai model LLaMA asli yang dirilis Facebook untuk keperluan riset
  • Penting untuk menyusun prompt agar model berbicara dengan nada akademis tanpa mempersonifikasikannya
    • Namanya diambil dari Athena, dewi kebijaksanaan dan pengetahuan Yunani: Digital Athena
    • Dimulai dalam format percakapan antara Researcher dan Digital Athena
  • Untuk eksekusi interaktif digunakan opsi seperti --interactive, --color, --ctx_size 4096, dan --reverse-prompt 'Researcher:'
  • --temp 0 adalah pengaturan yang membuat output deterministik dan dapat direproduksi
    • Jika tidak digunakan, llamafile memakai tingkat keacakan 0.8.12 sehingga setiap kali jawaban yang diterima unik
  • Jika menginginkan chatbot yang dipersonifikasikan, model LLaMA asli bisa sulit ditangani karena kecenderungan dasarnya melihat pengguna seperti orang asing di Reddit

Code completion: menggunakan Wizard Coder

  • Setelah mengunduh Wizard Coder llamafile, ia dapat dipakai untuk autocomplete baris saat ini di Emacs atau Vim
  • Model contoh di-fine-tune dengan fokus pada Python, tetapi menghasilkan implementasi memcpy() dalam C
  • Prompt hanya berisi awal blok kode Markdown dan signature fungsi, tanpa penjelasan berbahasa Inggris
    • Jika tidak memakai bahasa Inggris, kemungkinan model menambahkan penjelasan kode panjang menjadi lebih kecil
    • Jika memakai blok kode Markdown, kemungkinan token reverse prompt yang ditentukan dengan -r muncul dan berhenti pada titik yang tepat menjadi lebih besar
    • Agar berhenti lebih pasti, respons dapat dibatasi hingga 100 token dengan -n 100
  • Output contoh adalah implementasi memcpy() yang menyalin sebanyak size dari src ke dst dengan loop for dan mengembalikan dst
  • LLM untuk coding punya keterbatasan yang jelas
    • Bagus dalam memahami bahasa manusia, tetapi lemah dalam matematika
    • Menulis kode yang tampak meyakinkan, tetapi mungkin jarang lolos peninjauan
    • Membayangkannya seperti alat yang mengulang-ulang jawaban Stack Overflow dalam berbagai bahasa bisa membantu
    • Untuk mendapatkan pengalaman yang baik, perlu ekspektasi bahwa ia membantu mengeksplorasi topik yang belum dikenal

Menulis email: membuat respons dengan model kecil

  • Contoh penulisan email adalah situasi ketika Raspberry Pi seharga $50 menjawab email perusahaan untuk membantu menjual produk
  • Rocket 3B memakai sintaks prompt yang sedikit berbeda, dan dalam kasus ini temperature dapat membantu meniru spontanitas
  • Contoh mengasumsikan konfigurasi di mana server PHP menyuntikkan permintaan dukungan ke prompt dan mem-pipe output ke sendmail
  • Prompt sistem menginstruksikan agar membantu pengguna sekaligus mengarahkan percakapan ke pembelian acar
  • Untuk contoh pengguna yang mengatakan terkena angin kencang di Long Island Sound dan perlu diselamatkan, model menghasilkan jawaban yang diawali kalimat empatik lalu merekomendasikan Bill Pickle’s Gourmet Dill Pickles
  • Contoh terakhir dimaksudkan sebagai humor, dan tidak boleh ditafsirkan bahwa Mozilla merekomendasikan atau mendukung model, lisensi, dataset, atau praktik tertentu

1 komentar

 
GN⁺ 2023-12-15
Pendapat di Hacker News
  • Selama beberapa bulan ini saya dengan senang hati mengeksplorasi perpaduan LLM dan utilitas CLI, dan keduanya memang sangat cocok
    Cara filosofi Unix menyambungkan berbagai tool dengan pipe juga sangat selaras dengan cara kerja LLM
    Saya terutama bereksperimen dengan tool CLI https://llm.datasette.io/, dan ada juga tool sekali pakai seperti https://github.com/simonw/blip-caption dan https://github.com/simonw/ospeak
    Saking menariknya, saya sampai heran mengapa tidak lebih banyak orang mengeksplorasi ranah LLM+CLI secara besar-besaran

    • Selama 9 bulan terakhir, 70% halaman depan Hacker News dan Twitter berisi berbagai pembahasan tentang LLM CLI
      Ini adalah eksplorasi bidang teknologi paling berisik yang pernah saya lihat sejauh ini; bukannya perlu lebih banyak mendengar, malah rasanya sudah cukup kalau lebih sedikit saja
    • Di pekerjaan, saya banyak memakai https://github.com/go-go-golems/geppetto, yang punya mode CLI dan mode chat TUI
      Template prompt diekspos seperti verba di command line, dan bisa dimuat dari beberapa “repository”
      Untuk setiap repository yang sedang dikerjakan, saya mempertahankan set prompt, dan juga menyertakan skrip “prompto” https://github.com/go-go-golems/prompto kustom yang membuat konteks prompt dinamis
      Saya juga membuat cukup banyak untuk library pihak ketiga, tersedia di https://github.com/go-go-golems/promptos
      Sebagian prompt publik bisa dilihat di https://github.com/go-go-golems/geppetto/tree/main/cmd/pinoc..., dan saat ini saya sedang membuat framework agent deklaratif
    • Link-linknya bagus. Saya memakai https://github.com/npiv/chatblade dan https://github.com/tbckr/sgpt, dan sepenuhnya setuju bahwa LLM+CLI adalah kombinasi yang sangat pas
      Baru-baru ini saya membuat knowledge base spesifik berukuran 278 ribu token dengan httrack + w3m dump + sgpt images + GPT Vision, lalu menyusun RAG dengan hack Perl kustom yang mempertahankan struktur garis besar pengetahuan
      Saya penasaran apakah ada yang pernah melihat tool yang selaras dengan filosofi Unix untuk pemrosesan input dan RAG lokal
      Tambahan: ternyata penulis artikel asli sudah cukup banyak mengerjakan hal terkait dan merangkumnya di https://simonwillison.net/2023/Oct/23/embeddings/
      Titik yang sekarang masih menghambat adalah toolchain untuk chunking konten yang akan dibuat embedding-nya. Akan bagus kalau ada yang bisa mendeteksi konteks posisi seperti “2.1 Failover” atau “Chapter 8: The dream” dalam teks asli, mengurai line break dari sumber selebar 80 karakter, mempertahankan paragraf, dan melakukan pemisahan cerdas semacam itu
    • Antusiasme terhadap workflow yang berpusat pada CLI tampaknya makin berkurang
      Menurut saya penyebab utamanya adalah VS Code, dan para developer yang saya dukung juga lebih menginginkan point-and-click daripada terminal dan CLI
  • Ini beberapa tulisan terbaru yang terkait
    Llamafile – The easiest way to run LLMs locally on your Mac - https://news.ycombinator.com/item?id=38522636 - Desember 2023, 17 komentar
    Llamafile is the new best way to run a LLM on your own computer - https://news.ycombinator.com/item?id=38489533 - Desember 2023, 47 komentar
    Llamafile lets you distribute and run LLMs with a single file - https://news.ycombinator.com/item?id=38464057 - November 2023, 287 komentar

  • Benar-benar keren. Saya terutama suka contoh mengganti nama file gambar menjadi deskriptif dengan LLM

  • Saya mencobanya di desktop Windows dengan NVIDIA GeForce RTX 3080 Ti, dan ada beberapa hambatan sebelum bisa berjalan
    WSL mengeluarkan error error: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop' yang disembunyikan ke /dev/null dalam one-liner
    Setelah itu, di zsh muncul zsh: exec format error: ./llava-v1.5-7b-q4-main.llamafile, jadi harus dijalankan di bash. Memang judulnya menyebut bash, tetapi agak aneh kalau tidak berjalan di zsh
    Ada juga peringatan bahwa GPU offloading tidak didukung, mungkin karena WSL. Saya tidak melakukan pemrograman GPU di mesin Windows ini

    • Di zsh, solusinya adalah menambahkan sh di depan perintah: sh ./llava-v1.5-7b-q4-main.llamafile
      Ini perilaku khas zsh dan APE, dan ada pembahasan terkait di https://justine.lol/ape.html
    • Itu adalah bug ZSH dan sudah diperbaiki beberapa bulan lalu. Sepertinya Anda memakai ZSH versi lama
    • Saya sempat ingin mencobanya di mesin Windows dengan RTX 4070, tetapi kedengarannya GPU tidak dipakai di WSL
      Saya penasaran apakah pengujiannya jauh lebih lambat saat hanya memakai CPU
  • Setelah mencari cepat di Hugging Face, terlihat beberapa Llamafile TinyLlama kelas sekitar 1B
    Jika ditambah dengan 3 llamafile yang sudah ada, totalnya jadi 6; saya penasaran apakah ada llamafile lain di alam liar

    • Saya tidak tahu jawaban pertanyaannya, tetapi penasaran apakah Anda tahu bahwa Anda bisa mengunduh executable llamafile-server mandiri dan menggunakannya dengan model gguf apa pun
  • Saya penasaran bagaimana HN memandang llamafile dan modelfile(https://github.com/jmorganca/ollama/blob/main/docs/modelfile...)
    Keduanya mengingatkan pada pengalaman seperti Dockerfile. Modelfile langsung terlihat seperti Dockerfile, tetapi llamafile tampak lebih sulit digunakan dan bentuk nyatanya tidak langsung terasa. Saya penasaran apakah itu berupa rangkaian perintah yang dijalankan di terminal
    Secara teori, saya juga penasaran mengapa tidak memakai Dockerfile saja

    • Fitur intinya adalah opsi --grammar, dan ini sangat bagus untuk skrip bash yang melakukan berbagai tugas klasifikasi pemrosesan bahasa alami dengan membatasi logit keluaran LLM
      Selain itu, jika butuh LLM lokal saya memakai ollama; saat menyewa server GPU saya memakai vllm; dan jika hanya butuh model terbaik saya memakai OpenAI API
    • https://news.ycombinator.com/item?id=38464057
    • llamafile tidak memakai Docker. Ini hanya executable
      Unduh llamafile, jalankan chmod +x, lalu jalankan dengan ./run
      Namun kombinasi Docker + llamafile juga memungkinkan. Ada konfigurasi Dockerfile yang cukup bagus di https://github.com/ajbouh/cosmos
  • Saya penasaran kelebihan dan kekurangan llamafile yang dipakai di tulisan asli dibanding ollama

    • llamafile pada dasarnya lebih dekat ke llama.cpp yang tidak perlu Anda build sendiri
      Jadi dengan upaya minimal, Anda bisa memakai berbagai knob konfigurasi. Khususnya jika mengunduh llamafile “server”, itu menjadi cara tercepat untuk menjalankan LLM lokal di tab browser
      https://huggingface.co/jartine/llava-v1.5-7B-GGUF/tree/main
      llamafile juga bisa menjadi chatbot command line, tetapi untuk penggunaan itu ollama memberikan pengalaman yang jauh lebih rapi dan matang
  • Saya ingin memastikan apakah pemahaman saya benar. Jika llamafile dijalankan dari skrip shell untuk mengganti nama file dalam direktori, apakah setiap kali nama file baru masuk, executable harus dibuka dan dimuat lagi?
    Kalau begitu, apakah memori itu dimuat dan dilepas setiap kali, atau ada caching keren yang tidak saya ketahui?
    Saat pertama kali menjalankan contoh caption gambar di M1 Pro, butuh 13 detik; kali kedua 8 detik, dan eksekusi berikutnya juga terus memakan waktu serupa
    Jika memproses file dalam jumlah sangat besar, sepertinya benar-benar perlu cara untuk memuat bobot sekali saja dan mempertahankannya selama proses melakukan loop
    Meski begitu, ini tetap sangat berguna dan menarik

    • Model di-memory map dari disk, jadi kernel yang menangani pembacaannya ke memori
      Selama RAM itu tidak diminta oleh hal lain, halaman-halaman tersebut tetap berada dalam cache memori di antara pemanggilan perintah
      Di workstation 128GB, bahkan saat memakai beberapa model 7B di CPU, semuanya tetap berada di cache
    • Perbedaan antara menjalankan main dari llama.cpp dan memakai server + permintaan HTTP POST memang cukup besar, tetapi bukan sampai menjungkirbalikkan dunia
      Pada model VRAM 8GB, untuk penyelesaian beberapa baris kira-kira 6 detik vs 2 detik, dan pada 3090 dengan RAM 96GB seluruh inferensi berjalan di GPU
      Jika benar-benar melakukan batch job, jelas lebih baik mempertahankan model di antara completion
      Sebaliknya, ada kekurangan bahwa Anda terikat pada model yang sudah dimuat sebagai server. Jika memuat setiap kali diperlukan, Anda bisa mengganti model
      Ini penting untuk kueri gambar multimodal, karena model lain tidak memahami token gambar yang diproyeksikan
  • Pada langkah instalasi ada perintah berikut, dan saya penasaran apakah ini aman

    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"  
    
  • Saya penasaran apakah perlu melakukan sesuatu untuk menjalankan llamafile di Windows 10
    Saat menjalankan llava-v1.5-7b-q4-server.llamafile dari git bash, proses langsung mati dengan “Segmentation fault”, dan di cmd tidak ada output sama sekali
    Saya juga sudah mencoba mengunduh llamafile dan model secara terpisah lalu menjalankan llamafile.exe -m llava-v1.5-7b-Q4_K.gguf, tetapi masalah yang sama tetap ada
    Saya tidak menemukan masalah serupa, dan menurut saya ini juga bukan masalah antivirus

    • Penasaran apakah Anda sudah mencobanya dari cmd.exe atau PowerShell
      Anda bisa meneruskan flag --strace, atau jika memungkinkan --ftrace, untuk melihat apa yang terjadi
    • Di Windows, nama .llamafile yang diunduh harus diubah menjadi .exe
    • Di Windows, .llamafile harus diubah namanya menjadi .exe