1 पॉइंट द्वारा GN⁺ 2023-12-15 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 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, .exe suffix जैसी तैयारी की जरूरत पड़ सकती है
  • automation में डालते समय output को संकीर्ण करने के लिए BNF grammar constraints, --temp 0, -n token limit का इस्तेमाल करना चाहिए, और filename generation में unpredictable output और ENAMETOOLONG errors से बचना महत्वपूर्ण है
  • 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 .llamafile download करके उसे execute permission देने से होती है
    • इस्तेमाल किया गया model multimodal vision model LLaVA के लिए llava-v1.5-7b-q4.llamafile है
    • यह MacOS, Linux, Windows, BSD पर चल सकता है
    • समस्या होने पर README के Gotchas देखने चाहिए; MacOS को Xcode, Linux को binfmt_misc interpreter, और Windows को .exe suffix की जरूरत पड़ सकती है

Image summarization: LLaVA को standard output पर call करना

  • llava-v1.5-7b-q4.llamafile default रूप से multimodal vision model का इस्तेमाल करता है, और --mmproj '' देने पर यह behavior बदलता है
  • image को --image GRAPHIC flag से 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 होता है
  • --grammar Backus-Naur Form के जरिए output में आ सकने वाले tokens को limit करता है
    • example: root ::= "yes" | "no" output को केवल "yes\n" या "no\n" होने के लिए force करता है
    • filename example में केवल lowercase words और spaces आने दिए जाते हैं, फिर sed से spaces को underscores में बदलकर .jpg जोड़ा जाता है
  • filename generation one-liner --grammar 'root ::= [a-z]+ (" " [a-z]+)+' और -n 16 को साथ इस्तेमाल करता है
  • अगर -n 16 से maximum generated tokens की संख्या limit न की जाए, तो LLM बहुत लंबा text बना सकता है और ENAMETOOLONG error आ सकता है
  • 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.sh script है, और इसे ~/Pictures पर चलाने का example दिया गया है

URL summarization: links और Mistral 7B का combination

  • Mistral 7B instruct llamafile को links command के output को pipe करके HTML URL summarization के लिए इस्तेमाल किया जा सकता है
  • links command-line web browser है, और MacOS पर इसे आम तौर पर brew install links से install किया जा सकता है
  • package manager न होने पर इस्तेमाल के लिए pre-built APE binary भी दिया गया है
    • links v2.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 500 paragraph 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 करता है, जिसमें model value के रूप में gpt-3.5-turbo और system/user messages array भेजा जाता है
  • example response में recursion concept को poem से explain करने वाला assistant message और completion_tokens, prompt_tokens, total_tokens usage शामिल है

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 llamafile flow दिया गया है
  • यह तरीका 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 0 output को 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 में for loop से src से dst में size जितना copy करके dst return करने वाला 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 टिप्पणियां

 
