מודלים גדולים של שפה (LLMs) פתחו אינספור הזדמנויות חדשות ליישומי AI. אם אי פעם רצית לשפר את המודל שלך, המדריך הזה יראה לך איך לעשות זאת בקלות וללא צורך לכתוב קוד. באמצעות כלים כמו אקסולוטל ודיפו, נעבור על התהליך שלב אחר שלב.
מהו LLM?
מודל שפה גדול (LLM) הוא מודל AI חזק שאומן על כמויות עצומות של נתוני טקסט—עשרות טריליוני תווים—כדי לחזות את קבוצת המילים הבאה בסדרה. זה הפך לאפשרי רק בשנים האחרונות הודות להתקדמות שנעשתה במחשוב GPU, שהאפשרה לאמן מודלים כל כך גדולים בתוך מספר שבועות.
סביר להניח שכבר אינטראקטת עם LLMs דרך מוצרים כמו צ'אטGPT או קלוד וחווית בעצמך את היכולת שלהם להבין וליצור תגובות דמויות אדם.
למה לשפר LLM?
האם לא אפשר להשתמש ב-GPT-4o לכל דבר? ובכן, בזמן שהוא המודל החזק ביותר שיש לנו בזמן כתיבת מאמר זה, הוא לא תמיד הבחירה המעשית ביותר. שיפור מודל קטן יותר, שנע בין 3 ל-14 מיליארד פרמטרים, יכול להניב תוצאות דומות במחיר נמוך בהרבה. יתרה מכך, שיפור מאפשר לך להחזיק ברכושך האינטלקטואלי ומפחית את התלות שלך בגורמים שלישיים.
הבנת מודלים בסיסיים, מודלי הוראות ומודלי שיחה
לפני שנצלול לשיפור, חשוב להבין את סוגי ה-LLMs השונים הקיימים:
- מודלים בסיסיים: אלה מודלים שכבר הוכשרו על ידי כמויות גדולות של טקסט בלתי מאורגן, כגון ספרים או נתוני אינטרנט. אף שיש להם הבנה פנימית של השפה, הם אינם מותאמים להפקת פלט ברור ועלולים להפיק פלטים בלתי ערכיים. מודלים בסיסיים מפותחים כדי לשמש נקודת התחלה לפיתוח מודלים יותר מתמחים.
- מודלים הוראה: בנויים על בסיס מודלים בסיסיים, מודלים הוראה מותאמים באמצעות נתונים מובנים כמו זוגות הגיונ-תגובה. הם מיועדים למעקב אחר הוראות ספציפיות או לענות על שאלות.
- מודלים צ'אט: גם הם מבוססים על מודלים בסיסיים, אך בניגוד למודלים הוראה, מודלים צ'אט מאומנים על נתוני שיחה, מאפשרים להם להיות מעורבים בדו-קרב.
מהו למידת חיזוק (RL) ו-DPO?
למידת חיזוק (RL) היא טכניקה שבה המודלים לומדים על ידי קבלת משוב על פעולותיהם. זה נחוש במודלים הוראה או צ'אט כדי לשפר עוד יותר את איכות הפלט שלהם. כללית, למידת חיזוק אינה מבוצעת על בסיס מודלים מאחר והיא משתמשת בקצב למידה הרבה נמוך יותר שלא יזיז את המחוג מספיק.
DPO היא צורת של RL שבה המודל מאומן באמצעות זוגות של תשובות טובות ורעות לאותו פרומט/שיחה. על ידי הצגת זוגות אלו, המודל לומד להעדיף את הדוגמאות הטובות ולהימנע מן הגרועות.
מתי להשתמש ב-DPO
DPO שימושי במיוחד כאשר ברצונך להתאים את הסגנון או ההתנהגות של המודל שלך, לדוגמה:
- התאמות סגנון: לשנות את אורך התגובות, רמת הפרטים, או מידת הביטחון שמובעת על ידי המודל.
- אמצעי בטיחות: לאמן את המודל לסרב לענות על פניות שעלולות להיות מסוכנות או לא הולמות.
עם זאת, DPO אינו מתאים ללמד את המודל ידע או עובדות חדשות. למטרה זו, טכניקות של הכוונה מפוקחת (SFT) או יצירת תוכן מוגברת על ידי חיפוש (RAG) מתאימות יותר.
יצירת מאגר נתוני DPO
במקום ייצור, בדרך כלל תיצור מאגר נתוני DPO באמצעות משוב מהמשתמשים שלך, למשל:
- משוב מהמשתמש: יישום מנגנון של תשובה חיובית/שלילית על תגובות.
- בחירות השוואתיות: הצגת שני פלטים שונים למשתמשים ובקשה מהם לבחור את הטוב יותר.
אם אין לך נתוני משתמש, תוכל גם ליצור מאגר נתונים סינתטי על ידי שימוש במודלים גדולים ומוכשרים יותר. למשל, תוכל ליצור תשובות רעות באמצעות מודל קטן יותר ואז להשתמש ב-GPT-4o כדי לתקן אותן.
לצורך פשטות, נשתמש במאגר נתונים מוכן מ-HuggingFace: olivermolenschot/alpaca_messages_dpo_test. אם תסתכל על מאגר הנתונים, תבחין שהוא מכיל פניות עם תשובות שנבחרו ודחות—אלו הם הדוגמאות הטובות והרעות. נתונים אלו נוצרו סינתטית באמצעות GPT-3.5-turbo ו-GPT-4.
באופן כללי, תזדקק בין 500 ל-1,000 זוגות נתונים לפחות כדי שיהיה אימון אפקטיבי מבלי להיתר על המידה. מאגרי הנתונים הגדולים ביותר של DPO מכילים עד 15,000–20,000 זוגות.
כוונון עדין של Qwen2.5 3B Instruct עם Axolotl
אנחנו נשתמש ב-Axolotl כדי לחדד את מודל Qwen2.5 3B Instruct, אשר מדורג כיום בראש ה-OpenLLM Leaderboard בקטגוריית גודל שלו. עם Axolotl, אתה יכול לחדד מודל מבלי לכתוב שורת קוד אחת—רק קובץ קונפיגורציה YAML. להלן הקונפיגורציה config.yml שנשתמש בה:
base_model: Qwen/Qwen2.5-3B-Instruct
strict: false
# Axolotl will automatically map the dataset from HuggingFace to the prompt template of Qwen 2.5
chat_template: qwen_25
rl: dpo
datasets:
- path: olivermolenschot/alpaca_messages_dpo_test
type: chat_template.default
field_messages: conversation
field_chosen: chosen
field_rejected: rejected
message_field_role: role
message_field_content: content
# We pick a directory inside /workspace since that's typically where cloud hosts mount the volume
output_dir: /workspace/dpo-output
# Qwen 2.5 supports up to 32,768 tokens with a max generation of 8,192 tokens
sequence_len: 8192
# Sample packing does not currently work with DPO. Pad to sequence length is added to avoid a Torch bug
sample_packing: false
pad_to_sequence_len: true
# Add your WanDB account if you want to get nice reporting on your training performance
wandb_project:
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:
# Can make training more efficient by batching multiple rows together
gradient_accumulation_steps: 1
micro_batch_size: 1
# Do one pass on the dataset. Can set to a higher number like 2 or 3 to do multiple
num_epochs: 1
# Optimizers don't make much of a difference when training LLMs. Adam is the standard
optimizer: adamw_torch
# DPO requires a smaller learning rate than regular SFT
lr_scheduler: constant
learning_rate: 0.00005
# Train in bf16 precision since the base model is also bf16
bf16: auto
# Reduces memory requirements
gradient_checkpointing: true
# Makes training faster (only suported on Ampere, Ada, or Hopper GPUs)
flash_attention: true
# Can save multiple times per epoch to get multiple checkpoint candidates to compare
saves_per_epoch: 1
logging_steps: 1
warmup_steps: 0
הגדרת סביבת הענן
כדי להריץ את האימון, נשתמש בשירות אירוח בענן כמו Runpod או Vultr. הנה מה שתצטרך:
- תמונת Docker: שכפל את תמונת Docker winglian/axolotl-cloud:main שסיפקה צוות Axolotl.
- *דרישות חומרה: כרטיס GPU עם 80GB VRAM (כמו צומת 1×A100 PCIe) יהיה יותר ממספיק עבור גודל מודל זה.
- אחסון: 200GB של אחסון נפח שיתאימו לכל הקבצים שאנחנו צריכים.
- גרסת CUDA: גרסת CUDA שלך должна быть לפחות 12.1.
*סוג זה של אימון נחשב לחדוד מלא של ה-LLM, ולכן הוא מאוד אינטנסיבי מבחינת VRAM. אם תרצה להריץ אימון מקומית, מבלי להסתמך על מארחי ענן, תוכל לנסות להשתמש ב-QLoRA, שהיא צורת חדוד מפוקח. למרות שזה תיאורטית אפשרי לשלב DPO & QLoRA, זה נדיר מאוד.
צעדים להתחלת האימון
- הגדר תיקיית מטמון של HuggingFace:
export HF_HOME=/workspace/hf
זה מבטיח שהמודל המקורי יירד לתוך אחסון הנפח שלנו שהוא מתמשך.
- צור קובץ קונפיגורציה: שמור את קובץ config.yml שיצרנו קודם לכן ל-/workspace/config.yml.
- התחל אימון:
python -m axolotl.cli.train /workspace/config.yml
והנה! האימונים שלך אמורים להתחיל. לאחר ש-Axolotl מוריד את המודל ואת נתוני האימון, אתה אמור לראות פלט דומה לזה:
[2024-12-02 11:22:34,798] [DEBUG] [axolotl.train.train:98] [PID:3813] [RANK:0] loading model
[2024-12-02 11:23:17,925] [INFO] [axolotl.train.train:178] [PID:3813] [RANK:0] Starting trainer...
האימון אמור לקחת רק כמה דקות להשלים מאחר שזהו סט נתונים קטן בלבד של 264 שורות. המודל הממוקד יישמר ב- /workspace/dpo-output .
העלאת המודל ל-HuggingFace
ניתן להעלות את המודל שלך ל-HuggingFace באמצעות CLI:
- התקנת CLI של HuggingFace Hub:
pip install huggingface_hub[cli]
- העלאת המודל:
huggingface-cli upload /workspace/dpo-output yourname/yourrepo
החלפה של yourname/yourrepo בשם המשתמש האמיתי שלך ב-HuggingFace ושם המאגר.
הערכת המודל שלך שהותאם מראש
לצורך הערכה, מומלץ לארח את המודלים המקורי והממוקד באמצעות כלי כמו Text Generation Inference (TGI) . לאחר מכן, לבצע הצפנה על שני המודלים עם הגדרת טמפרטורה של 0 (כדי להבטיח פלטים דטרמיניסטיים) ולהשוות באופן ידני את התגובות של שני המודלים.
גישה זו מעניקה ראיונות טובים יותר מאשר לסמוך בלבד על מדדי אובדן באימון, שעשויים שלא ללכוד את הפרטיות של הדור שפה בLLMs.
סיכום
שיפור מודל LLM באמצעות DPO מאפשר לך להתאים מודלים כך שיתאימו טוב יותר לצרכי היישום שלך, תוך שמירה על עלויות סבירות. על ידי ביצוע הצעדים המפורטים במאמר זה, תוכל לנצל את הכוח של כלים ומערכי נתונים בקוד פתוח כדי ליצור מודל שמתאים לדרישות הספציפיות שלך. בין אם אתה מחפש להתאים את הסגנון של התגובות או ליישם אמצעי בטיחות, DPO מספק גישה מעשית לשיפור ה-LLM שלך.
בהצלחה בשיפור!
Source:
https://www.sitepoint.com/fine-tuning-llm-with-direct-preference-optimization-dpo/