تستطيع إجراء ضبط دقيق لنموذج مفتوح الأوزان بحجم 8B على بياناتك باستخدام QLoRA على GPU مستأجر واحد بذاكرة 24 GB، والجولة المعتادة تكلّف أقل من دولار. الأسئلة الأصعب تأتي أولاً: هل الضبط الدقيق هو الحل الصحيح أصلاً (للمعلومات، الاسترجاع يفوز عادةً)، وكيف تبقى بياناتك خاصة على جهاز يملكه غيرك.
يتناول هذا الدليل الأمرين، ثم VRAM الذي تحتاج إليه حسب حجم النموذج، والأدوات الحالية، وسكربت تدريب يعمل، وحساباً فعلياً للتكلفة، وطريقة تشغيل النتيجة. راجعنا كل شيء في سبتمبر 2026، والمصادر في آخر المقال.
الضبط الدقيق أم RAG أم موجّهات أفضل
الضبط الدقيق يغيّر طريقة تصرّف النموذج. وهو طريقة سيئة لتعليمه المعلومات. قارن Ovadia وآخرون بين الأسلوبين في حقن المعرفة، ووجدوا أن RAG “يتفوق باستمرار” على الضبط الدقيق غير الموجَّه، “سواء في المعرفة الموجودة التي مرّت أثناء التدريب أو في المعرفة الجديدة كلياً”. وخلاصتهم: النماذج اللغوية الكبيرة تجد صعوبة في تعلّم معلومات جديدة عبر الضبط الدقيق.
لذا امشِ في هذه الشجرة قبل أن تستأجر أي شيء:
أسباب وجيهة للضبط الدقيق:
- صيغة مخرجات صارمة. استخراج الحقول إلى المخطط الذي تريده في كل استدعاء، دون صفحة من التعليمات في كل موجّه.
- الأسلوب والنبرة. ردود دعم تبدو كأن فريقك كتبها، أو تقارير ببنية ثابتة.
- مهمة محددة ينفّذها نموذج صغير. نموذج 8B مضبوط يمكن أن يحل محل نموذج عام كبير في مهمة واحدة، وهذا مهم عندما تشغّله على عتاد رخيص.
- موجّهات أقصر. السلوك الذي تعلّمته الأوزان لا يحتاج إلى تكراره في كل طلب.
LoRA وQLoRA
الضبط الدقيق الكامل يحدّث كل وزن، فيتعيّن على GPU أن يحمل التدرجات وحالة المُحسِّن (optimizer) لكل الأوزان فوق النموذج نفسه. أما LoRA فتجمّد النموذج الأساسي وتدرّب مصفوفات صغيرة منخفضة الرتبة بجانب طبقاته؛ وأفادت الورقة الأصلية بمعاملات قابلة للتدريب أقل 10,000 مرة وذاكرة GPU أقل ثلاث مرات مقارنةً بالضبط الدقيق الكامل لـ GPT-3 175B باستخدام Adam.
وQLoRA تذهب أبعد: يُحمَّل النموذج الأساسي المجمَّد بدقة NF4 ذات 4 بت، ولا تُدرَّب إلا المحوّلات بدقة 16 بت. استخدمها Dettmers وآخرون للضبط الدقيق لنموذج 65B على GPU واحد بذاكرة 48 GB “مع الحفاظ على أداء الضبط الدقيق الكامل بدقة 16 بت”. وأضافت الورقة ثلاثة عناصر لا تزال الأدوات تستخدمها: نوع البيانات NF4، والتكميم المزدوج لثوابت التكميم، والمُحسِّنات المُقسَّمة إلى صفحات (paged optimizers) التي تمتص قفزات الذاكرة.
نتيجة أيٍّ منهما محوِّل (adapter)، أي مجلد فيه بضعة موتّرات (tensors)، تطبّقه فوق النموذج الأساسي دون تغييره. يمكنك إبقاؤه منفصلاً أو دمجه في الأوزان. وتستخدم نماذج الصور الطريقة نفسها: يُدرَّب LoRA لـ Stable Diffusion على بطاقة واحدة مستأجرة بذاكرة 24 GB بتكلفة أقل بكثير من $10.
كم تحتاج من VRAM
تنشر Unsloth جدولاً بالحد الأدنى من VRAM للضبط الدقيق حسب حجم النموذج. هذه أرقامها، مع تحسينات الذاكرة لديها؛ التدريب العادي عبر Hugging Face يحتاج إلى أكثر، والتسلسلات الأطول أو الدفعات الأكبر ترفع كل صف.
| حجم النموذج | QLoRA (4 بت) | LoRA (16 بت) | بطاقة مستأجرة تتسع لـ QLoRA بارتياح |
|---|---|---|---|
| 3B | 3.5 GB | 8 GB | أي بطاقة 12 GB فأكثر |
| 8B | 6 GB | 22 GB | RTX 3090 / 4090 (24 GB) |
| 14B | 8.5 GB | 33 GB | RTX 3090 / 4090 (24 GB) |
| 32B | 26 GB | 76 GB | بطاقة 48 GB (RTX A6000، A40، L40S) |
| 70B | 41 GB | 164 GB | بطاقة 80 GB (A100، H100) |
خياري الافتراضي نموذج 8B أو 14B على RTX 4090. إنها أرخص بطاقة مستأجرة تترك مساحة لتسلسلات من 2,048 توكن ودفعة معقولة، والنماذج في هذا النطاق سهلة التشغيل بعد ذلك. لاختيار نموذج أساسي حسب VRAM الذي ستشغّله عليه، راجع أي نماذج الذكاء الاصطناعي تتسع في VRAM لديك.
اختر أداة: TRL أو Unsloth أو Axolotl
الثلاث مفتوحة المصدر، وكلها تدعم LoRA وQLoRA.
| الأداة | طريقة الاستخدام | نقطة القوة | انتبه إلى |
|---|---|---|---|
| Hugging Face TRL + PEFT | Python (SFTTrainer) | التطبيق المرجعي؛ DPO وGRPO وغيرها عبر الواجهة البرمجية نفسها | تستهلك ذاكرة أكثر من Unsloth في الجولة نفسها |
| Unsloth | Python، أو واجهة الويب Unsloth Studio | تدّعي سرعة مضاعفة وVRAM أقل بـ 70%؛ تصدّر إلى GGUF مباشرة | واجهة Studio بترخيص AGPL-3.0 (النواة Apache 2.0) |
| Axolotl | ملف YAML واحد، axolotl train config.yml | تعدد GPU (FSDP، DeepSpeed)، ووصفات كثيرة | تحتاج إلى Python 3.11 فأحدث وPyTorch 2.11 فأحدث |
حتى سبتمبر 2026، TRL في الإصدار 1.14 وPEFT في 0.21. تحتاج Unsloth إلى Python من 3.11 إلى 3.13 وGPU من NVIDIA بقدرة CUDA 7.0 أو أحدث (V100، T4، سلسلة RTX 20 فما فوق). وتوصي Axolotl بـ Python 3.12 وPyTorch 2.12.1.
استخدم TRL إن أردت فهم كل سطر، وUnsloth إن كانت VRAM لديك محدودة أو أردت التصدير إلى GGUF باستدعاء واحد، وAxolotl إن كنت ستكرر الجولات بإعدادات مختلفة أو ستنتقل إلى عدة GPU. السكربت أدناه يستخدم TRL، لأنها أقصر طريق يُظهر كل جزء متحرك.
جهّز البيانات
يقرأ SFTTrainer في TRL المحادثات بالشكل نفسه لطلب API المحادثة. كائن JSON واحد في كل سطر من train.jsonl:
{"messages": [{"role": "system", "content": "Extract the invoice fields as JSON."}, {"role": "user", "content": "Invoice 4471 from Norden AB, due 12 March, total 1,250 EUR"}, {"role": "assistant", "content": "{\"invoice_id\": \"4471\", \"supplier\": \"Norden AB\", \"due\": \"2026-03-12\", \"total\": 1250, \"currency\": \"EUR\"}"}]}
قواعد عملية:
- الجودة قبل العدد. بضع مئات إلى بضعة آلاف من الأمثلة المتسقة والصحيحة تتفوق على عشرات الآلاف من الأمثلة المشوّشة. كل خطأ في البيانات سلوك تدفع لتعليمه.
- طابِق بيئة الإنتاج. استخدم موجّه النظام وصيغة المدخلات التي سيرسلها تطبيقك فعلاً.
- احتفظ بـ 5 إلى 10% جانباً. أبقِ أمثلة لا يتدرب عليها النموذج أبداً، لتقارن بها النموذج الأساسي والنموذج المضبوط جنباً إلى جنب.
- احذف ما لا تحتاج إليه. الأسماء وعناوين البريد وأرقام الحسابات والمعرّفات نادراً ما تساعد النموذج على تعلّم صيغة. استبدلها بقيم بديلة واقعية قبل أن تغادر البيانات جهازك.
القاعدة الأخيرة تتجاوز الجهاز المستأجر. استخرج Carlini وآخرون مئات التسلسلات الحرفية من بيانات تدريب GPT-2، منها أسماء وأرقام هواتف وعناوين بريد إلكتروني، وبعضها لم يظهر إلا في مستند تدريب واحد. النموذج المضبوط قد يكرر ما تدرّب عليه لأي شخص يستخدمه لاحقاً.
حافظ على خصوصية البيانات على جهاز مستأجر
في سوق GPU، يملك الكمبيوتر شخص آخر. تقولها Vast.ai صراحة: “العملاء معزولون في حاويات Docker بلا صلاحيات مميزة، ولا يصلون إلا إلى بياناتهم”، و”أمان المزوّدين يتفاوت كثيراً”. هذا العزل يحميك من المستأجرين الآخرين. ولا يحميك من الشخص الذي يملك وصولاً فعلياً إلى الجهاز وصلاحيات root على المضيف.
للبيانات الخاصة:
- اختر مضيفاً من مركز بيانات خضع للتدقيق. مزوّدو Secure Cloud في Vast.ai هم “مراكز بيانات خضعت للتدقيق وحاصلة على شهادة ISO 27001 ومعايير مراكز البيانات من الفئة 3/4”، وتوصي بهم Vast للأعمال الحساسة. وتعمل Secure Cloud في RunPod في مراكز بيانات من الفئة T3/T4؛ أما Community Cloud فتوصلك بمزوّدين أفراد. فئات مراكز البيانات أغلى في الساعة، وتستحق ذلك هنا.
- لا ترفع إلا مجموعة البيانات المنظّفة، عبر SSH (
rsync -avPأوscp). لا تضعها مؤقتاً في حاوية تخزين عامة أو رابط مشاركة في الطريق. - أبقِ السجلات محلية. في TRL 1.14 القيمة الافتراضية لـ
report_toهي"none"، فلا يذهب شيء إلى أداة تتبّع التجارب ما لم تفعّلها. لا تستدعِpush_to_hubمع محوِّل مدرَّب على بيانات خاصة. - أخرج النتائج، ثم احذف المثيل. نزّل المحوِّل ومخرجات التقييم، وسجّل الخروج من Hugging Face (
hf auth logout) إذا استخدمت توكن، واحذف المثيل وأي وحدة تخزين. على Vast.ai يُفوتر التخزين ويُحتفظ به حتى يُحذف المثيل، لا حين يُوقف فقط.
حذف الملفات داخل حاوية لا يضمن مسح قرص المضيف، فالحماية الحقيقية هي الخطوتان 1 و2: اختر من يملك العتاد، وأرسل إليه أقل ما يمكن. مزيد من التفاصيل في كيف تؤمّن مجموعة بياناتك على عقدة GPU عامة. وإذا كانت سياستك تمنع أي عتاد لطرف ثالث، فالسكربت نفسه يعمل على بطاقتك الخاصة ذات 24 GB.
التدريب: سكربت QLoRA باستخدام TRL
على جهاز Linux مستأجر فيه RTX 3090 أو 4090:
python -m venv venv && source venv/bin/activate
pip install torch trl peft bitsandbytes datasets
ثم train.py، وفق نمط QLoRA في وثائق PEFT لدى TRL. النموذج Qwen3-8B مرخّص بـ Apache 2.0 وغير محميّ بموافقة، فلا حاجة إلى توكن Hugging Face:
import torch
from datasets import load_dataset
from peft import LoraConfig
from transformers import BitsAndBytesConfig
from trl import SFTConfig, SFTTrainer
dataset = load_dataset("json", data_files="train.jsonl", split="train")
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
peft_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
target_modules="all-linear",
task_type="CAUSAL_LM",
)
args = SFTConfig(
output_dir="out",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
lr_scheduler_type="cosine",
warmup_steps=20,
max_length=2048,
bf16=True,
logging_steps=10,
save_strategy="epoch",
model_init_kwargs={"dtype": torch.bfloat16},
)
trainer = SFTTrainer(
model="Qwen/Qwen3-8B",
args=args,
train_dataset=dataset,
quantization_config=bnb_config,
peft_config=peft_config,
)
trainer.train()
trainer.save_model("out/adapter")
الخيارات المهمة:
learning_rate=2e-4. توصي وثائق TRL بنحو 10 أضعاف معدل الضبط الدقيق المعتاد مع QLoRA. إذا ارتفعت خسارة التقييم بينما تنخفض خسارة التدريب، فأنت تفرط في التعلّم (overfitting): قلّل عدد الحقب.r=16،target_modules="all-linear". محوّلات على كل طبقة خطية، وهو الإعداد الذي تستخدمه اختبارات Unsloth المعيارية. الرتبة 16 تكفي للصيغة والأسلوب؛ ارفعها للمهام الأصعب.max_length=2048. الأمثلة الأطول تُقتطع. افحص أطوال بياناتك بالتوكنات؛ الحد الأطول يحتاج إلى VRAM أكثر.- دفعة فعلية 16 (4 × 4 خطوات تراكم). إذا نفدت الذاكرة، اخفض
per_device_train_batch_sizeوارفع التراكم ليبقى الناتج نفسه.
قبل أن تطفئ الجهاز، مرّر الأمثلة التي احتفظت بها جانباً عبر النموذج الأساسي والنموذج المضبوط وقارن بينهما. هذا هو الاختبار الوحيد الذي يخبرك هل أنجز المال شيئاً.
كم يكلّف
وقت التدريب = إجمالي التوكنات ÷ الإنتاجية. نشرت GigaGPU، وهي شركة استضافة، قياساً قدره نحو 3,500 توكن تدريب في الثانية لـ Llama 3.1 8B مع QLoRA على RTX 4090. بافتراض معدل مماثل لـ Qwen3-8B:
جولة صغيرة: 2,000 مثال × 600 توكن × 3 حقب = 3.6 مليون توكن. 3,600,000 ÷ 3,500 = 1,029 ثانية، أي نحو 17 دقيقة.
| الخطوة | الوقت |
|---|---|
| إعداد البيئة | 10 دقائق |
| تنزيل Qwen3-8B (16.4 GB من الأوزان) ورفع البيانات | 10 دقائق |
| التدريب | 17 دقيقة |
| مقارنة النموذج الأساسي والمضبوط على البيانات المحتفظ بها | 15 دقيقة |
| الدمج والتصدير والتنزيل وحذف المثيل | 15 دقيقة |
| الإجمالي | 67 دقيقة (1.12 ساعة) |
- RTX 4090 على Vast.ai بسعر $0.31 في الساعة: 1.12 × $0.31 = $0.35
- RTX 4090 على RunPod بسعر $0.74 في الساعة (السعر المعلن في صفحة الأسعار): 1.12 × $0.74 = $0.83
جولة أكبر: 20,000 مثال × 1,000 توكن × 2 حقبة = 40 مليون توكن ÷ 3,500 = 11,429 ثانية، أي نحو 3.2 ساعة. مع 50 دقيقة من الأعباء نفسها، 4.0 ساعات: $1.24 على Vast.ai أو $2.97 على RunPod.
لنموذج 32B، تعرض RunPod بطاقات 48 GB بسعر $0.49 في الساعة (A40) و$0.53 في الساعة (RTX A6000) و$1.09 في الساعة (L40S) حتى سبتمبر 2026. ليس لدي رقم إنتاجية منشور لـ QLoRA على 32B بهذه البطاقات، فشغّل 50 خطوة، واقرأ زمن الخطوة من السجل، وأجرِ الضرب نفسه قبل أن تلتزم بجولة طويلة.
الأسعار أرقام سبتمبر 2026 من صفحة أسعار RunPod ومن أداة تتبّع getdeploying.com لـ Vast.ai. فئات Secure ومراكز البيانات أغلى من أرخص عروض المجتمع. الصورة الأشمل في مقارنة أسعار استئجار GPU.
شغّل النتيجة
لديك خياران: إبقاء المحوِّل منفصلاً، أو دمجه في النموذج.
أبقِه منفصلاً مع vLLM. يحمّل vLLM محوّلات LoRA بجانب النموذج الأساسي ويعرض كل واحد منها كاسم نموذج على خادمه المتوافق مع OpenAI:
vllm serve Qwen/Qwen3-8B --enable-lora --lora-modules invoices=./out/adapter
ثم يرسل العملاء "model": "invoices". ويمكن لعدة محوّلات أن تتشارك نموذجاً أساسياً واحداً على GPU واحد.
ادمجه وشغّله في Ollama. ادمج المحوِّل في أوزان بالدقة الكاملة، وحوّلها إلى GGUF باستخدام llama.cpp، وكمّمها، ثم استوردها:
import torch
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
model = AutoPeftModelForCausalLM.from_pretrained("out/adapter", dtype=torch.bfloat16)
model.merge_and_unload().save_pretrained("merged")
AutoTokenizer.from_pretrained("Qwen/Qwen3-8B").save_pretrained("merged")
python llama.cpp/convert_hf_to_gguf.py merged --outfile invoices-bf16.gguf --outtype bf16
./llama.cpp/build/bin/llama-quantize invoices-bf16.gguf invoices-Q4_K_M.gguf Q4_K_M
echo "FROM ./invoices-Q4_K_M.gguf" > Modelfile
ollama create invoices -f Modelfile
تُجري Unsloth الدمج والتصدير إلى GGUF باستدعاء واحد (model.save_pretrained_gguf("dir", tokenizer, quantization_method="q4_k_m")). وتحذّر وثائقها من أن السبب الأكثر شيوعاً للإجابات السيئة بعد التصدير هو قالب المحادثة الخاطئ: شغّل النموذج بالقالب الذي درّبت به. والمفاضلة بين Ollama وvLLM وTGI موجودة في اختبارنا لأداء الاستدلال على RTX 4090.
أين يقع GPUFlow من هذا
لا يستطيع GPUFlow تنفيذ التدريب: فهو يؤجّر واجهة API متوافقة مع OpenAI على GPU لدى مزوّد، دون سطر أوامر أو SSH أو وصول إلى الملفات. ولا يستطيع أيضاً تشغيل نموذجك المضبوط. لا يستطيع المستأجرون رفع نماذج؛ النماذج المعروضة هي ما ثبّته كل مزوّد (عادةً باستخدام Ollama)، مثل qwen2.5:7b أو llama3.1:8b.
ما يمكن أن يفيد فيه هو الخطوة التي تسبق هذا كله: أن تتحقق، ببضعة سنتات، هل ينجز نموذج مفتوح جاهز مع موجّه جيد المهمة أصلاً، وهي النتيجة الأرخص في شجرة القرار. استخدم لذلك بيانات اختبار، لا البيانات الخاصة التي يدور حولها هذا الدليل: الموجّهات والإجابات تمر عبر جهاز المزوّد نصاً غير مشفّر طوال مدة الاستئجار. طريقة العمل في البدء السريع مع API، ومقال استخدام المفتاح في التطبيقات يشرح ربطه بالأدوات الموجودة.
المصادر
راجعناها كلها في سبتمبر 2026.
- الأوراق: Hu وآخرون، LoRA؛ Dettmers وآخرون، QLoRA؛ Ovadia وآخرون، Fine-Tuning or Retrieval?؛ Carlini وآخرون، Extracting Training Data from Large Language Models
- Hugging Face TRL: SFT Trainer، تكامل PEFT وQLoRA
- Unsloth: المتطلبات وجدول VRAM، الاختبارات المعيارية، الحفظ بصيغة GGUF، GitHub
- Axolotl على GitHub
- النموذج: بطاقة نموذج Qwen3-8B
- إنتاجية التدريب: GigaGPU، الضبط الدقيق على RTX 4090
- المضيفون والأمان: الأسئلة الشائعة عن الأمان في Vast.ai، أسعار Vast.ai، نظرة عامة على الـ Pods في RunPod
- الأسعار: أسعار RunPod، وgetdeploying.com لـ Vast.ai وRTX 4090
- التشغيل: محوّلات LoRA في vLLM، أداة quantize في llama.cpp، الاستيراد في Ollama
- GPUFlow: البدء السريع مع API