ساختن یه LLM قدیمی از صفر با دانش محدود به سال ۱۹۰۰
خلاصهٔ کاملتر
نویسنده میگه ایدهٔ این پروژه از چند پست در Reddit اومد که توشون آدمها مدلهای زبانی «قفلشده در زمان» میساختن — مثلاً مدلی که فقط با متنهای لندن دههٔ ۱۸۰۰ آموزش دیده بود. اون هم تصمیم گرفت چتبات ویکتوریایی خودش رو بسازه و از اون موقع هر روز روی پروژهاش کار کرده. نتیجه یه مدل ۳۴۰ میلیون پارامتری بر پایهٔ معماری Llama هست که دانشش به سال ۱۹۰۰ محدود شده، و کد و دیتاست و خود مدل هم متنبازه و روی HuggingFace گذاشته شده.
نویسنده توضیح میده برای ساختن یه LLM چهار چیز لازمه: داده، توکنایزر، آموزش پایه (base-training یا همون pre-training) و در آخر fine-tuning برای یاد گرفتن گفتگو. به گفتهٔ اون، جمع کردن و تمیز کردن داده طولانیترین و خستهکنندهترین بخش کار بوده، چون دیتاستهای مدرن پر از مطالب کامپیوتر و فضاپیما هستن که اون نمیخواست مدلش یاد بگیره. برای همین از منابعی مثل Project Gutenberg، Oxford Text Archive و آرشیو اینترنت استفاده کرده و سعی کرده فقط متنهای انگلیسی قبل از ۱۹۰۰ رو نگه داره.
یه چالش بزرگ، حذف نسخههای تکراری بود. نویسنده اول روشهای سنگینی مثل MinHash و شباهت برداری امبدینگها رو امتحان کرده ولی خیلی کند و گرون بودن، برای همین در نهایت بر اساس متن نرمالشده (حروف کوچک و بدون فاصله) دادهها رو یکتا کرده. اون چند تا پایگاه دادهٔ مختلف مثل Qdrant، Lance و ValKey رو هم تست کرده و در آخر به خاطر پایداری و مصرف کم منابع روی LevelDB ثابت شده.
برای سنجش کیفیت متن، نویسنده چند معیار آماری ساخته. یکی نسبت فشردهسازی ZLIB هست: متن خیلی تکراری مقدار خیلی کوچیک و متن خیلی متنوع مقدار بزرگ میده، و بازهٔ خوب بین ۰.۵ تا ۰.۷ هست:
def compression_ratio(text) -> float:
raw = text.encode("utf-8")
compressed = zlib.compress(raw)
return len(compressed) / len(raw)معیار دوم آنتروپی شانون بود که نرخ اطلاعات هر کاراکتر رو میسنجه؛ برای انگلیسی چاپی این عدد معمولاً بین ۴.۲ تا ۵.۵ میافته، پس متنهایی با آنتروپی خیلی پایین یا خیلی بالا کنار گذاشته شدن. نویسنده یه امتیاز کیفیت دستساز هم اضافه کرده که به حروف عادی امتیاز مثبت و به کاراکترهای عجیب امتیاز منفی میده تا متنهای خراب OCR شناسایی بشن. این فیلترها در کل کمتر از ۱٪ سندها رو حذف کردن.
نویسنده میگه توکنایزر خودش رو هم از صفر ساخته، چون مدلش هیچوقت به واژههایی مثل دستورهای زبانهای برنامهنویسی نیاز نداره و نمیخواست این کلمات جای واژههای مفید رو توی واژگان بگیرن. برای آموزش، اول یه مدل کوچیک Pythia با فریمورک litGPT امتحان کرده که بعد از یه ساعت متن انگلیسینمای بیمعنی تولید میکرد، ولی وقتی litGPT روی مدلهای بزرگتر کرش میکرد، اون اسکریپت آموزش خودش رو با الهام از nanoGPT و nanoChat و کلاس Trainer کتابخانهٔ transformers نوشته.
آموزش نهایی روی ابر (RunPod، ThunderCompute و Vast.ai) انجام شده. به گفتهٔ نویسنده طبق قانون مقیاسبندی Chinchilla، حدود ۹ میلیارد توکن برای این مدل ۳۴۰ میلیونی درست بوده، و کل خرج پروژه فقط بابت GPU حدود ۸۰ دلار شده. مرحلهٔ fine-tuning هنوز تموم نشده، ولی نمونههای اولیه نشون میدن مدل ساختار پرسش و پاسخ رو یاد گرفته، هرچند هنوز زیاد توهم میزنه و نمیشه واقعاً باهاش چت کرد.
نکات کلیدی:
- مدل ۳۴۰ میلیون پارامتری بر پایهٔ معماری Llama با دانش محدود به سال ۱۹۰۰
- سختترین بخش، تمیز کردن داده و حذف خروجیهای خراب OCR بود
- کیفیت متن با نسبت فشردهسازی ZLIB، آنتروپی شانون و یه امتیاز دستساز سنجیده شد
- حذف تکراریها در نهایت بر اساس متن نرمالشده و با پایگاه دادهٔ LevelDB انجام شد
- توکنایزر اختصاصی فقط روی متن انگلیسی تمیز آموزش دید تا واژگان هدر نره
- کل هزینهٔ پروژه با کرایهٔ GPU حدود ۸۰ دلار شد




