پرش به محتوا
← همهٔ یادداشت‌ها

آموزش مدل زبانی با Axolotl روی GPU ابری: قدم‌به‌قدم

·۶ دقیقه مطالعه·تیم جی‌پی‌یو

یک آکسولوتل سفید با آبشش‌های پرمانند صورتی، از نمای نزدیک روی کف شنی یک آکواریوم.

برای آموزش مدل زبانی با دیتاست خودتان روی GPU ابری، قالب Axolotl ساده‌ترین مسیر است: یک فایل YAML می‌نویسید، دیتاست را کنارش می‌گذارید و با یک دستور، آموزش LoRA یا QLoRA شروع می‌شود. در این آموزش یک مدل ۸ میلیارد پارامتری را با روش QLoRA روی یک کارت گرافیک ۲۴ گیگابایتی آموزش می‌دهیم، خروجی را تست می‌کنیم و فایل نهایی را برمی‌داریم.

این راهنما برای کسی است که می‌خواهد مدل باز را با پرسش و پاسخ‌های کسب‌وکار خودش، لحن برندش یا یک قالب خروجی مشخص آشنا کند، ولی کارت گرافیک قوی ندارد. اگر دیتاست شما چند هزار ردیف باشد، کل کار معمولاً در یکی دو ساعت تمام می‌شود و هزینه‌اش به اندازهٔ همان یکی دو ساعت اجارهٔ کارت است.

پیش‌نیازها

انتخاب ماشین مناسب برای آموزش مدل زبانی

در QLoRA وزن‌های مدل پایه به‌صورت ۴ بیتی در حافظه بارگذاری می‌شوند و فقط لایه‌های کوچک LoRA آموزش می‌بینند. به همین دلیل یک مدل 8B که آموزش کاملش چند کارت بزرگ می‌خواهد، روی یک کارت ۲۴ گیگابایتی جا می‌شود. هرچه sequence_len (طول هر نمونه) بزرگ‌تر باشد، VRAM بیشتری مصرف می‌شود.

  • پیشنهاد اقتصادی: RTX 3090 با ۲۴ گیگابایت VRAM؛ در زمان نوشتن این مطلب از حدود ۴۴ هزار تومان در ساعت.
  • پیشنهاد سریع: RTX 4090 با همان ۲۴ گیگابایت ولی پردازش سریع‌تر؛ در زمان نوشتن این مطلب از حدود ۱۱۵ هزار تومان در ساعت.
  • فقط برای تمرین: اگر می‌خواهید اول با مدل کوچک 1B کار را یاد بگیرید، RTX A4000 با ۱۶ گیگابایت (در زمان نوشتن این مطلب از حدود ۲۷ هزار تومان در ساعت) کافی است.

Axolotl برای bf16 و Flash Attention به کارت‌های نسل Ampere یا جدیدتر نیاز دارد؛ هر سه کارت بالا این شرط را دارند. ماشین‌ها را در بازار GPU با فیلتر مدل کارت و حافظه پیدا کنید. اگر مطمئن نیستید مدل‌تان چقدر حافظه می‌خواهد، پست اجرای مدل زبانی: جدول VRAM و انتخاب کارت گرافیک را ببینید.

اجاره GPU ابری و راه‌اندازی قالب Axolotl

در بازار روی ماشین دلخواه بزنید و در مرحلهٔ انتخاب قالب، Axolotl را بردارید. بعد از اجاره صبر کنید تا وضعیت ماشین «آماده» شود.

در صفحهٔ ماشین، دستور SSH آماده را با یک کلیک کپی کنید و در ترمینال خودتان اجرا کنید. لینک Jupyter هم همان‌جا ظاهر می‌شود؛ برای آپلود دیتاست با کشیدن و رها کردن راحت‌تر است. برای این آموزش، همهٔ دستورها در ترمینال اجرا می‌شوند.

اول مطمئن شوید Axolotl در دسترس است:

axolotl --help

اگر فهرست دستورها را دیدید، آماده‌اید. اگر پیام «command not found» گرفتید، طبق راهنمای رسمی نصب نصبش کنید:

