Llama2.c: शुद्ध C फ़ाइल में Llama 2 inference
(github.com/karpathy)- llama2.c एक “fullstack” training·inference solution है, जो PyTorch से Llama 2 LLM architecture को train करता है और एक साधारण C फ़ाइल
run.cसे inference चलाता है - इसका मुख्य फोकस minimalism और simplicity है, और यह Llama 2 architecture को hardcode करके dependency-free शुद्ध C inference फ़ाइल के रूप में बनाया गया एक शैक्षणिक implementation है
- यह इस दृष्टिकोण से TinyStories आधारित example model प्रदान करता है कि बहुत छोटे LLM भी यदि domain पर्याप्त रूप से संकीर्ण हो तो मजबूत performance दे सकते हैं
- 15M parameter model लगभग 60MB download है और
make runके बाद./run stories15M.binसे चलाया जा सकता है - 42M और 110M parameter model भी दिए गए हैं, और 110M model को GPT-1 के समान आकार का बताया गया है
- 15M parameter model लगभग 60MB download है और
- Meta के Llama 2 model का neural network architecture भी समान है, इसलिए inference संभव है, लेकिन checkpoint को Meta के निर्देशों के अनुसार प्राप्त करने के बाद
export.pyसे llama2.c format में convert करना होगा- अभी
run.cकेवल fp32 inference करता है, इसलिए 7B से बड़े model को प्रोडक्टिव तरीके से load करना मुश्किल होने की संभावना है - 13B या उससे बड़े model अभी pointer arithmetic में integer overflow के कारण काम नहीं करते, और यह अभी तक ठीक नहीं किया गया है
- अभी
- int8 quantized inference
runq.cमें implemented है, और Q8_0 तरीके से matmul में भाग लेने वाले weights को quantize किया जाता है, जबकि activation values को runtime पर dynamic quantization·dequantization किया जाता है- Llama 2 7B fp32 export 26GB फ़ाइल बनाता है, और version 2 quantized export 6.7GB फ़ाइल बनाता है
- लेखक के environment में OpenMP 64-thread के आधार पर fp32 4.6 tok/s और int8 14 tok/s पर चला, जिससे checkpoint size 4 गुना कम और लगभग 3 गुना speedup मिला
- उपयोग का तरीका C inference execution, prompt input, temperature और top-p sampling control, chat mode execution, और custom tokenizer specification से बना है
- example execution का format
./run stories42M.bin -t 0.8 -n 256 -i "One day, Lily met a Shoggoth"है - chat model को
./run llama2_7b_chat.bin -m chatकी तरह-m chatflag से चलाया जाता है - custom tokenizer को
tokenizer.pyसे.binformat में export करने के बाद-zflag से specify किया जाता है
- example execution का format
- Hugging Face पर Llama 2 architecture का उपयोग करने वाले model को
export.pyके--hfflag से.binफ़ाइल में export किया जा सकता है - training flow में TinyStories download·pre-tokenization,
train.pyexecution, model export, और फिर C inference शामिल है- फिलहाल दिया गया default TinyStories example ही उपलब्ध एकमात्र dataset example है
- custom tokenizer training के लिए
sentencepieceका उपयोग होता है, और उदाहरण के तौर पर--vocab_size=4096setting इस्तेमाल की जाती है
- performance-related build को
make run,make runfast,make runompमें बांटा गया है, और OpenMP build matmul और attention के भीतर#pragma omp parallel forको enable करके loop work को कई processor में विभाजित करता है - platform build instructions Windows, Centos 7, Amazon Linux 2018, और Mac के लिए दिए गए हैं
- Windows में
build_msvc.batयाmake win64का उपयोग होता है - Centos 7 और Amazon Linux 2018 में
make rungnuयाmake runompgnuका उपयोग होता है - Mac पर OpenMP build के लिए brew का clang install करने के बाद
make runomp CC=/opt/homebrew/opt/llvm/bin/clangका उपयोग होता है
- Windows में
- testing के लिए
pytestऔर C testmake testccदिए गए हैं, औरtest_all.pyC और Python में 200-step forward चलाकर ज्ञात expected output से तुलना करता है - project का लक्ष्य 2 आसान-पढ़ने योग्य
.pytraining files और C inference code से बना एक सरल reference implementation बनाए रखना है, और यह complex framework या बहुत सारे options की दिशा में नहीं जाता - लाइसेंस MIT है
1 टिप्पणियां
Hacker News की राय
HN पर यह आया तो काफ़ी दिलचस्प लगा :) असली checkpoint को MacBook Air M1 पर
-O3के साथ compile करने पर उम्मीद से कहीं तेज़ 100 tok/s मिला, इसलिए अब एक बड़ा 44M मॉडल train किया जा रहा हैफिर भी लगता है कि इसे interactive तौर पर चलाया जा सकेगा, और शायद 7B Llama मॉडल तक पहुँचना भी संभव हो सकता है
nanoGPTमें थोड़ा बदलाव करके TinyStories के GPT-4 generated 2GB डेटा पर 12M मॉडल को pretrain करके देखा, और नतीजे काफ़ी चौंकाने वाले थेबाद में इसे Wikipedia पर थोड़ा adapt किया, तो यह smoothed n-gram मॉडल से कहीं ज़्यादा समझदार और उससे भी छोटा, लेकिन काफ़ी भरोसेमंद बकवास-जनरेटर बन गया। लगता है छोटे LLM कई क्षेत्रों में mainstream बनेंगे, और अगला लक्ष्य Llama2 7B को 10~100M तक छोटा करना है, बिना उसे बहुत ज़्यादा बेवकूफ़ बनाए
Linode जैसी जगह से GPU instance किराए पर लेना सामान्य web app server से बहुत महँगा पड़ता है, तो जानना चाहता हूँ कि क्या यह पूरी तरह अव्यावहारिक क्षेत्र है, या यह तरीका या कोई और तरीका वास्तव में काम का हो सकता है
llama.cpp के लिए मशहूर Georgi Gerganov का Emscripten के साथ browser में चलने वाला एक version है: https://ggerganov.com/llama2.c/
चल रही Twitter thread यहाँ है: https://twitter.com/ggerganov/status/1683174252990660610
मूल काम और यह दोनों ही सच में शानदार हैं, और भले ही यह बहुत छोटे मॉडल के साथ किया गया proof of concept हो, फिर भी local-first LLM खास तौर पर दिलचस्प है। local inference के साथ web app बन सकने का विचार बहुत अच्छा है
अगर यह optimization, छोटे मॉडल पर शोध, partial download, और WebGPU के उपयोग तक आगे बढ़ता है, तो यह private local LLM-आधारित apps बनाने के नए तरीकों की शुरुआत बन सकता है। top-end GPU वाले बड़े cluster पर host किए गए LLM जैसी क्षमता पाना मुश्किल होगा, लेकिन इस तरीके से खुलने वाले use cases बहुत हैं
उदाहरण के लिए, यह “Once upon a time...” से शुरू होकर Lily और Timmy की कहानी जैसा दिखता है, फिर “Butterfly would pauseWhy”, “TextField”,
querySelector,HttpRequestऔर कई भाषाओं के टुकड़ों के साथ पूरी तरह टूटे हुए output में बदल जाता हैजिन लोगों को दिलचस्पी हो, उनके लिए Rust version भी है। release mode में लगभग 106 tokens/second मिलता है
https://github.com/garrisonhess/llama2.c/blob/517a1a3e487f31...
non-web version GPU को पूरी तरह support करता है, लेकिन बिल्कुल minimal नहीं है
कभी-कभी इससे project को बेहतर बनाने की community की कोशिशें बिखर भी जाती हैं
लगता है बहुत लोग यह नहीं समझते कि यह कदम कितना साहसी है
Andrej, OpenAI(MSFT) से बड़ा compensation लेते हुए भी, Apple, Facebook, और उससे भी महत्वपूर्ण open source movement की मदद कर रहे हैं। फिर भी उन्हें हटाना आसान नहीं होगा, क्योंकि उसके बाद वे सीधे Tesla या xAI जा सकते हैं
लगता है Llama-2 में creative काम के लिए इस्तेमाल करना मुश्किल हो जाने जितनी safety filtering है: https://i.imgur.com/GFY0wSL.png
हालाँकि यह व्यवहार कुछ हद तक सिर्फ तब reproduce हुआ जब इसे Llama2-70b-chat TGI Hugging Face में दूसरे message के रूप में भेजा गया, इसलिए हो सकता है prompting के तरीके में कुछ अजीब बात हो जो ऐसा व्यवहार करा रही हो। मैं अभी खुद मॉडल चलाकर इसकी और जाँच नहीं कर पाया हूँ
Chat/instruct मॉडल third-party users को वितरित करने में आसान होते हैं, prompt सरल होता है, और इनमें safety guardrails होते हैं, लेकिन खुद इस्तेमाल करने के लिए ये pretrained मॉडल की तुलना में सच में बहुत कमतर हैं। इस मामले में Llama 2, OpenAI से बेहतर स्थिति में हो सकता है, क्योंकि OpenAI ने GPT-3 pretrained मॉडल को हटा दिया है और आगे सिर्फ chat मॉडल देने की दिशा में जाता दिख रहा है
मुझे safety scissors नहीं चाहिए। जो चीज़ें उनके अपने server पर चलती हैं, उन पर रोक लगाना ठीक है, लेकिन ऐसा मॉडल नहीं देना चाहिए जिसे मैं अपने कंप्यूटर पर अपनी मर्ज़ी से बदल और इस्तेमाल न कर सकूँ
Andrej ने इसके बारे में ज़्यादा विस्तार से यहाँ पोस्ट किया है: https://twitter.com/karpathy/status/1683143097604243456?s=46...
संदर्भ के लिए, अगर आपकी ऐसे विषयों में रुचि है, तो यह कोड WASI SDK के साथ साफ़-सुथरे तरीके से build हो जाता है और बिना किसी बदलाव के Wasm runtime में चल जाता है
जिज्ञासा है कि neural network चलाने के लिए वास्तव में कितनी memory चाहिए
क्या डिस्क से शुरुआत में सिर्फ़ पहली दो layers पढ़कर, सभी nodes के activation values निकालकर, फिर पहली layer को हटा देना, उसके बाद तीसरी layer पढ़कर फिर से गणना करना और दूसरी layer को हटा देना—क्या इतना काफ़ी होगा? अगर हाँ, तो क्या memory में सिर्फ़ दो layers रखने भर की क्षमता होना पर्याप्त है?
सार यह है कि maximum RAM quantization method पर निर्भर करता है, और मोटे तौर पर 7B model के लिए 4~8GB, 13B model के लिए 8~15GB, 30B model के लिए 13~33GB, और 70B model के लिए 31~75GB की range है
अभी अचानक यह विचार आया: आज के LLM probability distribution लौटाते हैं, फिर एक random sampler उसमें से एक चुनकर output में जोड़ता है, और यह प्रक्रिया दोहराई जाती है
इसकी जगह क्या ऐसा हो सकता है कि random process distribution का अनुमान लगाने वाले N tokens चुने, फिर LLM से N नई distributions बनवाई जाएँ, और उसके बाद उन्हें किसी तरीके से मिलाकर उस संयुक्त distribution से फिर N tokens चुने जाएँ?
उदाहरण https://huggingface.co/docs/transformers/internal/generation... में देखे जा सकते हैं
हालांकि यह कैसे किया जाए, पता नहीं
बेशक, हर token generation पर N गुना computation लगेगा। आप top N चुन सकते हैं, या ज़रूरत हो तो logits पर temperature adjustment लगाकर N samples ले सकते हैं
क्या यह educational purpose के लिए है? llama.cpp और इस project की सफलता देखकर लगता है कि industry, PyTorch, TensorFlow, ONNX Runtime जैसे general-purpose frameworks की बजाय, जारी होने वाले हर model के लिए अलग source code रखने की दिशा में जा रही है
और नहीं। नाम के विपरीत llama.cpp सिर्फ़ llama को support नहीं करता। यह पूरी तरह custom भी नहीं है, बल्कि ज़्यादा general
ggmltensor library/framework के ऊपर बना हैलेकिन जब कोई अच्छा काम करने वाला model मिल जाता है, तो उसके सुधार अक्सर framework के अगले versions में शामिल हो जाते हैं। इसी वजह से TensorFlow में CNN, GRU, TransformerEncoder जैसे building blocks आए, और साथ ही सामान्यता से कुछ समझौता करके speed पाने वाली specific hardware implementations भी बनीं