ابنِ خط أنابيب للتحقق من بيانات LLM

Share:
شرح عملي متوسط

ابنِ خط أنابيب للتحقق من بيانات Fine-Tuning لنماذج LLM

استخدم سير عمل من ثلاث مراحل بأسلوب fail-fast لفحص بيانات Fine-Tuning، وإجراء تجربة تحقق قصيرة، واكتشاف الحالات الشاذة أثناء التشغيل، والاحتفاظ بمجموعة تحقق منفصلة لقياس سلوك النموذج.

لماذا يجب أن يأتي التحقق من Fine-Tuning أولًا؟

إن إجراء Fine-Tuning لنموذج LLM هو خط أنابيب متكامل، وليس أمر تدريب واحدًا. وقبل بدء العمليات الحسابية الفعلية، يجب على الفريق التأكد من أن الإعدادات صالحة نحويًا، وأن البيانات تتبع البنية المتوقعة، وأن تشغيلًا قصيرًا يمكن أن يكتمل من دون إخفاقات واضحة. يصف بحث FT-Dojo الموثق هذا النهج باسم التحقق التدريجي: تبدأ العملية بفحوصات منخفضة التكلفة، ثم تنتقل إلى فحوصات تزداد تكلفتها تدريجيًا. أما الإعدادات التي تفشل في أي مرحلة، فيتم رفضها فورًا بدلًا من استهلاك الموارد في تشغيل كامل.

يطبّق هذا الشرح العملي نسخة صغيرة ومحايدة تجاه مزود الخدمة من هذه الفكرة. فهو يتحقق من مجموعة بيانات بصيغة JSON Lines، ويفحص Schema لكل مثال، ويتأكد من المسارات وقيم الإعدادات، وينفّذ تشغيلًا مصغرًا على عينة، ويرصد الحالات الشاذة أثناء التشغيل، مثل فراغ مجموعة البيانات أو قيم الخسارة غير المنتهية. ولا يرسل البيانات إلى API تجاري للتدريب. هذا الحد مقصود؛ إذ إن تنسيقات التدريب الخاصة بالمزودين وأهلية النماذج تقع خارج السياق الموثق.

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

في Fine-Tuning الفعّال من حيث عدد المعاملات، تُبقي LoRA معظم الأوزان المدربة مسبقًا ثابتة، وتضيف بدلًا منها تفكيكًا منخفض الرتبة يتم تدريبه. وتسلط دراسة المعاملات الفائقة الموثقة الضوء على رتبة LoRA، وalpha الخاصة بالتحجيم، وdropout، ومعدل التعلم بوصفها متغيرات مهمة. والاستجابة الهندسية الصحيحة ليست نسخ قيمة واحدة عشوائيًا، بل التحقق من كل إعداد مرشح ومقارنته باستخدام مجموعة التحقق نفسها.

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

  • Python ٣.١٠ أو إصدار أحدث.
  • مجموعة بيانات JSONL تحتوي على أمثلة حوارية.
  • مجموعة تحقق منفصلة بصيغة JSONL لا تتداخل مع أمثلة التدريب.
  • معرفة أساسية بـ JSON، وتشغيل الأوامر عبر سطر الأوامر، والبيئات الافتراضية في Python.

تستخدم أداة التحقق أدناه مكتبة Python القياسية فقط. وهذا يجعل مرحلة fail-fast سهلة التشغيل قبل تثبيت حزمة التدريب. ويمكن لتطبيق التدريب اللاحق استخدام Hugging Face Transformers API، وهي API المستخدمة للتعامل مع النماذج والتدريب والتحقق في دراسة المعاملات الفائقة الموثقة.

الخطوة ١: إنشاء المشروع وتحديد عقد البيانات

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

mkdir llm-finetuning-validation
cd llm-finetuning-validation
python -m venv .venv

# Linux or macOS
source .venv/bin/activate

# Windows PowerShell
# .venvScriptsActivate.ps1

mkdir -p data/reports src
touch src/__init__.py

أنشئ الملف data/train.jsonl باستخدام أمثلة مثل الآتية:

{"messages":[{"role":"system","content":"Answer clearly."},{"role":"user","content":"What is a validation set?"},{"role":"assistant","content":"A validation set is held-out data used to measure a model during or after training."}]}
{"messages":[{"role":"system","content":"Answer clearly."},{"role":"user","content":"Why check the schema first?"},{"role":"assistant","content":"Schema checks catch malformed examples before an expensive training run begins."}]}

أنشئ الملف data/validation.jsonl بشكل منفصل. لا تنسخ السجلات نفسها إلى الملفين. يقيّم البحث الموثق نموذجًا خضع لـ Fine-Tuning باستخدام مجموعة تحقق، ولذلك يجب أن تظل هذه المجموعة متاحة لهذا الغرض بدلًا من دمجها في التدريب.

الخطوة ٢: تنفيذ التحقق الثابت والتحقق من Schema

يمثل التحقق الثابت المرحلة الأولى والأقل تكلفة. فهو يتأكد من وجود مسار الإدخال، وأن كل سطر غير فارغ يحتوي على JSON صالح، وأن السجل عبارة عن كائن، وأن البنية الحوارية تستوفي عقد البيانات. كما يفحص قيم الإعدادات الخاصة برتبة LoRA، وalpha الخاصة بالتحجيم، وdropout، ومعدل التعلم، وحجم الدفعة، وطول التشغيل المصغر. وتتوافق هذه الحقول مع المعاملات الفائقة التي نوقشت في السياق الموثق؛ لكن البرنامج يتحقق من بنيتها ولا يدّعي أن أي قيمة محددة هي الأفضل.

أنشئ الملف src/validate_pipeline.py:

from __future__ import annotationsimport argparse
import json
import math
from pathlib import Path
from typing import AnyROLES = {"system", "user", "assistant"}def issue(stage: str, message: str, line: int | None = None) -> dict[str, Any]:
result = {"stage": stage, "message": message}
if line is not None:
result["line"] = line
return resultdef validate_record(record: Any, line: int) -> list[dict[str, Any]]:
errors: list[dict[str, Any]] = []
if not isinstance(record, dict):
return [issue("schema", "record must be a JSON object", line)]
messages = record.get("messages")
if not isinstance(messages, list) or len(messages) < 2:
return [issue("schema", "messages must contain at least two items", line)]roles: list[str] = []
for index, message in enumerate(messages):
if not isinstance(message, dict):
errors.append(issue("schema", f"message {index} must be an object", line))
continue
role = message.get("role")
content = message.get("content")
if role not in ROLES:
errors.append(issue("schema", f"unsupported role at message {index}", line))
else:
roles.append(role)
...

تابع القراءة

سجل دخولك مجاناً لقراءة المقال كاملاً والوصول إلى أدوات الذكاء الاصطناعي.

تسجيل الدخول / إنشاء حساب

هل كان هذا الشرح مفيداً؟

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