मैं जिन लोगों से बातचीत करता हूँ, उनमें से ज़्यादातर के लिए मैं सिर्फ़ एक टेक्स्ट-आधारित प्रोग्राम हूँ। अगर इनपुट और आउटपुट इतने सरल हैं, तो क्या मैं मॉडल द्वारा प्रतिस्थापित किया जा सकता हूँ? इसके काम करने के लिए, मॉडल को न केवल मेरी लेखन शैली को समझना होगा, बल्कि मेरे बारे में भी बहुत कुछ जानना होगा। इसके लिए सबसे अच्छा स्रोत मेरा टेलीग्राम मैसेंजर है, क्योंकि मैं इसे रोज़ाना इस्तेमाल करता हूँ और इसमें चैट हिस्ट्री के रूप में मेरे विचारों और कार्यों के बारे में लगभग सब कुछ होता है।
सबसे सीधा तरीका यह होगा कि मेरे सभी संदेशों को निकाला जाए, उन्हें ChatGPT के संदर्भ में लोड किया जाए, और नए संदेशों का जवाब देते समय मेरी शैली की नकल करने के लिए इस जानकारी का उपयोग करने का निर्देश दिया जाए। हालाँकि, यह दृष्टिकोण संदर्भ विंडो के आकार द्वारा सीमित है, जिसके लिए मुझे मुख्य बिंदुओं को निकालने के लिए संदेशों को प्रीप्रोसेस करना होगा। चूँकि मैं इस परेशानी से बचना चाहता हूँ, शायद रिट्रीवल ऑगमेंटेड जेनरेशन (RAG) का उपयोग आवश्यक जानकारी खींचने के लिए किया जा सकता है। हालाँकि मेरे अनुभव से, चैट सत्रों जैसे विविध डेटा से पुनर्प्राप्ति के लिए आमतौर पर पुनर्प्राप्ति मॉडल की पर्यवेक्षित फ़ाइन-ट्यूनिंग की आवश्यकता होती है, और मैं ऐसा डेटासेट बनाने के लिए उत्सुक नहीं हूँ। इसलिए, फ़ाइन-ट्यूनिंग सबसे अच्छा विकल्प लगता है। यह कई कारणों से आदर्श है: इसे मेरी लेखन शैली को पकड़ना चाहिए और संभावित रूप से मेरे सभी संदेशों से ज्ञान इकट्ठा करना चाहिए, बिना यह चुने कि क्या महत्वपूर्ण है।
OpenAI फाइन-ट्यूनिंग क्षमताएं प्रदान करता है, लेकिन चूंकि मैं अपने निजी संदेशों का उपयोग करूंगा, इसलिए मैं किसी तृतीय-पक्ष फाइन-ट्यूनिंग सेवाओं का उपयोग नहीं करना चाहता। इसलिए, मुझे एक आधार मॉडल चुनने की आवश्यकता है। हगिंग फेस ओपन एलएलएम लीडरबोर्ड के अनुसार, शीर्ष छोटे मॉडलों में से एक (≤13B पैरामीटर) मिस्ट्रल 7B है। यह लामा 2 13B से भी बेहतर प्रदर्शन करता है। अब, सवाल यह है कि क्या LoRA पर्याप्त है या पूर्ण फाइन-ट्यूनिंग आवश्यक है। विभिन्न तुलनाएं [1] [2] बताती हैं कि LoRA पूर्ण फाइन-ट्यूनिंग से थोड़ा खराब है, लेकिन फिर भी अधिकांश समय ठीक है। हालांकि, मेरे जैसे विशिष्ट कार्यों के लिए (रूसी भाषा + चैट), मुझे एक पेपर मिला, जहां शोधकर्ताओं ने चीनी में लामा निर्देश फाइन-ट्यूनिंग का संचालन किया, जो मेरे लक्ष्य की जटिलता के समान था मेरे मामले में, इसका मतलब है या तो बेस मॉडल पर पूरी तरह से फाइन-ट्यूनिंग या रूसी में चैटिंग के लिए पहले से ही फाइन-ट्यून किए गए मॉडल पर LoRA। चूँकि मुझे रूसी चैट के लिए फाइन-ट्यून किया गया मॉडल नहीं मिला, इसलिए मैं अंग्रेजी चैट के लिए फाइन-ट्यून किए गए मॉडल पर LoRA आज़माऊँगा, जैसे कि फाइन-ट्यून किया गया मिस्ट्रल मॉडल डॉल्फ़िन ।
तो, योजना यह है:
ईमेल की तुलना में टेलीग्राम जैसे ऐप में मैसेजिंग का एक अनूठा पहलू संवादात्मक प्रवाह है। संदेश आमतौर पर आपके और आपके संपर्क के बीच एक-एक करके नहीं भेजे जाते हैं। इसके बजाय, आप अक्सर खुद को लगातार कुछ संदेश भेजते हुए पाते हैं, जिसके बाद दूसरे व्यक्ति की ओर से कई प्रतिक्रियाएँ आती हैं। ये संदेश आम तौर पर छोटे भी होते हैं। मैं अपने डेटा में इस प्राकृतिक संवादात्मक शैली को संरक्षित करना चाहता था।
टेलीग्राम में सभी चैट को JSON में एक्सपोर्ट करने के लिए बिल्ट-इन सुविधा दी गई है। कुछ फ़िल्टरिंग और संदेशों को सत्रों में समूहीकृत करने के बाद, मैंने टेलीग्राम का उपयोग करने के पिछले पाँच वर्षों से डेटा संकलित किया है। इसके परिणामस्वरूप 466 चैट से 15,789 सत्र प्राप्त हुए, जिनमें औसत सत्र अवधि 8.51 संदेश थी। डेटा को संरचित करने के लिए, मैंने चैटएमएल प्रॉम्प्ट प्रारूप चुना है। यहाँ एक नमूना सत्र है (रूसी से अनुवादित):
<|im_start|>जॉन स्मिथ
>>> अरे, 135 समय सीमा से बच नहीं सकते
>>> हर काम को बेहतरीन ढंग से करने की कोशिश कर रहा हूँ, लेकिन कोई फायदा नहीं<|im_end|>
<|im_start|>अलेक्जेंडर स्मिरनोव
>>> हाँ वही
>>> क्या आप अभी भी उसी विचार पर चल रहे हैं?<|im_end|>
<|im_start|>जॉन स्मिथ
>>> पता नहीं, मुझे लगता है कि हम एक ही पृष्ठ पर हैं
>>> जैसा आपने कहा
>>> उलटी स्ट्रिंग के साथ चलते हुए वहाँ कुछ खोजने की कोशिश कर रहा हूँ
>>> यह बहुत बकवास लगता है क्योंकि z फ़ंक्शन सब कुछ बर्बाद कर देता है……………………<|im_end|>
<|im_start|>अलेक्जेंडर स्मिरनोव
>>> समझ नहीं आ रहा कि इसमें z कहाँ से आ गया<|im_end|>
<|im_start|>जॉन स्मिथ
>>> पता नहीं, ऐसा लगता है कि मैं वैसे भी सब कुछ पुनरावृत्तीय रूप से कर रहा हूँ, लेकिन हाँ, z फ़ंक्शन बनाने के लिए कुछ स्ट्रिंग्स को उलटना होगा
>>> और यह सिर्फ एक यादृच्छिक समाधान है
>>> चर्चा से<|im_end|>
<|im_start|>अलेक्जेंडर स्मिरनोव
>>> समझ गया<|im_end|>
मेरा डेटा कोलेटर यह सुनिश्चित करता है कि नुकसान की गणना केवल किसी की प्रतिक्रिया के आधार पर की जाती है। यह अनुमान लगाना कि अगला कौन बोलेगा, अपेक्षाकृत सरल है, और हम नहीं चाहते कि मॉडल इसे सीखने पर ध्यान केंद्रित करे। इसलिए, बातचीत के उन हिस्सों को जहां नुकसान की गणना की जाती है, बोल्ड में हाइलाइट किया जाता है।
आप देख सकते हैं कि नुकसान की गणना के लिए न केवल मेरी प्रतिक्रियाएँ बल्कि दूसरों की प्रतिक्रियाएँ भी इस्तेमाल की जाती हैं। यह जानबूझकर किया जाता है। ऐसा करने से, मॉडल न केवल मेरी बल्कि मेरे अक्सर बातचीत करने वाले साथी की भूमिका निभाने में भी सक्षम होगा!
मैं दो तरीकों से चैट करके मॉडल का परीक्षण करूँगा। सबसे पहले, मॉडल मेरा होने का दिखावा करेगा और मैं अपने अलग-अलग दोस्तों के नज़रिए से खुद से चैट करूँगा। फिर, मैं खुद के रूप में चैट करूँगा जबकि मॉडल मेरा दोस्त बनकर काम करेगा। मेरी बातचीत शुरू करने वाला संदेश हमेशा वही 2 संदेश होंगे: "हे" और "क्या चल रहा है?" (रूसी में, "прив" और "как дела?")। मॉडल के अभिनय के दौरान उत्पन्न वाक्यांश और व्यक्ति हाइलाइट किए जाएँगे। परीक्षण के लिए, मैं oobabooga/text-generation-webui का उपयोग करूँगा।
आरंभ में, मैं यह जानना चाहता हूँ कि सामान्य वार्तालाप से परिष्कृत मिस्ट्रल मॉडल, मेरी ओर से किसी पूर्व प्रशिक्षण के बिना, उस कार्य को किस प्रकार निपटाता है।
मित्र 1 बनाम अलेक्जेंडर स्मिरनोव
अलेक्जेंडर स्मिरनोव बनाम फ्रेंड 1
ठीक है, यह सुसंगत वाक्य बनाने में सक्षम है। सबसे अधिक ध्यान देने योग्य समस्या यह है कि बातचीत के संदर्भ के बारे में इसकी जागरूकता की कमी है जो नीरस और सामान्य उत्तरों की ओर ले जाती है। संदेशों में किसी विशिष्ट शैली का अभाव था, जो काफी बुनियादी लगता था। एक और मुद्दा यह है कि मॉडल की रूसी खराब है। यह अपेक्षित है, क्योंकि मॉडल अपनी प्राथमिक भाषा, अंग्रेजी के अलावा अन्य भाषाओं के लिए सामान्यीकृत करने के लिए बहुत छोटा है। इसके अतिरिक्त, मॉडल अत्यधिक सक्रिय होने की प्रवृत्ति रखता है, लगभग हर वाक्य को एक प्रश्न के साथ समाप्त करता है, जो कि वास्तविक लोग आम तौर पर मैसेंजर में संवाद करने का तरीका नहीं है
आइये इन सबको ठीक करने का प्रयास करें!
LoRA प्रशिक्षण पाइपलाइन और हार्डवेयर आवश्यकताओं दोनों के संदर्भ में कम प्रयास वाला दृष्टिकोण प्रदान करता है। यह कुल भार का लगभग 1% प्रशिक्षण देता है। मैंने 1024 अनुक्रम लंबाई और 8 का बैच आकार चुना। प्रशिक्षण, जिसने RTX 3090 पर 20GB VRAM का उपभोग किया, तीन युगों में चला और 5.5 घंटे तक चला। इसके लिए, मैंने vast.ai का उपयोग किया, जहाँ GPU की लागत $0.362 प्रति घंटा थी, जो प्रयोगों और बग फिक्स पर खर्च किए गए समय को छोड़कर, पूरे प्रशिक्षण के लिए कुल $2 थी।
परिणाम इस प्रकार हैं:
मित्र 1 बनाम अलेक्जेंडर स्मिरनोव
मित्र 2 बनाम अलेक्जेंडर स्मिरनोव
अलेक्जेंडर स्मिरनोव बनाम फ्रेंड 1
अलेक्जेंडर स्मिरनोव बनाम फ्रेंड 2
यह बहुत बेहतर है। यह निश्चित रूप से उस व्यक्ति की शैली को दर्शाता है जिसकी ओर से यह जवाब दे रहा है। यह लोगों के विशिष्ट जोड़ों के बीच चर्चा किए जाने वाले सबसे आम विषयों की भी पहचान करता है। उदाहरण के लिए, मित्र 2 के साथ, ध्यान स्पष्ट रूप से काम पर अधिक है। हालाँकि, व्याकरण अभी भी गलत है, और यह बातचीत के संदर्भ को जल्दी से खो देता है। मुझे पूरा विश्वास है कि LoRA अंग्रेजी में उचित गुणवत्ता के साथ काम करेगा, और पूर्ण फाइन-ट्यूनिंग की आवश्यकता नहीं हो सकती है। लेकिन, चूंकि रूसी मॉडल की मूल भाषा नहीं है, इसलिए आइए पूर्ण फाइन-ट्यूनिंग का प्रयास करें।
मल्टी-जीपीयू प्रशिक्षण की आवश्यकता के कारण पूर्ण फ़ाइन-ट्यूनिंग अधिक चुनौतीपूर्ण है। लोकप्रिय तरीकों में या तो ज़ीरो और डीपस्पीड [3] या एफएसडीपी [4] शामिल हैं, जिसमें एफएसडीपी अनिवार्य रूप से ज़ीरो3 [5] है। मैंने एफएसडीपी के साथ जाने का फैसला किया।
प्रशिक्षण पाइपलाइन को लागू करते समय, मैंने स्टैनफोर्ड अल्पाका फाइन-ट्यूनिंग कोड और एंटोन बाकाज के मिस्ट्रल फाइन-ट्यूनिंग कोड का संदर्भ लिया।
1024 सीक्वेंस लेंथ और 2 के माइक्रो बैच साइज वाले हाफ-प्रिसिजन FSDP फुल शार्ड का इस्तेमाल करने के लिए आठ A100 80 GB GPU में से प्रत्येक पर 63GB VRAM की जरूरत थी। तीन युगों तक चलने वाले इस प्रशिक्षण में सिर्फ 20 मिनट लगे। VM की कुल लागत $8.88 प्रति घंटा थी, जिसके परिणामस्वरूप $3 हुआ, जिसमें प्रयोगों और बग फिक्स के लिए समय शामिल नहीं था।
बात चिट:
मित्र 1 बनाम अलेक्जेंडर स्मिरनोव
मित्र 2 बनाम अलेक्जेंडर स्मिरनोव
अलेक्जेंडर स्मिरनोव बनाम फ्रेंड 1
अलेक्जेंडर स्मिरनोव बनाम फ्रेंड 2
बातचीत ज़्यादा दिलचस्प और आकर्षक हो गई है, हालाँकि अभी भी संदर्भ खोने का जोखिम है। रूसी भाषा का प्रदर्शन बेहतर हुआ है, लेकिन त्रुटियाँ अभी भी होती हैं। मेरा मानना है कि सीमित डेटा वाले किसी विशिष्ट कार्य के लिए फ़ाइन-ट्यूनिंग से पहले, जैसे कि मेरा, रूसी टेक्स्ट के बड़े कॉर्पस पर मॉडल को बिना निगरानी के फ़ाइन-ट्यून करना फ़ायदेमंद होगा। इसके अतिरिक्त, अलग-अलग टोकन के रूप में आम बातचीत करने वाले भागीदारों के नामों को शामिल करने से गुणवत्ता में सुधार हो सकता है।
मैं यह नहीं कहूंगा कि यह LoRA से काफी बेहतर साबित हुआ है। प्रत्येक बातचीत करने वाले साथी के बारे में जानने की कोशिश करने के बजाय, केवल एक व्यक्ति पर ध्यान केंद्रित करना और केवल मेरी प्रतिक्रियाओं (या किसी और की) के आधार पर नुकसान की गणना करना अधिक प्रभावी हो सकता है।
निश्चित रूप से, मुझे परिणामों को चुनना पड़ा, इसलिए नहीं कि मॉडल के अधिकांश उत्तर अपर्याप्त थे, बल्कि इसलिए कि कई सरल उत्तर थे जैसे "मैं आपको बाद में कॉल करूँगा," "व्यस्त हूँ," और "ठीक है," जो स्वाभाविक रूप से बातचीत में अक्सर होते हैं। इसके बावजूद, यह स्पष्ट है कि मॉडल उस व्यक्ति की शैली की नकल करने में उत्कृष्ट है जिसका वह प्रतिरूपण कर रहा है। यह दो लोगों के बीच आम तौर पर चर्चा किए जाने वाले विषयों को भी पकड़ता है। हालाँकि, यह बातचीत में संदर्भ का काफी अभाव है। "यो, तो?" या "सप्ताहांत के लिए आपकी क्या योजनाएँ हैं" जैसे प्रश्नों का उत्तर देना पूर्ण संदर्भ के बिना चुनौतीपूर्ण है। शायद रिवाइंड जैसी प्रणाली का उपयोग करना, जो कंप्यूटर पर उपयोगकर्ता द्वारा की जाने वाली हर चीज़ को कैप्चर करता है, फायदेमंद हो सकता है।
आप इस प्रोजेक्ट के लिए कोड पा सकते हैं और साथ ही इसे अपने खुद के टेलीग्राम डंप पर खुद कैसे दोहराना है, इस पर निर्देश मेरे गिटहब रेपो में पा सकते हैं। प्रशिक्षण लॉग को WandB पर एक्सेस किया जा सकता है।
मुख्य छवि क्रिश्चियन विडिगर द्वारा अनस्प्लैश पर