বেশিরভাগ লোকের সাথে আমি যোগাযোগ করি, আমি বেশিরভাগ সময়ের জন্য শুধুমাত্র একটি পাঠ্য-ভিত্তিক প্রোগ্রাম। যদি ইনপুট এবং আউটপুট এত সহজ হয়, আমি কি মডেল দ্বারা প্রতিস্থাপিত হতে পারি? এটি কাজ করার জন্য, মডেলটিকে শুধুমাত্র আমার লেখার ধরন বুঝতে হবে না, আমার সম্পর্কে অনেক কিছু জানতে হবে। এটির জন্য সর্বোত্তম উৎস হল আমার টেলিগ্রাম মেসেঞ্জার, যেহেতু আমি এটি প্রতিদিন ব্যবহার করি এবং এতে চ্যাট ইতিহাসের আকারে আমার চিন্তাভাবনা এবং কর্ম সম্পর্কে প্রায় সবকিছুই রয়েছে।
সবচেয়ে সহজ পদ্ধতি হল আমার সমস্ত বার্তা বের করা, সেগুলিকে ChatGPT-এর প্রেক্ষাপটে লোড করা এবং নতুন বার্তাগুলির উত্তর দেওয়ার সময় আমার শৈলী অনুকরণ করতে এই তথ্যটি ব্যবহার করার নির্দেশ দেওয়া। যাইহোক, এই পদ্ধতিটি প্রসঙ্গ উইন্ডোর আকার দ্বারা সীমাবদ্ধ, মূল পয়েন্টগুলি বের করার জন্য আমাকে বার্তাগুলিকে প্রিপ্রসেস করতে হবে। যেহেতু আমি এই ঝামেলা এড়াতে চাই, প্রয়োজনে প্রয়োজনীয় তথ্য টেনে আনতে সম্ভবত Retrieval Augmented Generation (RAG) ব্যবহার করা যেতে পারে। যাইহোক, আমার অভিজ্ঞতা থেকে, চ্যাট সেশনের মতো বিভিন্ন ডেটা থেকে পুনরুদ্ধার করার জন্য সাধারণত পুনরুদ্ধার মডেলের একটি তত্ত্বাবধানে সূক্ষ্ম-টিউনিং প্রয়োজন, এবং আমি এই ধরনের ডেটাসেট তৈরি করতে আগ্রহী নই। সুতরাং, সূক্ষ্ম-টিউনিং সেরা বিকল্প বলে মনে হচ্ছে। এটি বেশ কয়েকটি কারণের জন্য আদর্শ: এটি আমার লেখার শৈলী ক্যাপচার করা উচিত এবং গুরুত্বপূর্ণ কি নির্বাচন না করেই আমার সমস্ত বার্তা থেকে সম্ভাব্য জ্ঞান সংগ্রহ করা উচিত।
OpenAI ফাইন-টিউনিং ক্ষমতা অফার করে, কিন্তু যেহেতু আমি আমার ব্যক্তিগত বার্তাগুলি ব্যবহার করব, আমি কোনও তৃতীয় পক্ষের ফাইন-টিউনিং পরিষেবা ব্যবহার করতে চাই না৷ সুতরাং, আমি একটি বেস মডেল নির্বাচন করতে হবে. হাগিং ফেস ওপেন এলএলএম লিডারবোর্ড অনুসারে, শীর্ষ ছোট মডেলগুলির মধ্যে একটি (≤13B প্যারামিটার) হল Mistral 7B । এমনকি এটি Llama 2 13B-কে ছাড়িয়ে গেছে। এখন, প্রশ্ন হল LoRA যথেষ্ট কিনা বা সম্পূর্ণ ফাইন-টিউনিং প্রয়োজন কিনা। বিভিন্ন তুলনা [1] [2] পরামর্শ দেয় যে LoRA সম্পূর্ণ ফাইন-টিউনিংয়ের চেয়ে কিছুটা খারাপ কিন্তু এখনও বেশিরভাগ সময় ঠিক থাকে। যাইহোক, আমার মত নির্দিষ্ট কাজের জন্য (রাশিয়ান ভাষা + চ্যাট), আমি একটি কাগজ পেয়েছি, যেখানে গবেষকরা আমার লক্ষ্যের মতো জটিলতায় চীনা ভাষায় লামা নির্দেশনা ফাইন-টিউনিং পরিচালনা করেছেন। তারা দেখেছে যে পূর্ব নির্দেশ ছাড়াই একটি বেস মডেলে LoRA-ভিত্তিক টিউনিং সম্পূর্ণ ফাইন-টিউনিংয়ের চেয়ে কম কার্যকর। তবুও, নির্দেশাবলীর জন্য ইতিমধ্যেই সূক্ষ্ম সুর করা একটি মডেলে 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|>আলেকজান্ডার স্মিরনভ
>>> এই <|im_end|> এর মধ্যে z কোথায় আসে তা বুঝবেন না
<|im_start|>জন স্মিথ
>
>>> এবং এটা শুধু একটি র্যান্ডম সমাধান
>>> আলোচনা থেকে<|im_end|>
<|im_start|>আলেকজান্ডার স্মিরনভ
>>> বুঝেছি<|im_end|>
আমার ডেটা সংগ্রাহক নিশ্চিত করে যে ক্ষতি শুধুমাত্র কারো প্রতিক্রিয়ার উপর ভিত্তি করে গণনা করা হয়। কে পরবর্তী কথা বলবে তা ভবিষ্যদ্বাণী করা তুলনামূলকভাবে সহজ, এবং আমরা চাই না যে মডেলটি এটি শেখার দিকে মনোনিবেশ করুক। অতএব, কথোপকথনের অংশগুলি যেখানে ক্ষতি গণনা করা হয়েছে সেগুলি গাঢ়ভাবে হাইলাইট করা হয়েছে৷
আপনি হয়তো লক্ষ্য করবেন যে শুধু আমার প্রতিক্রিয়াই নয়, অন্যদেরও ক্ষতির হিসাব করার জন্য ব্যবহার করা হয়। এটা ইচ্ছাকৃত। এটি করার মাধ্যমে, মডেলটি কেবল আমিই নয়, আমার ঘন ঘন কথোপকথনের অংশীদার হিসাবে ভূমিকা পালন করতে সক্ষম হবে!
আমি দুটি উপায়ে চ্যাট করে মডেল পরীক্ষা করব। প্রথমত, মডেলটি আমাকে ভান করবে এবং আমি আমার বিভিন্ন বন্ধুদের দৃষ্টিকোণ থেকে নিজের সাথে চ্যাট করব। তারপর, মডেলটি আমার বন্ধু হিসাবে কাজ করার সময় আমি নিজের মতো চ্যাট করব। আমার কথোপকথন স্টার্টার সর্বদা একই 2টি বার্তা থাকবে: "হেই" এবং "কি খবর?" (রাশিয়ান ভাষায়, "прив" এবং "как дела?")। উত্পন্ন বাক্যাংশ এবং ব্যক্তি মডেল হিসাবে কাজ করে যারা হাইলাইট করা হবে। পরীক্ষার জন্য, আমি oobabooga/text-generation-webui ব্যবহার করব।
শুরুতে, আমি অন্বেষণ করতে চাই কিভাবে জেনেরিক কথোপকথন ফাইন-টিউনড মিস্ট্রাল মডেল আমার পক্ষ থেকে কোনো পূর্ব প্রশিক্ষণ ছাড়াই সেই কাজটি মোকাবেলা করে।
বন্ধু 1 বনাম আলেকজান্ডার স্মিরনভ
আলেকজান্ডার স্মিরনভ বনাম বন্ধু ১
ঠিক আছে, এটি সুসংগত বাক্য গঠন করতে সক্ষম। সবচেয়ে লক্ষণীয় সমস্যা হল কথোপকথনের প্রেক্ষাপট সম্পর্কে সচেতনতার অভাব যা নম্র এবং সাধারণ উত্তরের দিকে পরিচালিত করে। বার্তাগুলির কোনও স্বতন্ত্র শৈলীর অভাব ছিল, বেশ মৌলিক অনুভূতি। আরেকটি সমস্যা হল যে মডেলটির রাশিয়ান দুর্বল। এটি প্রত্যাশিত, কারণ মডেলটি তার প্রাথমিক ভাষা, ইংরেজি ছাড়া অন্য ভাষায় সাধারণীকরণের জন্য খুব ছোট। অতিরিক্তভাবে, মডেলটি অত্যধিক সক্রিয় হওয়ার প্রবণতা দেখায়, প্রায় প্রতিটি বাক্যই একটি প্রশ্ন দিয়ে শেষ করে, যা প্রকৃত লোকেরা কীভাবে মেসেঞ্জারে যোগাযোগ করে তা নয়।
এর এই সব ঠিক করার চেষ্টা করা যাক!
LoRA প্রশিক্ষণ পাইপলাইন এবং হার্ডওয়্যার প্রয়োজনীয়তা উভয় ক্ষেত্রেই একটি কম-প্রচেষ্টা পদ্ধতির প্রস্তাব করে। এটি মোট ওজনের প্রায় 1% প্রশিক্ষণ দেয়। আমি একটি 1024 সিকোয়েন্স দৈর্ঘ্য এবং 8 ব্যাচের আকার বেছে নিয়েছি। প্রশিক্ষণ, যা একটি RTX 3090-এ 20GB VRAM খরচ করে, তিনটি যুগ নেয় এবং 5.5 ঘন্টা স্থায়ী হয়। এর জন্য, আমি vast.ai ব্যবহার করেছি, যেখানে GPU খরচ ছিল প্রতি ঘণ্টায় $0.362, পুরো প্রশিক্ষণের জন্য মোট $2, পরীক্ষা-নিরীক্ষা এবং বাগ ফিক্সে ব্যয় করা সময় বাদ দিয়ে।
এখানে ফলাফল আছে:
বন্ধু 1 বনাম আলেকজান্ডার স্মিরনভ
বন্ধু 2 বনাম আলেকজান্ডার স্মিরনভ
আলেকজান্ডার স্মিরনভ বনাম বন্ধু ১
আলেকজান্ডার স্মিরনভ বনাম বন্ধু 2
এটা অনেক ভালো। এটি অবশ্যই যে ব্যক্তির পক্ষে সাড়া দিচ্ছে তার শৈলী ক্যাপচার করে। এটি নির্দিষ্ট জোড়া মানুষের মধ্যে আলোচিত সর্বাধিক সাধারণ বিষয়গুলিকেও চিহ্নিত করে৷ উদাহরণস্বরূপ, বন্ধু 2 এর সাথে, ফোকাস স্পষ্টতই কাজের উপর বেশি। যাইহোক, ব্যাকরণ এখনও বন্ধ, এবং এটি কথোপকথনের প্রসঙ্গ দ্রুত হারায়। আমি মোটামুটি আত্মবিশ্বাসী যে LoRA ইংরেজিতে যুক্তিসঙ্গত মানের সাথে কাজ করবে, এবং সম্পূর্ণ সূক্ষ্ম টিউনিংয়ের প্রয়োজন নাও হতে পারে। কিন্তু, যেহেতু রাশিয়ান মডেলের মাতৃভাষা নয়, আসুন সম্পূর্ণ ফাইন-টিউনিং চেষ্টা করি।
মাল্টি-জিপিইউ প্রশিক্ষণের প্রয়োজনের কারণে সম্পূর্ণ ফাইন-টিউনিং আরও চ্যালেঞ্জিং। জনপ্রিয় পদ্ধতির মধ্যে রয়েছে ZeRO এবং DeepSpeed [3] অথবা FSDP [4] , FSDP মূলত একটি ZeRO3 [5] । আমি FSDP এর সাথে যাওয়ার সিদ্ধান্ত নিয়েছি।
প্রশিক্ষণ পাইপলাইন বাস্তবায়ন করার সময়, আমি স্ট্যানফোর্ড আলপাকা ফাইন-টিউনিং কোড এবং অ্যান্টন বাকাজের মিস্ট্রাল ফাইন-টিউনিং কোড উল্লেখ করেছি।
একটি 1024 সিকোয়েন্স দৈর্ঘ্য এবং 2 এর একটি মাইক্রো ব্যাচ সাইজ সহ একটি অর্ধ-নির্ভুল FSDP ফুল শার্ড ব্যবহার করে আটটি A100 80 GB GPU-এর প্রতিটিতে 63GB VRAM প্রয়োজন৷ প্রশিক্ষণ, তিন যুগ স্থায়ী, মাত্র 20 মিনিট সময় নেয়। VM-এর জন্য মোট খরচ প্রতি ঘন্টায় $8.88, যার ফলস্বরূপ $3, পরীক্ষা-নিরীক্ষা এবং বাগ ফিক্সের সময় অন্তর্ভুক্ত নয়।
কথোপকথন:
বন্ধু 1 বনাম আলেকজান্ডার স্মিরনভ
বন্ধু 2 বনাম আলেকজান্ডার স্মিরনভ
আলেকজান্ডার স্মিরনভ বনাম বন্ধু ১
আলেকজান্ডার স্মিরনভ বনাম বন্ধু 2
কথোপকথনগুলি আরও আকর্ষণীয় এবং আকর্ষক হয়ে উঠেছে, যদিও এখনও প্রসঙ্গ হারানোর ঝুঁকি রয়েছে৷ রাশিয়ান ভাষার কর্মক্ষমতা উন্নত হয়েছে, কিন্তু ত্রুটি এখনও ঘটতে পারে। আমি বিশ্বাস করি যে আমার মতো সীমিত ডেটা সহ একটি নির্দিষ্ট কাজের জন্য ফাইন-টিউনিং করার আগে, রাশিয়ান পাঠ্যের একটি বৃহৎ কর্পাসের উপর তত্ত্বাবধান না করা মডেলটিকে প্রথমে ফাইন-টিউন করা উপকারী হবে। উপরন্তু, পৃথক টোকেন হিসাবে সাধারণ কথোপকথন অংশীদারদের নাম অন্তর্ভুক্ত করা মান উন্নত করতে পারে।
আমি বলব না যে এটি LoRA এর চেয়ে উল্লেখযোগ্যভাবে ভাল হয়েছে। প্রতিটি কথোপকথনকারী অংশীদার সম্পর্কে জানার চেষ্টা করার পরিবর্তে শুধুমাত্র একজন ব্যক্তির উপর ফোকাস করা এবং শুধুমাত্র আমার প্রতিক্রিয়া (বা অন্য কারোর) উপর ভিত্তি করে ক্ষতি গণনা করা আরও কার্যকর হতে পারে।
অবশ্যই, আমাকে ফলাফলগুলি চেরি-পিক করতে হয়েছিল, এই কারণে নয় যে বেশিরভাগ মডেলের উত্তরগুলি অপর্যাপ্ত ছিল, কিন্তু কারণ অনেকগুলি সাধারণ প্রতিক্রিয়া ছিল যেমন "আমি আপনাকে পরে কল করব," "ব্যস্ত" এবং "ঠিক আছে", যা স্বাভাবিকভাবেই ঘন ঘন হয় কথোপকথনে তা সত্ত্বেও, এটা স্পষ্ট যে মডেলটি যে ব্যক্তির ছদ্মবেশ ধারণ করছে তার শৈলীর অনুকরণে উৎকৃষ্ট। এটি দুটি ব্যক্তির মধ্যে সাধারণভাবে আলোচিত বিষয়গুলিও ক্যাপচার করে। যাইহোক, এটি উল্লেখযোগ্যভাবে কথোপকথনে প্রসঙ্গ অভাব. "ইয়ো, তাই?" এর মতো প্রশ্নের উত্তর দিচ্ছেন অথবা "সপ্তাহান্তের জন্য আপনার পরিকল্পনা কি" সম্পূর্ণ প্রসঙ্গ ছাড়াই চ্যালেঞ্জিং। সম্ভবত রিওয়াইন্ডের মতো একটি সিস্টেম ব্যবহার করা, যা কম্পিউটার জুড়ে ব্যবহারকারী যা কিছু করে তা ক্যাপচার করে, উপকারী হতে পারে।
আপনি এই প্রোজেক্টের জন্য কোড খুঁজে পেতে পারেন সেইসাথে আমার গিথুব রেপোতে আপনার নিজের টেলিগ্রাম ডাম্পে কীভাবে এটি নিজেই প্রতিলিপি করবেন তার নির্দেশাবলী পেতে পারেন। WandB- তে প্রশিক্ষণ লগগুলি অ্যাক্সেস করা যেতে পারে।
আনস্প্ল্যাশে খ্রিস্টান উইডিগারের প্রধান চিত্র