تصور کنید بتوانید یک مدل زبانی را برای استدلال ریاضی پیشرفته آموزش دهید، بدون آنکه به خوشههای عظیم پردازشی یا بودجههای میلیونی نیاز داشته باشید. اکنون با چارچوب Open Instruct، هر توسعهدهندهای که یک کارت گرافیک ۱۶ گیگابایتی دارد، میتواند چرخه کامل پسآموزش (Post-training) را روی سیستم شخصی خود اجرا کند. این قابلیت از طریق سادهسازی استک آموزشی پیچیده Tulu 3 توسط AllenAI فراهم شده است تا در محیطهای در دسترس مانند گوگل کولب (Google Colab) قابل اجرا باشد.
به نقل از آموزشهای منتشرشده در هفته جاری توسط Marktechpost، این ابزار پیچیدگیهای آموزشی مدل Tulu 3 را بهینه کرده است. در دنیای مدلهای زبانی، پسآموزش — که شبیه به دوره تخصص یک پزشک پس از فارغالتحصیلی از دانشگاه است تا در یک حوزه خاص خبره شود — معمولاً نیازمند ابزارهای سنگینی مثل vLLM، Ray actors یا DeepSpeed است تا بار حافظه را مدیریت کنند. این موضوع برای توسعهدهندگان مستقل یک دیوار سختافزاری ایجاد کرده بود که یادگیری تقویتی را تقریباً غیرممکن میکرد.
همانطور که در تحلیلهای پیشین ما دربارهی بهینهسازی مدلهای کوچک اشاره کردیم، کاهش اثر این دیوار سختافزاری، کلید دموکراتیزه کردن هوش مصنوعی است. Open Instruct این کار را با جایگزینی مؤلفههای توزیعشده و سنگین — مانند صفهای رولاوت (rollout queues) غیرهمزمان — با پیادهسازیهای سبک Hugging Face و PyTorch انجام داده است.
این خط لوله آموزشی بر روی مدل Qwen2.5-0.5B-Instruct متمرکز است تا آن را از یک مدل سادهی پیروی از دستورات به یک مدل استدلالی در ریاضیات (با استفاده از مجموعه داده GSM8K) تبدیل کند. هدف نهایی، انتقال مدل از مرحله پیروی ابتدایی از دستورات به مرحله استدلال ریاضی تأیید شده است.
محیط و تنظیمات فنی
برای گنجاندن استک Tulu 3 در حافظه ۱۶ گیگابایتی، این سیستم بهجای بارگذاری کل کتابخانه، تنها توابع زیان (Loss functions) و ابزارهای ضروری را بهصورت گزینشی از مخزن Open Instruct فراخوانی میکند. این استراتژی باعث میشود سربار حافظه ناشی از استک کامل آموزش توزیعشده حذف شود اما منطق اصلی بهینهسازی حفظ گردد.
- وابستگیها: این سیستم به مجموعهای از بستههای خاص نیاز دارد که شامل
peftبرای تنظیم کارآمد با پارامتر اندک،accelerateبرای توزیع بار،rayبرای مدیریت منابع،wandbبرای پایش،beaker-pyو مجموعهای از کتابخانههای تخصصی مانندlangdetect==1.0.9،immutabledict==1.2.0،nltk،absl-py،sympy،antlr4-python3-runtime==4.11وtiktokenاست. - مدیریت دقت: سیستم بهطور خودکار قابلیتهای GPU را شناسایی میکند تا بهینهترین نوع داده (dtype) را برای autocast انتخاب کند. اگر سختافزار از معماری Ampere یا جدیدتر باشد (که از طریق بررسی
torch.cuda.get_device_properties(0).major >= 8شناسایی میشود)، ازtorch.bfloat16استفاده میکند. در غیر این صورت، بهtorch.float16باز میگردد. همچنین، یکGradScalerبهطور خاص زمانی فعال میشود کهAMP_DTYPEرویtorch.float16باشد تا از پدیده underflow جلوگیری شود. - استخراج ابزارها: بهجای وارد کردن کل کتابخانه، خط لوله از مکانیزم
oi_loadبرای استخراج توابع خاص مستقیماً از فایلهای منبع استفاده میکند. این توابع شاملdpo_lossو_get_batch_logpsاز فایلdpo_utils.py،calculate_per_token_logpsازpadding_free_collator.py،masked_meanازrl_utils.py،estimate_klازmodel_utils.pyو همچنینGRPOLossTypeوcompute_grpo_lossازgrpo_utils.pyاست.
آمادهسازی دادهها و پیکربندی
تمام مراحل توسط یک کلاس پیکربندی مرکزی (CFG) مدیریت میشود که هایپرپارامترهای هر سه مرحله را تعریف میکند. برای مدل پایه، طول توالی حداکثری (max_seq_len) روی ۶۴۰ و مقدار seed روی ۴۲ برای بازتولیدپذیری نتایج تنظیم شده است.
- تنظیمات SFT: ۱۹۲ نمونه آموزشی (
n_sft)، ۴۰ گام، اندازه میکرو-بچ (micro-batch size) برابر ۲، تجمع گرادیان (gradient accumulation) برابر ۴ و نرخ یادگیری 1e-4. - تنظیمات DPO: ۹۶ نمونه (
n_dpo)، ۲۴ گام، اندازه میکرو-بچ برابر ۱، تجمع گرادیان برابر ۴، نرخ یادگیری 5e-5 و مقدار بتا (beta) برابر ۰.۱. - تنظیمات GRPO: ۶ تکرار، ۴ پرامپت در هر تکرار، ۴ نمونه برای هر پرامپت، ۲ اپوک داخلی، نرخ یادگیری 2e-5 و مقدار KL beta برابر ۰.۰۲.
دادهها از مجموعه openai/gsm8k استخراج شده و با یک پرامپت سیستمی به فرمت گفتگویی تبدیل میشوند: «شما یک دستیار ریاضی دقیق هستید. گام به گام استدلال کنید و سپس با عبارت 'The answer is N' پاسخ را به پایان برسانید.»
جزئیات تبدیل دادهها
- فرمتبندی SFT: تابع
as_messagesردیفهای GSM8K را به لیستی از نقشها (سیستم، کاربر، دستیار) تبدیل میکند. پاسخ دستیار از تگهای<<.*?>>پاکسازی شده و فرمتبندی میشود تا اطمینان حاصل شود که حتماً با عبارت مورد نیاز «The answer is» پایان مییابد. - تولید جفتهای DPO: تابع
make_pairجفتهای ترجیحی را میسازد. پاسخ «انتخاب شده» (chosen) همان راه حل طلایی است. پاسخ «رد شده» (rejected) با برداشتن جواب عددی طلایی و اضافه کردن یک آفست تصادفی از مجموعه[-10, -3, -1, 1, 2, 7]ایجاد میشود. اگر پاسخ عدد نباشد، صرفاً یک «0» به آن اضافه میشود. - توکنسازی RLVR: تابع
rlvr_tokenize_v1پرامپتها و برچسبهای حقیقت زمینی (ground-truth) را برای مرحله یادگیری تقویتی آماده میکند. این کار تضمین میکند که مدل در برابر پاسخ عددی دقیقی که از طریقgsm_answer(با جداسازی توسط جداکننده####) استخراج شده، آزمایش شود.
مرحله اول: تنظیم نظارتشده (SFT)
هدف این مرحله ایجاد یک خط پایه برای پیروی از دستورات است. برای کاهش مصرف حافظه، از لورا (LoRA) استفاده میشود که تنها لایههای attention و feed-forward projection را هدف قرار میدهد. رتبه (Rank) لورا روی ۳۲، lora_alpha روی ۶۴ و lora_dropout روی ۰.۰۵ تنظیم شده است.
- مدیریت داده: سیستم از توکنساز
sft_tulu_tokenize_and_truncate_v1استفاده میکند تا پرامپتهای کاربر را از محاسبه زیان (loss) ماسک کند. این کار تضمین میکند که مدل فقط برای پیشبینی پاسخ دستیار آموزش ببیند. همچنین تابعsft_tulu_filter_v1برای حذف نمونههایی که تمام توکنهای آنها ماسک شدهاند، به کار میرود. - بهینهسازی: آموزش از زیان cross-entropy استفاده میکند که فقط روی توکنهای پاسخ دستیار (بدون ماسک) محاسبه میشود. از بهینهساز
AdamWبا زمانبندی کسینوسی و دوره گرمکردن (warmup) ۵٪ از کل گامها استفاده میشود. مقدار weight decay روی ۰.۰ تنظیم شده است. - بهرهوری سختافزاری: با استفاده از تجمع گرادیان و دقت ترکیبی (FP16 یا BF16)، مدل بدون کرش کردن در حافظه ۱۶ گیگابایتی آموزش میبیند. برش گرادیان (Gradient clipping) با آستانه ۱.۰ با استفاده از
torch.nn.utils.clip_grad_norm_اعمال میشود.
مرحله دوم: بهینهسازی مستقیم ترجیح (DPO)
در این مرحله، مدل یاد میگیرد بین یک راه حل ریاضی درست و یک راه حل بهظاهر درست اما غلط، تفاوت قائل شود.
- منطق احتمال: سیستم احتمالات لگاریتمی توالیها را با نرمالسازی طول (با استفاده از
_get_batch_logps) محاسبه میکند تا مدل صرفاً برای پاسخهای طولانیتر پاداش نگیرد. این مورد توسط پرچمdpo_normکنترل میشود و تابعper_token_logps_fnبرای استخراج این احتمالات از logitهای مدل استفاده میشود. - سیاست مرجع: سیاست فعال لورا با یک سیاست مرجع پایه منجمد (که از طریق
model.disable_adapter()پیاده شده) مقایسه میشود تا از فروپاشی مدل یا فاصله گرفتن بیش از حد از دانش اولیه جلوگیری شود. - پایش: فرآیند آموزش، «دقت پاداش» (تعداد دفعاتی که پاسخ انتخاب شده احتمال لگاریتمی بالاتری نسبت به پاسخ رد شده دارد) و «حاشیه پاداش» (تفاوت بین احتمالات لگاریتمی انتخاب شده و رد شده) را رصد میکند.
- زیان DPO: تابع
dpo_lossاز Open Instruct با مقدارlabel_smoothingبرابر ۰.۰ وdpo_betaبرابر ۰.۱ استفاده میشود.
مرحله سوم: RLVR و GRPO
پیچیدهترین بخش، یادگیری تقویتی با پاداشهای قابل تأیید (RLVR) با استفاده از بهینهسازی سیاست نسبی گروهی (GRPO) است.
مکانیزمهای تأییدکننده:
بهجای استفاده از یک مدل پاداش عصبی، از تأییدکنندههای سختافزاری (Deterministic) استفاده میشود: GSM8KVerifier ،MathVerifier و IFEvalVerifierOld. اینها یک امتیاز مطلق (۰ یا ۱) ضرب در وزن تأییدکننده ارائه میدهند.
- منطق GSM8K: تأییدکننده مقدار بعد از جداکننده
####را استخراج کرده و آن را با پاسخ تولید شده توسط مدل مقایسه میکند. - منطق Math/IFEval: تأییدکننده
MathVerifierپاسخهای محصور در باکسهای LaTeX (مانند\boxed{0.5}) را مدیریت میکند، در حالی کهIFEvalVerifierOldمحدودیتهای کلمات (مثلاً «حداقل ۶ کلمه») را اعتبارسنجی میکند.
جزئیات بهینهسازی GRPO:
- مزیت نسبی گروهی: مدل چندین پاسخ (۴ نمونه برای هر پرامپت) با دمای ۱.۰ و
do_sample=Trueتولید میکند. سپس مزیت هر پاسخ را نسبت به میانگین گروه محاسبه میکند. اگرadv_normروی "standard" باشد، نرمالسازی بر اساس انحراف معیار گروه انجام میشود؛ در غیر این صورت، از یک مزیت ساده مرکزگرا (scores - mean_g) استفاده میشود. - منظمسازی KL: برای حفظ پایداری، خط لوله جریمههای واگرایی KL را نسبت به مدل مرجع با استفاده از
estimate_klاعمال میکند. این کار از «سوءاستفاده از پاداش» (Reward Hacking) جلوگیری میکند. مقدارgrpo_kl_betaروی ۰.۰۲ تنظیم شده است. - برش DAPO: پیادهسازی از
GRPOLossType.dapoو منطق برش (پایین: ۰.۲، بالا: ۰.۲۷۲) استفاده میکند تا اطمینان حاصل شود که بهروزرسانیهای وزنهای مدل تدریجی و پایدار باقی میمانند. - رولاوت و ماسک: فرآیند شامل یک مرحله رولاوت است که در آن مدل توالیها را تولید میکند. یک
full_maskایجاد میشود تا اطمینان حاصل شود که زیان فقط روی توکنهای پاسخ تولید شده محاسبه میشود و نه روی پرامپت. تنسورTERMINATORS(شامل توکنهای EOS و PAD) برای شناسایی نقطه توقف تولید مدل استفاده میشود.
ارزیابی عملکرد
موفقیت مدل از طریق بررسی صحت (Accuracy) مبتنی بر تأییدکننده روی مجموعه آزمون GSM8K سنجیده میشود. این کار به توسعهدهندگان اجازه میدهد دقیقاً ببینند هر مرحله — SFT، DPO و RLVR — چقدر به تواناییهای استدلالی مدل کمک کرده است.
ارزیابی با استفاده از رمزگشایی حریصانه (do_sample=False) و اندازه بچ ۴ انجام میشود. سیستم «دقت تأییدکننده» را رصد میکند که درصد پاسخهای تولید شدهای است که طبق تأییدکننده قطعی، با پاسخ حقیقت زمینی مطابقت دارند. تابع evaluate بهطور موقت KV-cache را از طریق with_cache() فعال میکند تا سرعت تولید افزایش یابد.
پس از مرحله نهایی RLVR، آداپتورهای لورا با استفاده از model.merge_and_unload() با مدل پایه ادغام میشوند. این کار یک چکپوینت مستقل (ذخیره شده به نام tulu-mini) ایجاد میکند که دستاوردهای استدلالی را حفظ کرده و در عین حال برای استقرار در لبه (Edge) به اندازه کافی کوچک است. این فرآیند معادل اجرای اسکریپت open_instruct/merge_lora.py است.
این تغییر در استک پسآموزش، فرضهای رایج درباره «خندق محاسباتی» (Compute Moat) را به چالش میکشد. این موضوع ثابت میکند که منطق Tulu 3 — بهویژه ترکیب بهینهسازی ترجیح و یادگیری تقویتی نسبی گروهی — میتواند به شکلی تقطیر شود که نیازی به مزرعههای سرور نداشته باشد.
برای متخصصان، این به معنای توانایی تکرار خط لولههای RLVR در عرض چند ساعت بهجای چند روز است. این امر توانایی ایجاد مدلهای «استدلالی» را دموکراتیزه میکند؛ مدلهایی که توسط منطق تأیید میشوند، نه صرفاً با تقلید از ترجیحات انسانی.
توسعهدهندگان اکنون میتوانند این مراحل را با کلون کردن مخزن Open Instruct و استفاده از توابع کمکی ارائه شده برای زیان DPO و GRPO پیادهسازی کنند.
گام بعدی شما
- مخزن Open Instruct را کلون کرده و توابع زیان DPO و GRPO را در پروژههای خود به کار بگیرید.
- مدلهای کوچک (SLM) خود را با استفاده از تأییدکنندههای سختافزاری (Deterministic Verifiers) بهجای مدلهای پاداش عصبی تنظیم کنید.
- از تکنیک ادغام لورا برای تبدیل مدلهای آموزشی به مدلهای سبک جهت استقرار در سختافزارهای لبه استفاده کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو