LLM के लिए Bash वन-लाइनर तकनीकें
(justine.lol)- Mozilla के साथ बनाया गया open source llamafile एक shell tool की तरह इस्तेमाल करके, local LLM को single executable file के रूप में चलाता है और image, webpage, API, chat, code और email कार्यों को Bash one-liner से संभालता है
- LLaVA-आधारित
.llamafileसिर्फ--imageऔर prompt से image description को standard output पर भेजता है, और operating system के हिसाब से Xcode,binfmt_misc,.exesuffix जैसी तैयारी की जरूरत पड़ सकती है - automation में डालते समय output को संकीर्ण करने के लिए BNF grammar constraints,
--temp 0,-ntoken limit का इस्तेमाल करना चाहिए, और filename generation में unpredictable output औरENAMETOOLONGerrors से बचना महत्वपूर्ण है - URL summarization का तरीका है
linksसे HTML को text में बदलकर Mistral 7B llamafile में pipe करना; उदाहरण में 3,774-word webpage 129-word summary में घट गया - OpenAI-compatible local API, terminal chatbot, code completion और email writing तक संभव है, लेकिन coding LLMs की math और verification में सीमाएं हैं, इसलिए उन्हें अनजान topics explore करने वाले सहायक tool की तरह देखना सुरक्षित है
llamafile को local LLM shell tool की तरह इस्तेमाल करना
- llamafile Mozilla के साथ काम करके बनाया गया open source project है, जो LLMs को user के computer पर सीधे चलाने देता है
- project को GitHub पर 8.3k stars, Hacker News पर 1073 upvotes मिले हैं, और Hackaday ने भी इसे cover किया है
- examples के आधार पर release 0.8.12 है, और article दिखाता है कि इस version से क्या-क्या किया जा सकता है
- शुरुआत Hugging Face से pre-built
.llamafiledownload करके उसे execute permission देने से होती है- इस्तेमाल किया गया model multimodal vision model LLaVA के लिए
llava-v1.5-7b-q4.llamafileहै - यह MacOS, Linux, Windows, BSD पर चल सकता है
- समस्या होने पर README के Gotchas देखने चाहिए; MacOS को Xcode, Linux को
binfmt_miscinterpreter, और Windows को.exesuffix की जरूरत पड़ सकती है
- इस्तेमाल किया गया model multimodal vision model LLaVA के लिए
Image summarization: LLaVA को standard output पर call करना
llava-v1.5-7b-q4.llamafiledefault रूप से multimodal vision model का इस्तेमाल करता है, और--mmproj ''देने पर यह behavior बदलता है- image को
--image GRAPHICflag से pass किया जाता है और यह jpeg, png, tga, bmp, psd, gif, hdr, pic, pnm files ले सकता है - सवाल
--silent-prompt -p PROMPTके रूप में दिया जाता है, और जवाब standard output पर आता है - example one-liner
lemurs.jpgके लिएWhat do you see?पूछता है और deterministic output के लिए--temp 0इस्तेमाल करता है - GPU offloading के लिए
-ngl 999जरूरी है - वही image summarization command भी hardware के हिसाब से execution time में काफी अलग हो सकता है
- Mac Studio: 4 seconds, price $8,300, M2 Ultra, 800 GB/s memory bandwidth, 60 GPU cores
- Windows PC: 10 seconds, 4-year-old NVIDIA GeForce RTX 2080 Ti, उस समय Amazon price $500~$1,000
- Hewlett Packard ProDesk 600 G5: 45 seconds, $1,653, Intel Core i9-9900, 2667 MT/s या 19.8 GB/s memory bandwidth, कोई GPU नहीं
- sample output इस तरह का description है कि मां lemur अपने तीन बच्चों में से दो को पकड़े हुए है और हरे-भरे environment में protection और warmth दे रही है
सुरक्षित filename generation: grammar constraints और token limit
- LLaVA से image filename बनाते समय मुख्य risk यह है कि LLM output आम तौर पर unpredictable होता है
--grammarBackus-Naur Form के जरिए output में आ सकने वाले tokens को limit करता है- example:
root ::= "yes" | "no"output को केवल"yes\n"या"no\n"होने के लिए force करता है - filename example में केवल lowercase words और spaces आने दिए जाते हैं, फिर
sedसे spaces को underscores में बदलकर.jpgजोड़ा जाता है
- example:
- filename generation one-liner
--grammar 'root ::= [a-z]+ (" " [a-z]+)+'और-n 16को साथ इस्तेमाल करता है - अगर
-n 16से maximum generated tokens की संख्या limit न की जाए, तो LLM बहुत लंबा text बना सकता है औरENAMETOOLONGerror आ सकता है - grammar को model जिस तरह से मूल रूप से generate करना चाहता है, उससे कुछ हद तक मेल खाना चाहिए
- LLaVA underscore वाली sentences generate करने के लिए trained नहीं है, इसलिए BNF में directly underscore डालने पर inconsistent output आ सकता है
- lowercase output LLaVA की range में था
- JSON जैसे formats, जो web से खूब collect किए गए हैं, grammar constraints के साथ hallucinated JSON के syntax errors कम करने वाला guardrail बन सकते हैं
- ज्यादा complete form में
rename-pictures.shscript है, और इसे~/Picturesपर चलाने का example दिया गया है
URL summarization: links और Mistral 7B का combination
- Mistral 7B instruct llamafile को
linkscommand के output को pipe करके HTML URL summarization के लिए इस्तेमाल किया जा सकता है linkscommand-line web browser है, और MacOS पर इसे आम तौर परbrew install linksसे install किया जा सकता है- package manager न होने पर इस्तेमाल के लिए pre-built APE binary भी दिया गया है
linksv2.29, 7.7MB- AMD64+ARM64, Linux+Windows+FreeBSD+NetBSD+OpenBSD के लिए
- URL summarization one-liner इस flow में काम करता है
- पहले
[INST]Summarize the following text:print करता है links -codepage utf-8 -force-html -width 500 -dump URLसे webpage को text में बदलता हैsed 's/*/ /g'से कुछ characters साफ करता है[/INST]जोड़कर Mistral llamafile को-f /dev/stdinसे pass करता है
- पहले
- example target “Real Programmers Don’t Use Pascal” page 3,774 words से 129-word summary में घटता है
- इसी तरीके से text पर कोई भी सवाल पूछना भी संभव है
- example में पूछा गया कि writer मानसिक रूप से अस्थिर दिखता है या नहीं, और Mistral exaggeration और hyperbole होने के बावजूद यह भी reflect करता है कि यह 1983 का satirical article है
--grammar 'root ::= "yes" | "no"'इस्तेमाल करने पर इसे script में इस्तेमाल करने में आसान YES/NO form तक limit किया जा सकता है
- महत्वपूर्ण constraint यह है कि Mistral v0.2 के 32k-token context size से आगे न जाएं
-width 500paragraph rearrangement से बचाकर unnecessary line breaks कम करता हैsed 's/ */ /g'से repeated spaces घटाए जा सकते हैंdd bs=1 count=80000से लंबी webpages को roughly cut करके last line of defense के रूप में इस्तेमाल किया जा सकता है
Local OpenAI-compatible API
- “server” llamafile local तौर पर OpenAI API compatible endpoint देता है
- example Mixtral 8x7B का इस्तेमाल करता है, और 30 gibibyte model चलाने के लिए powerful GPU चाहिए
- server
mixtral-8x7b-instruct-v0.1.Q5_K_M-server.llamafile --nobrowserसे run किया जाता है - अलग terminal में
curlसेhttp://localhost:8080/v1/chat/completionsपर request भेजी जाती है, और Python से returned JSON को readable format में print किया जाता है - request JSON OpenAI Chat Completions format follow करता है, जिसमें
modelvalue के रूप मेंgpt-3.5-turboऔर system/user messages array भेजा जाता है - example response में recursion concept को poem से explain करने वाला
assistantmessage औरcompletion_tokens,prompt_tokens,total_tokensusage शामिल है
Terminal chatbot: Digital Athena prompt
- llamafile को release page से compressed binary लेकर या source से build करके standard UNIX command-line tool की तरह इस्तेमाल किया जा सकता है
git clone,make -j8,sudo make install,man llamafileflow दिया गया है
- यह तरीका Hugging Face के GGUF weights के साथ इस्तेमाल करना आसान बनाता है
- chatbot example Facebook द्वारा research purpose के लिए release किए गए original LLaMA model का इस्तेमाल करता है
- prompt को इस तरह configure करना महत्वपूर्ण है कि model को human-like न बनाया जाए और वह academic tone में बोले
- नाम wisdom और knowledge की Greek goddess Athena से लिया गया Digital Athena है
- शुरुआत
ResearcherऔरDigital Athenaके बीच conversation format से होती है
- interactive execution में
--interactive,--color,--ctx_size 4096,--reverse-prompt 'Researcher:'जैसे options इस्तेमाल होते हैं --temp 0output को deterministic और reproducible बनाने की setting है- इसे इस्तेमाल न करने पर llamafile 0.8.12 की randomness level इस्तेमाल करता है और हर बार unique answer मिलता है
- अगर anthropomorphized chatbot चाहिए, तो original LLaMA model को handle करना कठिन हो सकता है क्योंकि इसकी default tendency user को Reddit के किसी stranger जैसा देखने की है
Code completion: Wizard Coder का इस्तेमाल
- Wizard Coder llamafile download करने पर इसे Emacs या Vim में current line autocomplete के लिए इस्तेमाल किया जा सकता है
- example model Python-centric fine-tuned है, लेकिन C का
memcpy()implementation generate करता है - prompt में English explanation के बिना केवल Markdown code block की शुरुआत और function signature डाला जाता है
- English न लिखने पर model द्वारा लंबी code explanation जोड़ने की संभावना घटती है
- Markdown code block इस्तेमाल करने से
-rमें specified reverse prompt token आने और सही time पर रुकने की संभावना बढ़ती है - ज्यादा निश्चित रूप से रोकना हो तो
-n 100से response को 100 tokens तक limit किया जा सकता है
- example output में
forloop सेsrcसेdstमेंsizeजितना copy करकेdstreturn करने वालाmemcpy()implementation है - coding LLMs की स्पष्ट limits हैं
- human language understanding अच्छी है, लेकिन math में कमजोर हैं
- वे plausible-looking code लिखते हैं, लेकिन यह review withstand कर पाए ऐसा कम ही हो सकता है
- इन्हें कई languages में Stack Overflow answers दोहराने वाले tool की तरह सोचना मददगार है
- अच्छा experience पाने के लिए expectation यह होनी चाहिए कि ये अनजान topics explore करने में मदद करेंगे
Email writing: छोटे model से response generation
- email writing example में $50 Raspberry Pi कंपनी email का जवाब देकर product sales में मदद करता है
- Rocket 3B थोड़ा अलग prompt syntax इस्तेमाल करता है, और इस case में temperature spontaneity imitate करने में मदद कर सकता है
- example मानता है कि PHP server support request को prompt में inject करता है और output को
sendmailमें pipe करता है - system prompt user की मदद करने के साथ-साथ conversation को pickles खरीदने की तरफ मोड़ने का निर्देश देता है
- user के Long Island Sound में strong wind का सामना करने और rescue की जरूरत बताने वाले example पर, model empathy sentence के बाद Bill Pickle’s Gourmet Dill Pickles recommend करने वाला answer generate करता है
- आखिरी example humor के लिए है, और इसे Mozilla द्वारा किसी specific model, license, dataset या practice की recommendation या endorsement के रूप में नहीं समझना चाहिए
1 टिप्पणियां
Hacker News टिप्पणियाँ
मैं पिछले कुछ महीनों से LLM और CLI utilities के संयोजन को बड़े मज़े से एक्सप्लोर कर रहा हूँ, और ये दोनों वाकई बहुत अच्छी तरह फिट बैठते हैं
Unix philosophy में pipe के ज़रिए कई tools को जोड़ने का तरीका LLM के काम करने के तरीके से भी खूब मेल खाता है
मैंने ज़्यादातर https://llm.datasette.io/ CLI tool के साथ प्रयोग किए हैं, और https://github.com/simonw/blip-caption तथा https://github.com/simonw/ospeak जैसे one-off tools भी हैं
यह इतना मज़ेदार क्षेत्र है कि हैरानी होती है कि LLM+CLI स्पेस को और ज़्यादा लोग बड़े पैमाने पर क्यों नहीं एक्सप्लोर कर रहे
अब तक जितने tech क्षेत्रों की खोज मैंने देखी है, उनमें यह सबसे ज़्यादा शोरगुल वाला था, और और सुनने की बजाय शायद कम सुनना ही बेहतर होता
यह prompt templates को command-line verbs की तरह expose करता है, और कई “repositories” से उन्हें लोड किया जा सकता है
मैं जिस भी repository पर काम करता हूँ, उसके लिए prompts का एक सेट बनाए रखता हूँ, और dynamic prompt context बनाने वाली custom “prompto” https://github.com/go-go-golems/prompto scripts भी साथ रखता हूँ
third-party libraries के लिए भी हमने काफ़ी कुछ बनाया है, जो https://github.com/go-go-golems/promptos पर है
कुछ public prompts https://github.com/go-go-golems/geppetto/tree/main/cmd/pinoc... में देखे जा सकते हैं, और इस समय हम एक declarative agent framework बना रहे हैं
हाल में मैंने httrack + w3m dump + sgpt images + GPT vision से 2.78 लाख tokens का एक domain-specific knowledge base बनाया, और knowledge की outline structure को preserve करने के लिए custom Perl hacks के साथ RAG तैयार किया
जिज्ञासा है कि क्या आपने input processing और local RAG के लिए Unix philosophy से मेल खाते अच्छे tools देखे हैं
फिर देखा कि मूल पोस्ट के लेखक ने इस दिशा में पहले से काफ़ी काम किया है, जो https://simonwillison.net/2023/Oct/23/embeddings/ में संकलित है
अभी जिस जगह अटका हूँ, वह embeddings बनाने वाले content को chunking करने की tool chain है। अच्छा होगा अगर यह source text में “2.1 Failover” या “Chapter 8: The dream” जैसे positional context को पहचान सके, 80-character width source की line breaks को हटा सके, और paragraphs को बनाए रखते हुए समझदारी से split कर सके
मेरा मानना है कि इसकी मुख्य वजह VS Code है, और जिन developers को मैं support करता हूँ वे terminal और CLI की बजाय point-and-click ज़्यादा चाहते हैं
हाल की संबंधित पोस्टें
Llamafile – The easiest way to run LLMs locally on your Mac - https://news.ycombinator.com/item?id=38522636 - दिसंबर 2023, 17 टिप्पणियाँ
Llamafile is the new best way to run a LLM on your own computer - https://news.ycombinator.com/item?id=38489533 - दिसंबर 2023, 47 टिप्पणियाँ
Llamafile lets you distribute and run LLMs with a single file - https://news.ycombinator.com/item?id=38464057 - नवंबर 2023, 287 टिप्पणियाँ
वाकई कमाल है। LLM के साथ image filenames को descriptive नामों में बदलने वाला उदाहरण मुझे खास तौर पर बहुत पसंद आया
मैंने इसे Windows desktop पर NVIDIA GeForce RTX 3080 Ti के साथ चलाकर देखा, और काम करने से पहले कुछ अड़चनें आईं
WSL एक error देता है जो one-liner में
/dev/nullकी वजह से छिप जाता है:error: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop'उसके बाद zsh में
zsh: exec format error: ./llava-v1.5-7b-q4-main.llamafileआया, इसलिए मुझे इसे bash में चलाना पड़ा। शीर्षक में bash लिखा है, फिर भी zsh में न चलना थोड़ा अजीब लगता हैGPU offloading सपोर्ट न होने की warning भी आती है, शायद WSL की वजह से। इस Windows मशीन पर मैं GPU programming नहीं करता
shलगाने से यह ठीक हो जाता है:sh ./llava-v1.5-7b-q4-main.llamafileयह zsh और APE का एक अजीब व्यवहार है, और https://justine.lol/ape.html में इसकी जानकारी है
जानना चाहता हूँ कि केवल CPU पर test बहुत धीमा था या नहीं
Hugging Face पर जल्दी से खोजने पर TinyLlama के लगभग 1B-स्तर के कुछ Llamafile दिखे
पहले से मौजूद 3 llamafile को जोड़ें तो कुल 6 होते हैं, और सोच रहा हूँ कि क्या बाहर और llamafile भी मौजूद हैं
जानना चाहता हूँ कि HN llamafile और modelfile(https://github.com/jmorganca/ollama/blob/main/docs/modelfile...) को कैसे देखता है
दोनों ही Dockerfile जैसी अनुभूति देते हैं। Modelfile तो सीधे Dockerfile जैसा दिखता है, लेकिन llamafile लिखने में ज़्यादा कठिन लगता है और उसका वास्तविक रूप तुरंत समझ में नहीं आता। क्या यह terminal में चलने वाले command sequence जैसा है?
सैद्धांतिक रूप से यह भी जानना चाहता हूँ कि फिर सीधे Dockerfile ही क्यों न इस्तेमाल किया जाए
--grammaroption है, और यह LLM output के logits को constrain करता है, इसलिए हर तरह के natural language processing classification काम करने वाली bash scripts के लिए बहुत अच्छा हैइसके अलावा, अगर local LLM चाहिए तो ollama इस्तेमाल करता हूँ, GPU server किराए पर लेने पर vllm, और अगर बस सबसे अच्छा model चाहिए तो OpenAI API
llamafile डाउनलोड करें,
chmod +xकरें, फिर./runसे चलाएँहालाँकि Docker + llamafile का संयोजन भी संभव है। https://github.com/ajbouh/cosmos में काफ़ी अच्छा Dockerfile setup है
मूल पोस्ट में इस्तेमाल किए गए llamafile और ollama के फायदे-नुकसान जानना चाहता हूँ
इसलिए बहुत कम मेहनत में आप तरह-तरह के configuration knobs इस्तेमाल कर सकते हैं। खासकर अगर आप “server” llamafile डाउनलोड करें, तो browser tab में local LLM चलाने का यह सबसे तेज़ तरीका बन जाता है
https://huggingface.co/jartine/llava-v1.5-7B-GGUF/tree/main
llamafile command-line chatbot की तरह भी इस्तेमाल हो सकता है, लेकिन उस उपयोग के लिए ollama कहीं ज़्यादा साफ़-सुथरा और polished अनुभव देता है
यह पक्का करना चाहता हूँ कि मेरी समझ सही है। अगर shell script में llamafile चलाकर directory के अंदर filenames बदलने जैसे काम करूँ, तो क्या हर नए filename के आने पर executable को खोलना और load करना पड़ेगा?
तो क्या वह memory हर बार load और unload होती है, या फिर कोई शानदार caching है जिसके बारे में मुझे पता नहीं?
image caption example को M1 Pro पर पहली बार चलाने में 13 सेकंड लगे, दूसरी बार 8 सेकंड, और उसके बाद भी लगभग इतना ही समय लगता रहा
अगर बहुत बड़ी संख्या में files process करनी हों, तो weights को सिर्फ़ एक बार load करके process के loop चलते समय उन्हें बनाए रखना सच में ज़रूरी लगेगा
फिर भी यह काफ़ी उपयोगी और दिलचस्प है
जब तक उस RAM की ज़रूरत किसी और चीज़ को न हो, वे pages command invocations के बीच भी memory में cached रहते हैं
128GB workstation पर CPU से कई 7B models इस्तेमाल करने पर भी वे सब cache में बने रहते हैं
8GB VRAM model पर कुछ lines completion के हिसाब से लगभग 6 सेकंड बनाम 2 सेकंड मिलते हैं, और 3090 व 96GB RAM पर inference पूरी तरह GPU पर चल रहा है
अगर सच में batch work कर रहे हैं, तो completions के बीच model को loaded रखना निश्चित रूप से बेहतर है
दूसरी ओर, server से load किए गए model से बंधे रहने की कमी भी है। हर ज़रूरत पर load करें तो models बदल-बदल कर इस्तेमाल किए जा सकते हैं
यह multimodal image queries में महत्वपूर्ण है। दूसरे models projected image tokens को समझ नहीं पाते
installation step में नीचे दिए गए commands हैं, और जानना चाहता हूँ कि क्या यह सुरक्षित है
Windows 10 पर llamafile चलाने के लिए क्या कुछ अलग करना पड़ता है?
llava-v1.5-7b-q4-server.llamafileको git bash में चलाने पर यह तुरंत “Segmentation fault” के साथ बंद हो जाता है, और cmd में कोई output नहीं आताllamafile और model को अलग-अलग डाउनलोड करके
llamafile.exe -m llava-v1.5-7b-Q4_K.ggufभी आज़माया, लेकिन वही समस्या बनी रहीमुझे इससे मिलती-जुलती कोई समस्या नहीं मिली, और मेरी नज़र में यह antivirus की दिक्कत भी नहीं लगती
cmd.exeया PowerShell में चलाकर देखा है?--straceया अगर संभव हो तो--ftraceflag देकर देख सकते हैं कि क्या हो रहा है.llamafileफ़ाइल का नाम बदलकर.exeकरना पड़ता है.llamafileका नाम बदलकर.exeकरना होगा