curl -LsSf https://astral.sh/uv/install.sh | sh
export UV_TORCH_BACKEND=cu130
uv venv --python 3.12
source .venv/bin/activate
uv pip install torch==2.14.0 torchvision
uv pip install --no-build-isolation axolotl[deepspeed]

آماده کردن دیتاست

ساده‌ترین قالبی که Axolotl می‌فهمد، قالب alpaca است: هر خط فایل یک شیء JSON با سه کلید instruction، input و output. کلید input می‌تواند خالی باشد. نمونه:

{"instruction": "ساعت کاری پشتیبانی را بگو.", "input": "", "output": "پشتیبانی هر روز از ساعت ۹ تا ۱۸ پاسخ می‌دهد."}
{"instruction": "این جمله را رسمی کن.", "input": "سفارشت رسید، مرسی!", "output": "سفارش شما دریافت شد. از خرید شما سپاسگزاریم."}

کیفیت دیتاست از تعداد مهم‌تر است. چند صد تا چند هزار نمونهٔ تمیز و یکدست، نتیجهٔ بهتری از ده‌ها هزار ردیف شلوغ می‌دهد. فایل را با نام my_data.jsonl از طریق Jupyter آپلود کنید یا با scp بفرستید؛ روش دوم را در دانلود مدل هوش مصنوعی روی سرور GPU: scp و rsync توضیح داده‌ایم.

ساخت فایل تنظیمات

Axolotl نمونه‌تنظیمات آماده دارد. آن‌ها را بگیرید، فایل QLoRA مدل 8B را کپی کنید و دیتاست نمونه را با فایل خودتان عوض کنید:

axolotl fetch examples
mkdir -p data
mv my_data.jsonl data/
cp examples/llama-3/qlora.yml my-qlora.yml
sed -i 's#aaditya/alpaca_subset_1#data/my_data.jsonl#' my-qlora.yml

بعد از این، بخش دیتاست در my-qlora.yml این شکلی است:

datasets:
  - path: data/my_data.jsonl
    type: alpaca

مدل پایهٔ این فایل NousResearch/Meta-Llama-3-8B است و load_in_4bit: true و adapter: qlora یعنی آموزش به روش QLoRA انجام می‌شود. خروجی در ./outputs/qlora-out ذخیره می‌شود. اگر خواستید فقط سریع تمرین کنید، به‌جای این فایل از examples/llama-3/qlora-1b.yml استفاده کنید که مدل یک میلیارد پارامتری دارد.

اجرای آموزش

اول دیتاست را پیش‌پردازش کنید. این مرحله توکنایزر را می‌گیرد و خطاهای قالب دیتاست را قبل از شروع آموزش نشان می‌دهد:

axolotl preprocess my-qlora.yml

حالا آموزش را شروع کنید. برای این‌که با قطع شدن SSH آموزش نخوابد، آن را در پس‌زمینه اجرا کنید و لاگ را دنبال کنید:

nohup axolotl train my-qlora.yml > train.log 2>&1 &
tail -f train.log

بار اول، مدل پایه (حدود ۱۶ گیگابایت) روی خود ماشین دانلود می‌شود. چون ماشین‌ها خارج از ایران‌اند، این دانلود با سرعت گیگابیتی انجام می‌شود و به اینترنت شما ربطی ندارد. بعد از آن خط‌های لاگ عدد loss را نشان می‌دهند؛ باید در طول آموزش کم‌کم پایین بیاید. با Ctrl+C فقط از tail خارج می‌شوید و آموزش ادامه پیدا می‌کند.

تست و ادغام مدل

وقتی آموزش تمام شد، مدل را با همان فایل تنظیمات امتحان کنید. این دستور یک گفت‌وگوی متنی در ترمینال باز می‌کند:

axolotl inference my-qlora.yml --lora-model-dir="./outputs/qlora-out"

اگر نتیجه راضی‌کننده بود، LoRA را با مدل پایه ادغام کنید تا یک مدل کامل و مستقل داشته باشید. خروجی ادغام در پوشهٔ merged داخل همان output_dir ساخته می‌شود:

axolotl merge-lora my-qlora.yml --lora-model-dir="./outputs/qlora-out"

اگر به مشکل خوردید

  • خطای CUDA out of memory: در فایل YAML مقدار micro_batch_size را به ۱ و sequence_len را به ۲۰۴۸ کم کنید. اگر باز جا نشد، کارت با VRAM بیشتر بگیرید.
  • خطای خواندن دیتاست در preprocess: معمولاً یک خط JSON خراب است، مثلاً ویرگول اضافه یا گیومهٔ بسته‌نشده. هر خط باید یک شیء کامل باشد، بدون کروشه در ابتدا و انتهای فایل.
  • دانلود مدل نیمه‌کاره ماند: همان دستور آموزش را دوباره اجرا کنید؛ فایل‌های کامل‌شده دوباره دانلود نمی‌شوند.
  • loss پایین نمی‌آید یا ناگهان بالا می‌رود: learning_rate را کمتر کنید یا دیتاست را از نظر نمونه‌های تکراری و متناقض بازبینی کنید.

هزینه و صرفه‌جویی

بیشترین زمان را خود آموزش می‌گیرد و آن هم به اندازهٔ دیتاست، sequence_len و تعداد num_epochs بستگی دارد. قبل از اجرای اصلی، یک بار با بخش کوچکی از دیتاست آموزش بدهید تا مطمئن شوید همه‌چیز درست است؛ این‌طور ساعت‌های گران را صرف یک تنظیم اشتباه نمی‌کنید.

دیسک ماشین با حذف آن پاک می‌شود. قبل از حذف، پوشهٔ خروجی را فشرده و دانلود کنید:

tar czf qlora-out.tgz outputs/qlora-out

اگر مدل ادغام‌شده را هم لازم دارید، پوشهٔ merged را جداگانه بردارید؛ حجمش نزدیک به حجم مدل پایه است. بعد از دانلود، ماشین را متوقف یا حذف کنید؛ ماشین متوقف‌شده هزینه‌ای ندارد.

قدم بعدی

فایل LoRA یا مدل ادغام‌شده را می‌توانید روی یک ماشین دیگر سرو کنید و از اپلیکیشن خودتان صدا بزنید؛ روشش در vLLM روی GPU ابری: اجرای مدل زبانی با API اختصاصی آمده است. برای جزئیات بیشتر تنظیمات، مخزن رسمی Axolotl و راهنمای شروع را ببینید.

پرسش‌های متداول

آموزش مدل زبانی با Axolotl چقدر VRAM می‌خواهد؟

برای QLoRA روی مدل 8B، یک کارت ۲۴ گیگابایتی مثل RTX 3090 یا RTX 4090 کافی است. مدل‌های 1B با کارت ۱۶ گیگابایتی هم آموزش می‌بینند. آموزش کامل بدون LoRA چند برابر حافظه می‌خواهد.

فرق LoRA و QLoRA در Axolotl چیست؟

در LoRA مدل پایه با دقت کامل در حافظه می‌نشیند و فقط لایه‌های کوچک LoRA آموزش می‌بینند. در QLoRA مدل پایه ۴ بیتی بارگذاری می‌شود و حافظهٔ خیلی کمتری می‌گیرد. در فایل YAML این تفاوت با adapter: lora یا adapter: qlora و load_in_4bit تعیین می‌شود.

دیتاست Axolotl باید چه فرمتی داشته باشد؟

ساده‌ترین حالت فایل JSONL با کلیدهای instruction، input و output است که در YAML با type: alpaca معرفی می‌شود. Axolotl قالب‌های گفت‌وگویی چندنوبتی را هم پشتیبانی می‌کند که در مستندات رسمی‌اش آمده‌اند.

آیا با قطع شدن اینترنت، آموزش متوقف می‌شود؟

اگر آموزش را با nohup و در پس‌زمینه اجرا کرده باشید، نه. آموزش روی خود ماشین ادامه پیدا می‌کند و بعد از اتصال دوباره با tail -f train.log پیشرفتش را می‌بینید.

تصویر کاور: «Ambystoma mexicanum (6337857516)» اثر Ruben Undheim from Trondheim, Norway، از ویکی‌مدیا کامنز، لایسنس CC BY-SA 2.0.