تمثيل تجريدي لغرفة خوادم لامركزية آمنة تعالج بيانات الذكاء الاصطناعي بإضاءة زرقاء

الدليل الشامل للضبط الدقيق الخاص لنماذج اللغات الكبيرة على وحدات معالجة الرسومات اللامركزية

دليل تعليمي شامل حول الضبط الدقيق لنماذج اللغات مفتوحة الأوزان باستخدام مجموعة بياناتك الخاصة عبر استئجار وحدات معالجة الرسومات اللامركزية. احمِ بياناتك، وقلل تكاليف الحوسبة، وحافظ على الخصوصية الكاملة دون التحقق من الهوية أو الارتباط بمزود واحد.

إذا كنت تقرأ هذا، فمن المرجح أنك تمتلك مجموعة بيانات لا تستطيع—أو لا تريد—رفعها إلى OpenAI.

لست وحدك. بالنسبة للعديد من المؤسسات والمطورين المستقلين، فإن راحة ChatGPT تفوقها المخاطر غير المقبولة لتسرب البيانات. سواء كنت تتعامل مع سجلات طبية خاضعة لقانون HIPAA، أو قواعد كود خاصة تمثل سنوات من الاستثمار الهندسي، أو نماذج مالية حساسة يمكن أن تحرك الأسواق، فإن استخدام الذكاء الاصطناعي السحابي غالباً ما يعني الوثوق بطرف ثالث بأثمن ملكيتك الفكرية.

عندما يكون هذا الطرف الثالث تكتلاً تقنياً له تاريخ في استخدام بيانات العملاء لتدريب النماذج المستقبلية، تصبح كلمة “الوثوق” غير مريحة.

الحل ليس التخلي عن الذكاء الاصطناعي. الحل هو امتلاك البنية التحتية.

لم يعد الضبط الدقيق لنماذج مفتوحة الأوزان على أجهزة تتحكم فيها مسعى أكاديمياً متخصصاً. إنه متطلب عمل للمؤسسات المهتمة بالخصوصية. نماذج مثل Llama وMistral وQwen والعشرات غيرها متاحة للاستخدام التجاري بدون رسوم API وبدون متطلبات مشاركة البيانات. التحدي كان دائماً الوصول إلى الحوسبة. شراء مجموعات NVIDIA H100 يتطلب ملايين في النفقات الرأسمالية. الاستئجار من AWS يتطلب التحقق من الهوية واتفاقيات المؤسسات وأسعار بالساعة تجعل جلسات التدريب الممتدة باهظة التكلفة.

يقدم هذا الدليل مساراً ثالثاً. ستتعلم كيفية الضبط الدقيق لنموذج لغة مفتوح الأوزان باستخدام استئجار وحدات معالجة الرسومات اللامركزية—أجهزة يملكها أفراد حول العالم، يمكن الوصول إليها عبر سوق نظير إلى نظير. سنغطي إعداد البيئة وبروتوكولات الأمان للعمل على العقد العامة والتنفيذ الكامل للتدريب.

تستخدم أمثلة الكود Llama-3.1-8B كمرجع عملي ملموس، لكن سير العمل ينطبق بشكل مماثل على أي نموذج متوافق مع Hugging Face. استبدل معرّف النموذج ويمكنك الضبط الدقيق لـ Mistral-7B أو Qwen2-7B أو أي إصدار مفتوح الأوزان يناسب حالة استخدامك.

ستحقق هذا بدون التحقق من الهوية، وبدون عقود طويلة الأجل، وبجزء بسيط مما يتقاضاه مزودو السحابة التقليديون.

نافذة طرفية تعرض اتصال SSH نشط بخادم GPU بعيد

اقتصاديات الضبط الدقيق الخاص

قبل أن نفحص التنفيذ التقني، دعنا نحدد السياق المالي.

يتطلب التدريب على AWS التعامل مع ندرة المثيلات. مثيل p4d.24xlarge (8 وحدات A100) يكلف 32.77 دولاراً في الساعة عندما تستطيع الحصول عليه، وهذا نادر. تقدم Lambda Labs أسعاراً أفضل لكنها تحتفظ بقوائم انتظار تمتد لأسابيع. كلاهما يتطلب بطاقات ائتمان والتحقق من الهوية وينتج سجلات فواتير مفصلة تربط أنشطتك في الذكاء الاصطناعي بهويتك القانونية.

في السوق اللامركزي، تستأجر قوة الحوسبة مباشرة من مالكي الأجهزة. هذه بنية تحتية نظير إلى نظير تعمل على قضبان الدفع القائمة على البلوكتشين. الآثار المترتبة مهمة:

خفض التكلفة: تُستأجر RTX 4090 مقابل 0.40 إلى 0.60 دولار في الساعة على معظم المنصات اللامركزية. لنماذج 8 مليار معامل باستخدام QLoRA، تكمل بطاقة 4090 واحدة بـ 24 جيجابايت من ذاكرة الفيديو جلسة الضبط الدقيق في ساعتين إلى ست ساعات حسب حجم مجموعة البيانات. تتراوح تكلفة الحوسبة الإجمالية من ثلاثة إلى ثمانية دولارات.