GN⁺ 2023-12-15
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 स्पेस को और ज़्यादा लोग बड़े पैमाने पर क्यों नहीं एक्सप्लोर कर रहे

    • पिछले 9 महीनों में Hacker News और Twitter के पहले पेज का 70% तरह-तरह की LLM CLI चर्चाओं से भरा था
      अब तक जितने tech क्षेत्रों की खोज मैंने देखी है, उनमें यह सबसे ज़्यादा शोरगुल वाला था, और और सुनने की बजाय शायद कम सुनना ही बेहतर होता
    • काम में मैं https://github.com/go-go-golems/geppetto का बहुत इस्तेमाल कर रहा हूँ, जिसमें CLI mode और TUI chat mode दोनों हैं
      यह 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 बना रहे हैं
    • अच्छे links हैं। मैं https://github.com/npiv/chatblade और https://github.com/tbckr/sgpt इस्तेमाल कर रहा था, और मैं पूरी तरह सहमत हूँ कि LLM+CLI एकदम परफेक्ट संयोजन है
      हाल में मैंने 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 कर सके
    • CLI-केंद्रित workflow को लेकर उत्साह धीरे-धीरे कम होता दिख रहा है
      मेरा मानना है कि इसकी मुख्य वजह 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 नहीं करता

    • zsh में command के आगे sh लगाने से यह ठीक हो जाता है: sh ./llava-v1.5-7b-q4-main.llamafile
      यह zsh और APE का एक अजीब व्यवहार है, और https://justine.lol/ape.html में इसकी जानकारी है
    • यह एक ZSH bug था, और कुछ महीने पहले इसे ठीक कर दिया गया था। लगता है आप पुराना ZSH इस्तेमाल कर रहे हैं
    • मैं RTX 4070 वाली Windows मशीन पर इसे आज़माने वाला था, लेकिन ऐसा लगता है कि WSL में GPU इस्तेमाल नहीं होता
      जानना चाहता हूँ कि केवल CPU पर test बहुत धीमा था या नहीं
  • Hugging Face पर जल्दी से खोजने पर TinyLlama के लगभग 1B-स्तर के कुछ Llamafile दिखे
    पहले से मौजूद 3 llamafile को जोड़ें तो कुल 6 होते हैं, और सोच रहा हूँ कि क्या बाहर और llamafile भी मौजूद हैं

    • सवाल का जवाब तो नहीं पता, लेकिन क्या आपको पता था कि आप standalone llamafile-server executable डाउनलोड करके उसे किसी भी gguf मॉडल के साथ इस्तेमाल कर सकते हैं?
  • जानना चाहता हूँ कि HN llamafile और modelfile(https://github.com/jmorganca/ollama/blob/main/docs/modelfile...) को कैसे देखता है
    दोनों ही Dockerfile जैसी अनुभूति देते हैं। Modelfile तो सीधे Dockerfile जैसा दिखता है, लेकिन llamafile लिखने में ज़्यादा कठिन लगता है और उसका वास्तविक रूप तुरंत समझ में नहीं आता। क्या यह terminal में चलने वाले command sequence जैसा है?
    सैद्धांतिक रूप से यह भी जानना चाहता हूँ कि फिर सीधे Dockerfile ही क्यों न इस्तेमाल किया जाए

    • मुख्य फीचर --grammar option है, और यह LLM output के logits को constrain करता है, इसलिए हर तरह के natural language processing classification काम करने वाली bash scripts के लिए बहुत अच्छा है
      इसके अलावा, अगर local LLM चाहिए तो ollama इस्तेमाल करता हूँ, GPU server किराए पर लेने पर vllm, और अगर बस सबसे अच्छा model चाहिए तो OpenAI API
    • https://news.ycombinator.com/item?id=38464057
    • llamafile Docker का इस्तेमाल नहीं करता। यह बस एक executable है
      llamafile डाउनलोड करें, chmod +x करें, फिर ./run से चलाएँ
      हालाँकि Docker + llamafile का संयोजन भी संभव है। https://github.com/ajbouh/cosmos में काफ़ी अच्छा Dockerfile setup है
  • मूल पोस्ट में इस्तेमाल किए गए llamafile और ollama के फायदे-नुकसान जानना चाहता हूँ

    • llamafile मूल रूप से ऐसे llama.cpp के अधिक क़रीब है जिसे खुद build करने की ज़रूरत नहीं होती
      इसलिए बहुत कम मेहनत में आप तरह-तरह के 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 चलते समय उन्हें बनाए रखना सच में ज़रूरी लगेगा
    फिर भी यह काफ़ी उपयोगी और दिलचस्प है

    • model डिस्क से memory-mapped होता है, इसलिए kernel उसे memory में पढ़ने का काम संभालता है
      जब तक उस RAM की ज़रूरत किसी और चीज़ को न हो, वे pages command invocations के बीच भी memory में cached रहते हैं
      128GB workstation पर CPU से कई 7B models इस्तेमाल करने पर भी वे सब cache में बने रहते हैं
    • llama.cpp के main को चलाने और server + POST HTTP requests इस्तेमाल करने के बीच काफ़ी फ़र्क है, लेकिन इतना भी नहीं कि सब कुछ बदल जाए
      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 हैं, और जानना चाहता हूँ कि क्या यह सुरक्षित है

    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"  
    
  • 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 या अगर संभव हो तो --ftrace flag देकर देख सकते हैं कि क्या हो रहा है
    • Windows में डाउनलोड की गई .llamafile फ़ाइल का नाम बदलकर .exe करना पड़ता है
    • Windows में .llamafile का नाम बदलकर .exe करना होगा