Teknik One-liner Bash untuk LLM
(justine.lol)- 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
.llamafileberbasis LLaVA dapat mengeluarkan deskripsi gambar ke standard output hanya dengan--imagedan prompt; tergantung sistem operasi, persiapan seperti Xcode,binfmt_misc, atau sufiks.exemungkin 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 errorENAMETOOLONG - 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
.llamafileyang sudah dibangun sebelumnya dari Hugging Face lalu memberinya izin eksekusi- Model yang digunakan adalah
llava-v1.5-7b-q4.llamafileuntuk 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
- Model yang digunakan adalah
Ringkasan gambar: memanggil LLaVA ke standard output
llava-v1.5-7b-q4.llamafilesecara 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?untuklemurs.jpgdan memakai--temp 0untuk 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
--grammarmembatasi 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
seduntuk mengganti spasi menjadi garis bawah dan menambahkan.jpg
- Contoh:
- 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 errorENAMETOOLONG - 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 linksadalah browser web command-line, dan di MacOS biasanya dapat diinstal denganbrew install links- Juga tersedia binary APE yang sudah dibangun sebelumnya untuk digunakan ketika tidak ada package manager
linksv2.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
- Mencetak
- 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 500membantu menghindari penyusunan ulang paragraf sehingga mengurangi line break yang tidak perlu- Spasi berulang dapat dikurangi dengan
sed 's/ */ /g' dd bs=1 count=80000dapat 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
curlkehttp://localhost:8080/v1/chat/completions, lalu JSON yang dikembalikan dicetak rapi dengan Python - JSON permintaan mengikuti format OpenAI Chat Completions: memasukkan
gpt-3.5-turbosebagai nilaimodeldan mengirim array pesan system serta user - Respons contoh mencakup pesan
assistantyang menjelaskan konsep rekursi lewat puisi, serta penggunaancompletion_tokens,prompt_tokens, dantotal_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
- Alur yang ditunjukkan adalah
- 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
ResearcherdanDigital Athena
- Untuk eksekusi interaktif digunakan opsi seperti
--interactive,--color,--ctx_size 4096, dan--reverse-prompt 'Researcher:' --temp 0adalah 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
-rmuncul 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 sebanyaksizedarisrckedstdengan loopfordan mengembalikandst - 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
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
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
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
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
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/nulldalam one-linerSetelah 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 zshAda juga peringatan bahwa GPU offloading tidak didukung, mungkin karena WSL. Saya tidak melakukan pemrograman GPU di mesin Windows ini
shdi depan perintah:sh ./llava-v1.5-7b-q4-main.llamafileIni perilaku khas zsh dan APE, dan ada pembahasan terkait di https://justine.lol/ape.html
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 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
--grammar, dan ini sangat bagus untuk skrip bash yang melakukan berbagai tugas klasifikasi pemrosesan bahasa alami dengan membatasi logit keluaran LLMSelain 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
Unduh llamafile, jalankan
chmod +x, lalu jalankan dengan./runNamun 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
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
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
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
Saya penasaran apakah perlu melakukan sesuatu untuk menjalankan llamafile di Windows 10
Saat menjalankan
llava-v1.5-7b-q4-server.llamafiledari git bash, proses langsung mati dengan “Segmentation fault”, dan di cmd tidak ada output sama sekaliSaya 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 adaSaya tidak menemukan masalah serupa, dan menurut saya ini juga bukan masalah antivirus
cmd.exeatau PowerShellAnda bisa meneruskan flag
--strace, atau jika memungkinkan--ftrace, untuk melihat apa yang terjadi.llamafileyang diunduh harus diubah menjadi.exe.llamafileharus diubah namanya menjadi.exe