الخصوصية بالتصميم: تتم المدفوعات عبر معاملات العملات المستقرة على شبكات مثل Polygon. لا توجد بطاقة ائتمان تربط هويتك بالإيجار. يتعامل العقد الذكي للسوق مع الضمان، كما هو مفصل في وثائق الضمان لدينا، مما يضمن عدم قدرة أي طرف على الاحتيال على الآخر.

لا حراس بوابات: لا تحتاج إلى موافقة من فريق مبيعات المؤسسات لمزود السحابة. لا توقع سياسات الاستخدام المقبول التي تمنح المزود حقوقاً لفحص أعباء العمل الخاصة بك. تقوم بتوصيل محفظة وتستأجر الأجهزة.

للمقارنة: سير العمل المكافئ للضبط الدقيق على AWS باستخدام مثيل A10G واحد (الخيار الأرخص بذاكرة فيديو كافية) يكلف حوالي 1.50 دولار في الساعة. ضع في الاعتبار وقت الإعداد والحوسبة الخاملة أثناء تكوين بيئتك وعدم القدرة على الدفع بشكل مجهول، وتقترب التكلفة الحقيقية من 150 إلى 300 دولار لما يمكنك إنجازه بأقل من عشرة دولارات على البنية التحتية اللامركزية.

هذه الاقتصاديات موثقة بالتفصيل في مقارنة أسعار استئجار GPU لدينا.

المتطلبات المسبقة

يفترض هذا الدليل الإلمام بسطر أوامر Linux. لا تحتاج إلى درجة دكتوراه في التعلم الآلي، لكن يجب أن تكون مرتاحاً في التنقل في نظام الملفات وتحرير الملفات النصية وتفسير رسائل الخطأ.

متطلبات الأجهزة:

  • وحدة معالجة الرسومات: 24 جيجابايت كحد أدنى من ذاكرة الفيديو. RTX 3090 وRTX 4090 وA10G جميعها مؤهلة. لنموذج 70 مليار معامل، تحتاج 48 جيجابايت أو أكثر (A6000، أو A100 مزدوجة، أو H100).
  • ذاكرة النظام: 32 جيجابايت أو أعلى. تقوم عملية تحميل النموذج بتخزين الأوزان في ذاكرة النظام قبل نقلها إلى وحدة معالجة الرسومات.
  • التخزين: 100 جيجابايت أو أكثر من مساحة NVMe SSD. تستهلك أوزان Llama-3 8B الأساسية حوالي 16 جيجابايت. تضيف مجموعة البيانات ونقاط التفتيش والمحول الناتج عبئاً إضافياً.

ملاحظة حول اختيار النموذج: يستخدم هذا الدليل Llama-3.1-8B من Meta كمثال عملي لأنه يمثل أكبر فئة من النماذج التي تناسب وحدة معالجة رسومات واحدة بـ 24 جيجابايت مع تكميم QLoRA. تتضمن عائلة Llama الآن Llama 4 Scout وMaverick، لكن هذه تستخدم بنية خليط الخبراء مع 109 مليار و400 مليار معامل إجمالي على التوالي، مما يتطلب تكوينات متعددة وحدات معالجة الرسومات تتجاوز نطاق استئجار عقدة واحدة. ينطبق سير العمل الموصوف هنا بالتساوي على Mistral-7B وQwen2-7B وGemma-2-9B وأي نموذج آخر متوافق مع Hugging Face يتناسب مع قيود ذاكرة الفيديو للأجهزة المستأجرة.

المتطلبات البرمجية المسبقة:

  • Python 3.10 أو أحدث
  • إلمام أساسي بـ PyTorch
  • حساب Hugging Face (مطلوب لتنزيل النماذج المحظورة مثل Llama التي تتطلب قبول الترخيص)
  • محفظة عملات مشفرة (MetaMask أو ما يعادلها) ممولة بـ USDC أو MATIC على شبكة Polygon

إذا لم تكن قد أعددت محفظة لاستئجار وحدة معالجة الرسومات اللامركزية، أكمل دليل إعداد MetaMask وPolygon قبل المتابعة. تستغرق العملية حوالي خمسة عشر دقيقة.

الخطوة 1: تأمين عقدة الحوسبة الخاصة بك

الخطوة الأولى هي الحصول على الأجهزة. على منصات السحابة المركزية، يتضمن ذلك إنشاء حساب وتحميل وثائق الهوية وانتظار الموافقة وإضافة طريقة دفع. هنا، العملية أكثر مباشرة بشكل كبير.

انتقل إلى سوق GPUFlow. قم بتوصيل محفظتك باستخدام الزر في الزاوية العلوية اليمنى. تعرض الواجهة الأجهزة المتاحة مع مواصفاتها وأسعارها بالساعة ودرجات الموثوقية.

قم بالتصفية للأجهزة ذات الخصائص التالية:

  • وحدة معالجة الرسومات: RTX 4090 (24 جيجابايت ذاكرة فيديو) أو RTX 6000 Ada (48 جيجابايت ذاكرة فيديو)
  • الذاكرة: 32 جيجابايت كحد أدنى
  • التخزين: 100 جيجابايت أو أكثر متاح
  • الموثوقية: درجة وقت تشغيل 95% أو أعلى

اختر عقدة وابدأ الإيجار. سيطلب العقد الذكي إيداعاً يغطي استخدامك المقدر. يمكنك مراجعة كيف تحمي آلية الضمان هذه كلا الطرفين في شرح ضمان العقد الذكي لدينا.

اعتبارات الأمان للعقد العامة:

عندما تستأجر جهازاً على أي شبكة بعيدة، فأنت تصل إلى أجهزة مملوكة ومُتحكم بها فعلياً من قبل شخص غريب. توفر طبقة المحاكاة الافتراضية عزلاً ذا مغزى، لكن يجب أن تعمل بحذر مناسب:

  1. لا تخزن المفاتيح الخاصة على الجهاز البعيد. محفظة العملات المشفرة ومفاتيح SSH للأنظمة الأخرى ورموز API لخدمات الإنتاج يجب ألا توجد أبداً على عقدة إيجار.

  2. تعامل مع نظام الملفات على أنه معادٍ. افترض أن أي شيء تكتبه على القرص يمكن نظرياً استرداده من قبل المضيف بعد قطع الاتصال. سنغطي إجراءات الحذف الآمن في الخطوة 6.

  3. شفّر البيانات الحساسة أثناء النقل. نتناول هذا في الخطوة 3.

  4. لا تعد استخدام كلمات المرور. إذا وفرت واجهة الإيجار بيانات اعتماد افتراضية، قم بتغييرها فوراً أو أنشئ زوج مفاتيح SSH جديد.

بمجرد تأكيد إيجارك، توفر لوحة التحكم تفاصيل الاتصال. ستتلقى أمر SSH يشبه التالي:

ssh -p 22345 [email protected]

افتح الطرفية المحلية الخاصة بك ونفذ هذا الأمر. اقبل بصمة مفتاح المضيف عند المطالبة. أنت الآن متصل بعقدة GPU المستأجرة.

تحقق من أن الأجهزة تطابق طلبك:

nvidia-smi

يجب أن يعرض الناتج وحدة معالجة الرسومات المستأجرة وسعة ذاكرتها وإصدار برنامج التشغيل المثبت. إذا لم تظهر وحدة معالجة الرسومات أو اختلفت المواصفات عن طلبك، اقطع الاتصال فوراً وأبلغ عن التناقض من خلال نظام نزاعات السوق.

الخطوة 2: تكوين البيئة

مع إنشاء اتصال SSH موثق، الأولوية التالية هي بناء بيئة Python نظيفة. تأتي معظم عقد الإيجار مع برامج تشغيل NVIDIA ومجموعات أدوات CUDA مثبتة مسبقاً، لكن الاعتماد على حزم Python على مستوى النظام للمضيف يدعو إلى تعارضات التبعية التي ستستهلك ساعات من تصحيح الأخطاء.

سننشئ بيئة افتراضية معزولة لضمان قابلية إعادة الإنتاج والاستقرار.

نفذ الأوامر التالية لإنشاء مساحة العمل الخاصة بك:

mkdir ~/llama3-finetune
cd ~/llama3-finetune
python3 -m venv venv
source venv/bin/activate

يجب أن تعرض موجه الطرفية الآن (venv) مما يشير إلى أن البيئة الافتراضية نشطة. ستكون جميع عمليات تثبيت الحزم اللاحقة محتواة داخل هذا الدليل، تاركة نظام المضيف دون تغيير.

قبل تثبيت حزم Python، تحقق من أن مجموعة أدوات CUDA يمكن الوصول إليها:

nvcc --version

لاحظ رقم إصدار CUDA. ستحتاج هذا لضمان التوافق مع PyTorch. تعمل معظم عقد الإيجار بـ CUDA 11.8 أو 12.1. إذا لم يُعثر على nvcc، فقد لا تكون مجموعة أدوات CUDA في PATH الخاص بك. يُحل هذا عادةً بتشغيل ملف البيئة المناسب:

source /etc/profile.d/cuda.sh

إذا لم يكن هذا الملف موجوداً، راجع وثائق السوق لتكوين العقدة المحدد الخاص بك.

الآن ثبّت منظومة PyTorch. يثبت الأمر التالي PyTorch مع دعم CUDA 12.1. اضبط لاحقة إصدار CUDA إذا كانت عقدتك تعمل بإصدار مختلف:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

بعد ذلك، ثبّت المكتبات المطلوبة للضبط الدقيق الفعال. نستخدم منظومة Hugging Face جنباً إلى جنب مع bitsandbytes للتكميم وPEFT للتدريب الفعال للمعاملات:

pip install transformers==4.40.0 datasets==2.19.0 peft==0.10.0 bitsandbytes==0.43.1 trl==0.8.6 accelerate==0.29.0

تثبيت الإصدارات مهم. الإصدارات أعلاه مختبرة ومتوافقة حتى وقت كتابة هذا. تتطور منظومة Hugging Face بسرعة، والتثبيتات غير المثبتة تُدخل بشكل متكرر تغييرات مُعطِّلة. إذا واجهت أخطاء استيراد أو سلوكاً غير متوقع، فإن عدم تطابق الإصدارات هو السبب الأكثر احتمالاً.

أخيراً، صادق مع Hugging Face. أوزان Llama-3 محظورة خلف اتفاقية ترخيص تتطلب حساب Hugging Face. انتقل إلى مستودع Meta Llama-3 واقبل شروط الترخيص. ثم أنشئ رمز وصول من صفحة إعدادات Hugging Face الخاصة بك.

نفذ أمر المصادقة:

huggingface-cli login

الصق رمز الوصول عند المطالبة. يُخزَّن الرمز في ~/.cache/huggingface/token. لديك الآن تفويض لتنزيل أوزان النماذج المحظورة مباشرة إلى عقدة الإيجار.

كود Python معروض في طرفية يُظهر معاملات تكوين نموذج Llama-3

الخطوة 3: نقل البيانات الآمن

يتناول هذا القسم السبب الرئيسي لاستئجارك حوسبة لامركزية بدلاً من استدعاء واجهة برمجة تطبيقات: السيادة على البيانات.

يتضمن سير العمل السحابي القياسي رفع مجموعة بياناتك إلى حاوية تخزين—S3 أو Google Cloud Storage أو Azure Blob—ثم تنزيلها إلى مثيل الحوسبة الخاص بك. ينشئ هذا النهج نسخاً متعددة من بياناتك الحساسة عبر أنظمة لا تتحكم فيها. مزود التخزين لديه حق الوصول. مزود الحوسبة لديه حق الوصول. كلاهما يحتفظ بسجلات نشاطك.

سنتجاوز هذا بالكامل باستخدام النقل المشفر المباشر.

يتضمن بروتوكول SSH أداة scp (بروتوكول النسخ الآمن)، التي تنقل الملفات عبر نفس القناة المشفرة التي تستخدمها للوصول إلى الطرفية. تنتقل بياناتك مباشرة من جهازك المحلي إلى عقدة الإيجار دون المرور بأي تخزين وسيط.

افتح نافذة طرفية جديدة على جهاز الكمبيوتر المحلي الخاص بك. لا تغلق جلسة SSH الحالية إلى عقدة الإيجار. نفذ الأمر التالي، مع استبدال مسار الملف الفعلي وتفاصيل الاتصال:

scp -P 22345 /path/to/your/dataset.jsonl [email protected]:~/llama3-finetune/

يحدد علم -P رقم المنفذ (لاحظ الحرف الكبير P، الذي يختلف عن حرف -p الصغير في ssh). لمجموعات البيانات الكبيرة، قد يستغرق النقل عدة دقائق. سترى ناتج التقدم يشير إلى البايتات المنقولة.

لمجموعات البيانات التي تتجاوز 1 جيجابايت، فكر في الضغط قبل النقل:

# على جهازك المحلي
gzip -k dataset.jsonl
scp -P 22345 dataset.jsonl.gz [email protected]:~/llama3-finetune/

# ثم على العقدة البعيدة
cd ~/llama3-finetune
gunzip dataset.jsonl.gz

تدابير أمان إضافية:

إذا كان نموذج التهديد الخاص بك يتضمن خصوماً متطورين، قد ترغب في تشفير مجموعة البيانات قبل النقل باستخدام GPG أو age. يوفر هذا دفاعاً متعدد الطبقات: حتى لو تم اعتراض النقل بطريقة ما، تظل المحتويات غير قابلة للقراءة.

# على جهازك المحلي (باستخدام تشفير age)
age -p dataset.jsonl > dataset.jsonl.age
scp -P 22345 dataset.jsonl.age [email protected]:~/llama3-finetune/

# على العقدة البعيدة
age -d dataset.jsonl.age > dataset.jsonl
rm dataset.jsonl.age

لمعظم المستخدمين، يوفر نقل SCP القياسي حماية كافية. يستخدم بروتوكول SSH تشفير AES-256. يُمنع هجوم الرجل في المنتصف من خلال التحقق من مفتاح المضيف. بياناتك لا تمر عبر أي أنظمة تخزين تابعة لطرف ثالث.

الخطوة 4: سكريبت الضبط الدقيق

سنستخدم فئة SFTTrainer من مكتبة TRL (التعلم المعزز للمحولات) لتنفيذ الضبط الدقيق الموجَّه. تُجرّد هذه المكتبة تعقيداً كبيراً مع بقائها قابلة للتكوين لأعباء العمل الإنتاجية.

قبل كتابة سكريبت التدريب، يجب أن تفهم تنسيق مجموعة البيانات المتوقع.

متطلبات تنسيق مجموعة البيانات:

يتوقع السكريبت ملف JSONL (سطور JSON) حيث يحتوي كل سطر على كائن JSON صالح بحقل text. يجب أن يحتوي حقل text على مثال التدريب الكامل منسقاً كسلسلة واحدة.

إليك مثال على ثلاثة سطور منسقة بشكل صحيح:

{"text": "### Instruction: Summarize the following legal clause in plain English.\n\n### Input: Party A shall indemnify, defend, and hold harmless Party B from any claims, damages, or expenses arising from Party A's negligence or willful misconduct.\n\n### Response: Party A agrees to protect Party B from any legal claims or costs that result from Party A's mistakes or intentional wrongdoing."}
{"text": "### Instruction: Extract the key financial metrics from this earnings report.\n\n### Input: Q3 revenue reached $4.2B, up 12% YoY. Operating margin improved to 23.5% from 21.2%. Free cash flow was $890M.\n\n### Response: Revenue: $4.2 billion (12% year-over-year growth). Operating margin: 23.5% (up from 21.2%). Free cash flow: $890 million."}
{"text": "### Instruction: Identify potential HIPAA violations in this process description.\n\n### Input: Patient records are emailed to the billing department as PDF attachments. The billing staff prints these for manual review and shreds them after processing.\n\n### Response: Potential violations include: unencrypted email transmission of PHI, physical documents that may be visible to unauthorized personnel during processing, and lack of documented chain of custody. Recommend encrypted file transfer and on-screen review only."}

ملاحظات التنسيق الحرجة:

  1. يجب أن يشغل كل كائن JSON سطراً واحداً بالضبط. لا JSON متعدد الأسطر.
  2. يجب تهريب أسطر جديدة داخل حقل text كـ \n.
  3. يجب تهريب علامات الاقتباس داخل النص كـ \".
  4. يجب أن يستخدم الملف ترميز UTF-8.

إذا كانت بياناتك المصدرية موجودة بتنسيق مختلف (CSV أو Parquet أو أعمدة تعليمات/استجابة منفصلة)، ستحتاج إلى معالجتها مسبقاً في هذا الهيكل قبل النقل. تتعامل مكتبة json في Python مع التهريب تلقائياً:

import json

with open('dataset.jsonl', 'w') as f:
    for example in your_data:
        text = f"### Instruction: {example['instruction']}\n\n### Input: {example['input']}\n\n### Response: {example['output']}"
        f.write(json.dumps({"text": text}) + '\n')

مع وجود مجموعة بياناتك في مكانها، أنشئ سكريبت التدريب على العقدة البعيدة:

cd ~/llama3-finetune
nano train.py

الصق التكوين التالي. يستخدم هذا السكريبت QLoRA للضبط الدقيق لنموذج بـ 8 مليار معامل ضمن قيود ذاكرة بطاقة 24 جيجابايت. يستخدم المثال Llama-3.1-8B لكن يمكنك استبدال أي نموذج متوافق عن طريق تغيير متغير MODEL_NAME:

import torch
from datasets import load_dataset
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
    TrainingArguments,
)
from peft import LoraConfig
from trl import SFTTrainer

# ============================================
# التكوين - عدّل هذه القيم حسب الحاجة
# ============================================

# معرّف النموذج الأساسي على Hugging Face
# غيّر هذا للضبط الدقيق لنموذج مختلف (مثل "mistralai/Mistral-7B-v0.1")
MODEL_NAME = "meta-llama/Llama-3.1-8B"

# اسم المحول المضبوط دقيقاً
OUTPUT_NAME = "llama-3-8b-custom"

# مسار مجموعة البيانات الخاصة بك
DATASET_PATH = "dataset.jsonl"

# معاملات التدريب الفائقة
NUM_EPOCHS = 1
BATCH_SIZE = 4
LEARNING_RATE = 2e-4
MAX_SEQ_LENGTH = 512

# معاملات LoRA الفائقة
LORA_RANK = 16
LORA_ALPHA = 16
LORA_DROPOUT = 0.05

# ============================================
# تكوين التكميم
# ============================================

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
)

# ============================================
# تحميل النموذج
# ============================================

print("Loading base model...")
model = AutoModelForCausalLM.from_pretrained(
    MODEL_NAME,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True,
)
model.config.use_cache = False

print("Loading tokenizer...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

# ============================================
# تحميل مجموعة البيانات
# ============================================

print(f"Loading dataset from {DATASET_PATH}...")
dataset = load_dataset("json", data_files=DATASET_PATH, split="train")
print(f"Dataset contains {len(dataset)} examples")

# ============================================
# تكوين LoRA
# ============================================

peft_config = LoraConfig(
    r=LORA_RANK,
    lora_alpha=LORA_ALPHA,
    lora_dropout=LORA_DROPOUT,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
)

# ============================================
# معاملات التدريب
# ============================================

training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=NUM_EPOCHS,
    per_device_train_batch_size=BATCH_SIZE,
    gradient_accumulation_steps=1,
    learning_rate=LEARNING_RATE,
    weight_decay=0.001,
    fp16=True,
    logging_steps=10,
    save_steps=100,
    save_total_limit=3,
    optim="paged_adamw_32bit",
    lr_scheduler_type="cosine",
    warmup_ratio=0.03,
    report_to="none",
)

# ============================================
# تهيئة المدرب والتنفيذ
# ============================================

print("Initializing trainer...")
trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    peft_config=peft_config,
    dataset_text_field="text",
    max_seq_length=MAX_SEQ_LENGTH,
    tokenizer=tokenizer,
    args=training_args,
)

print("Starting training...")
trainer.train()

print(f"Saving adapter to {OUTPUT_NAME}...")
trainer.model.save_pretrained(OUTPUT_NAME)
tokenizer.save_pretrained(OUTPUT_NAME)

print("Training complete.")

احفظ الملف بـ Ctrl+O، ثم اخرج بـ Ctrl+X.

فهم المعاملات الرئيسية:

  • LORA_RANK (r=16): يتحكم في قوة التعبير للمحول المضبوط دقيقاً. القيم الأعلى تتعلم أكثر لكنها تتطلب ذاكرة أكثر. القيم بين 8 و64 نموذجية.

  • LORA_ALPHA (16): عامل القياس لأوزان LoRA. قاعدة إرشادية شائعة تضع هذا مساوياً للرتبة.

  • MAX_SEQ_LENGTH (512): أقصى طول للرموز لأمثلة التدريب. التسلسلات الأطول تتطلب ذاكرة أكثر. إذا واجهت أخطاء نفاد الذاكرة، قلل هذه القيمة أولاً.

  • BATCH_SIZE (4): عدد الأمثلة المعالجة في وقت واحد. قلل إلى 2 أو 1 إذا كانت الذاكرة غير كافية.

  • target_modules: الطبقات المحددة حيث يتم حقن محولات LoRA. لـ Llama-3، توفر طبقات إسقاط الانتباه (q، k، v، o) أفضل النتائج.

لبدء التدريب، نفذ:

python train.py

سيقوم السكريبت أولاً بتنزيل أوزان النموذج الأساسي (حوالي 16 جيجابايت لنموذج 8B). يحدث هذا مرة واحدة فقط؛ الجلسات اللاحقة تستخدم الأوزان المخزنة مؤقتاً. بعد اكتمال التحميل، سترى تقدم التدريب مع طباعة قيم الخسارة كل 10 خطوات.

الخطوة 5: مراقبة جلسة التدريب

أثناء تنفيذ سكريبت التدريب، يجب عليك مراقبة صحة وحدة معالجة الرسومات. إذا تشبعت ذاكرة الفيديو أو تجاوزت درجات الحرارة عتبات آمنة، ستتعطل العملية—مما قد يؤدي إلى إتلاف نقطة التفتيش وإهدار وقت الإيجار.

افتح نافذة طرفية ثانية على جهازك المحلي وأنشئ اتصال SSH آخر إلى عقدة الإيجار:

ssh -p 22345 [email protected]

نفذ الأمر التالي لعرض إحصائيات GPU في الوقت الفعلي:

watch -n 1 nvidia-smi

طرفية تعرض ناتج nvidia-smi مع استخدام ذاكرة GPU وإحصائيات درجة الحرارة

تُحدَّث هذه الأداة كل ثانية، وتعرض استخدام الذاكرة ونسبة استخدام GPU ودرجة الحرارة. على RTX 4090 التي تعمل بالتكوين المحدد في هذا الدليل، يجب أن تلاحظ:

  • استخدام الذاكرة: 18 إلى 22 جيجابايت من أصل 24 جيجابايت المتاحة
  • استخدام GPU: 90% إلى 100% أثناء خطوات التدريب النشطة
  • درجة الحرارة: 60 إلى 80 درجة مئوية حسب حل التبريد لدى المضيف

استكشاف المشاكل الشائعة وإصلاحها:

الذاكرة تقترب من 24 جيجابايت: إذا رأيت استخدام الذاكرة يصل باستمرار إلى السقف، قلل معامل BATCH_SIZE في سكريبت التدريب إلى 2 أو 1. بدلاً من ذلك، قلل MAX_SEQ_LENGTH إلى 256. أي تغيير يتطلب إعادة تشغيل جلسة التدريب.

استخدام GPU قريب من 0%: هذا يشير عادةً إلى عنق زجاجة في تحميل البيانات. لا يستطيع المعالج تغذية الأمثلة لوحدة معالجة الرسومات بسرعة كافية. هذا أقل شيوعاً على العقد المجهزة بـ NVMe لكن قد يحدث مع مجموعات البيانات الكبيرة جداً. فكر في المعالجة المسبقة لمجموعة بياناتك إلى تنسيق أكثر كفاءة (Arrow/Parquet) قبل النقل.

درجة الحرارة تتجاوز 85 درجة مئوية: بعض المضيفين يشغّلون وحدات معالجة الرسومات في حاويات سيئة التهوية. قد تؤدي درجات الحرارة المرتفعة المستمرة إلى خنق حراري، مما يبطئ تدريبك. إذا تجاوزت درجات الحرارة باستمرار 85 درجة مئوية، فكر في إنهاء الإيجار واختيار عقدة مختلفة. تلف الأجهزة مشكلة المضيف، لكن الوقت الضائع ونقاط التفتيش التالفة مشكلتك.

تفسير منحنى الخسارة:

يُخرج سكريبت التدريب قيمة خسارة كل 10 خطوات. يمثل هذا الرقم مدى “خطأ” تنبؤات النموذج—الأقل أفضل. يجب أن تلاحظ:

  • الخسارة الأولية: عادةً بين 1.5 و3.0 حسب مجموعة بياناتك
  • الاتجاه: تناقص مستمر خلال عدة مئات من الخطوات الأولى
  • الخسارة النهائية: عادةً بين 0.5 و1.5 لجلسة مُكوَّنة جيداً

إذا ركدت الخسارة فوراً (لا تناقص بعد 100 خطوة)، قد يكون معدل التعلم منخفضاً جداً. إذا تذبذبت الخسارة بشكل كبير أو زادت، فإن معدل التعلم مرتفع جداً. القيمة الافتراضية 2e-4 تعمل جيداً لمعظم مجموعات البيانات، لكن قد يكون التعديل ضرورياً.

إذا تناقصت الخسارة بسلاسة ثم ارتفعت فجأة إلى قيم عالية جداً (+10)، فمن المحتمل أن تحتوي مجموعة بياناتك على أمثلة مشوهة. أوقف التدريب، وافحص ملف JSONL بحثاً عن أخطاء الترميز أو الأحرف المُهرَّبة بشكل غير صحيح، وأعد التشغيل.

تكتمل جلسة الضبط الدقيق النموذجية على 1000 مثال في 30 إلى 60 دقيقة على RTX 4090. تتناسب مجموعات البيانات الأكبر بشكل خطي تقريباً—10000 مثال تتطلب 5 إلى 10 ساعات.

الخطوة 6: استرداد نموذجك وتنظيف البيئة

عند اكتمال التدريب، توجد أوزانك المضبوطة دقيقاً كمحول LoRA في الدليل المحدد بواسطة OUTPUT_NAME. هذا المحول مضغوط—عادةً من 100 إلى 500 ميجابايت—مقارنةً بالنموذج الأساسي الكامل بحجم 16 جيجابايت.

أولاً، تحقق من وجود ملفات المحول:

ls -la ~/llama3-finetune/llama-3-8b-custom/

يجب أن ترى ملفات تتضمن adapter_config.json وadapter_model.safetensors وملفات المُرمِّز.

لا تدمج المحول على عقدة الإيجار. يجمع الدمج أوزان LoRA مع النموذج الأساسي لإنشاء نموذج مستقل مضبوط دقيقاً. تتطلب هذه العملية تحميل النموذج الأساسي الكامل بدقة 16 بت في الذاكرة، مما قد يتجاوز ذاكرة الفيديو المتاحة على بطاقة 24 جيجابايت. نفّذ الدمج على بنيتك التحتية المحلية، أو ببساطة حمّل المحول جنباً إلى جنب مع النموذج الأساسي أثناء الاستدلال. تتعامل مكتبة PEFT مع هذا بسلاسة:

from peft import PeftModel
from transformers import AutoModelForCausalLM

base_model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B",

لتنزيل محولك، عُد إلى الطرفية المحلية (ليس جلسة SSH) ونفّذ:

scp -r -P 22345 [email protected]:~/llama3-finetune/llama-3-8b-custom ./

يُمكّن علم -r النسخ التكراري للدليل بأكمله. تحقق من اكتمال النقل بنجاح عن طريق التحقق من تطابق أحجام الملفات المحلية مع البعيدة.

تنظيف البيئة البعيدة:

هذه الخطوة تفصل المحترفين عن الهواة. تحتوي عقدة الإيجار الآن على مجموعة بياناتك الخاصة وكود التدريب وأوزان النماذج المخزنة مؤقتاً. ترك هذه المواد على جهاز لا تتحكم فيه ينتهك الأمان التشغيلي الأساسي.

عُد إلى جلسة SSH على عقدة الإيجار ونفّذ الأوامر التالية:

# إزالة دليل العمل وجميع محتوياته
rm -rf ~/llama3-finetune

# مسح ذاكرة التخزين المؤقت لـ Hugging Face (تحتوي على أوزان النماذج المُنزَّلة)
rm -rf ~/.cache/huggingface

# مسح ذاكرة التخزين المؤقت لحزم Python
rm -rf ~/.cache/pip

# مسح سجل bash
history -c
cat /dev/null > ~/.bash_history

# مسح أي بقايا محتملة في الذاكرة المبادلة (قد يتطلب sudo حسب تكوين العقدة)
sync

إذا وفرت العقدة أداة shred وتريد ضماناً إضافياً بأن الملفات المحذوفة لا يمكن استردادها:

# الحذف الآمن (أبطأ لكن أكثر شمولاً)
find ~/llama3-finetune -type f -exec shred -u {} \;
rm -rf ~/llama3-finetune

اقطع الاتصال بجلسة SSH:

exit

انتقل إلى لوحة تحكم سوق GPUFlow وأنهِ إيجارك رسمياً. سيُعيد العقد الذكي أي إيداع متبقٍّ إلى محفظتك، مطروحاً منه وقت الحوسبة المستهلك.

تشغيل الاستدلال مع نموذجك المضبوط دقيقاً

مع تنزيل المحول إلى جهازك المحلي، يمكنك تشغيل الاستدلال بدون أي اعتماد على السحابة. إليك مثال بسيط:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel

# تكوين التكميم (نفس التدريب)
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
)

# تحميل النموذج الأساسي
base_model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Meta-Llama-3-8B",
    quantization_config=bnb_config,
    device_map="auto",
)

# تحميل المحول المضبوط دقيقاً
model = PeftModel.from_pretrained(base_model, "./llama-3-8b-custom")

# تحميل المُرمِّز
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B")

# توليد استجابة
prompt = "### Instruction: Summarize the contract clause.\n\n### Input: The Licensee shall not reverse engineer, decompile, or disassemble the Software.\n\n### Response:"

inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=100, temperature=0.7)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)

print(response)

للنشر الإنتاجي، فكر في تغليف هذا في واجهة برمجة تطبيقات باستخدام FastAPI أو Flask، أو النشر عبر خوادم الاستدلال مثل vLLM أو Text Generation Inference (TGI). تُستكشف هذه الخيارات في دليلنا القادم حول نشر النماذج المضبوطة دقيقاً.

الخاتمة

لقد ضبطت دقيقاً نموذج لغة كبير متطور على بيانات خاصة دون تعريض تلك البيانات لأي طرف ثالث. أنجزت هذا بدون توقيع عقود مؤسسية، وبدون رفع وثائق الهوية، وبدون منح شركة تقنية حق الوصول إلى ملكيتك الفكرية.

التكلفة الإجمالية لهذه العملية، بافتراض جلسة تدريب مدتها ساعتان على RTX 4090 بسعر 0.45 دولار للساعة، كانت تسعين سنتاً. سير العمل المكافئ على AWS، مع احتساب وقت الإعداد وتكاليف المثيلات وعبء التحقق من الهوية، سيكلف من مائة إلى مائتي دولار.

والأهم من ذلك، لا يوجد سجل يربط هويتك بجلسة التدريب هذه. لا توجد سياسة استخدام مقبول من شركة تحكم ما يمكنك تدريبه. لا توجد شروط خدمة تمنح مزود السحابة حقوقاً لفحص مجموعة بياناتك.

عصر الاعتماد على واجهات برمجة التطبيقات مغلقة المصدر يقترب من نهايته. المؤسسات التي تتطلب الخصوصية، والباحثون الذين يقدّرون السيادة، والمطورون الذين يرفضون المراقبة لديهم بديل. حوسبة GPU اللامركزية تُعيد السيطرة على البنية التحتية والتكاليف والبيانات إلى الأشخاص الذين يخلقون القيمة.

نموذجك المضبوط دقيقاً موجود الآن على أجهزة تتحكم فيها. القرارات حول كيفية نشره، ومن يمكنه الوصول إليه، وما الأغراض التي يخدمها تعود إليك وحدك.


ما يجب قراءته بعد ذلك

غطى هذا الدليل سير العمل الأساسي للضبط الدقيق الخاص لنماذج اللغات الكبيرة. تتناول الموارد التالية مواضيع ذات صلة بعمق أكبر:

فهم التكاليف والدفع:

آليات المنصة:

مقارنة الخيارات:

Frequently Asked Questions

هل يمكنني الضبط الدقيق لنماذج اللغات الكبيرة على بطاقة RTX 4090 واحدة؟

نعم. باستخدام QLoRA (التكيف منخفض الرتبة المُكمَّم)، تناسب النماذج التي تصل إلى 8 مليار معامل بشكل مريح ضمن 24 جيجابايت من ذاكرة الفيديو. يوضح هذا الدليل بالضبط كيفية تكوين سكريبت التدريب للأجهزة الاستهلاكية مع معاملات محددة لحجم الدفعة وطول التسلسل ورتبة LoRA.

هل بياناتي آمنة على استئجار وحدة معالجة رسومات لامركزية؟

بياناتك آمنة بقدر ممارساتك التشغيلية. يغطي هذا الدليل النقل المشفر عبر SCP، وتجنب وسطاء التخزين السحابي مثل S3 أو Google Drive، وتنظيف الجهاز البعيد بعد اكتمال التدريب. النموذج اللامركزي يعني عدم وصول أي شركة واحدة إلى بياناتك أو سجلات التدريب.

كم تكلفة الضبط الدقيق لنموذج 8B على وحدات معالجة الرسومات اللامركزية؟

تتراوح تكلفة جلسة الضبط الدقيق النموذجية لنموذج بـ 8 مليار معامل باستخدام استئجار RTX 4090 بين ثلاثة وثمانية دولارات حسب حجم مجموعة البيانات وعدد دورات التدريب. مقارنة بحوالي 150 إلى 300 دولار للحوسبة المكافئة على AWS أو Lambda Labs بما في ذلك وقت الإعداد ورسوم الخمول.

هل أحتاج إلى إكمال التحقق من الهوية لاستئجار حوسبة GPU للتدريب؟

لا. تتيح لك أسواق وحدات معالجة الرسومات اللامركزية مثل GPUFlow توصيل محفظة عملات مشفرة والبدء في الاستئجار فوراً. لا يوجد تحقق من الهوية، ولا حاجة لبطاقة ائتمان، ولا عقود مؤسسية. تتم المدفوعات عبر العملات المستقرة على شبكات مثل Polygon.

ما هو تنسيق مجموعة البيانات الذي يتوقعه سكريبت التدريب؟

يتوقع السكريبت ملف JSONL حيث يحتوي كل سطر على كائن JSON بحقل text. يجب أن يحتوي حقل text على تعليماتك ومدخلاتك واستجابتك منسقة كسلسلة واحدة مع أحرف السطر الجديد. يتم تقديم مثال بالتنسيق الصحيح في الخطوة 4 من هذا الدليل.

هل يعمل هذا الدليل مع نماذج أخرى غير Llama؟

نعم. ينطبق سير العمل على أي نموذج مفتوح الأوزان بما في ذلك Mistral وQwen وFalcon وغيرها. يستخدم مثال الكود Llama-3.1-8B لكنك تحتاج فقط إلى تغيير معرّف النموذج للضبط الدقيق لنموذج أساسي مختلف.

كم يستغرق الضبط الدقيق لنموذج بـ 8 مليار معامل؟

يعتمد وقت التدريب على حجم مجموعة البيانات. تكتمل الجلسة النموذجية مع 1000 مثال في 30 إلى 60 دقيقة على RTX 4090. تتناسب مجموعات البيانات الأكبر بشكل خطي تقريباً. تتطلب مجموعة بيانات من 10000 مثال من 5 إلى 10 ساعات من وقت الحوسبة.

ماذا يجب أن أفعل بالجهاز البعيد بعد اكتمال التدريب؟

يجب عليك تنظيف البيئة بحذف مجموعة البيانات وكود التدريب وذاكرة التخزين المؤقت لـ Hugging Face وسجل bash. يوفر هذا الدليل أوامر محددة للحذف الآمن بما في ذلك الاستخدام الاختياري لـ shred لتدمير الملفات بشكل شامل قبل إنهاء عقد الإيجار.