לאמן LLM לבד ב-Python: המדריך האמיתי, כולל השלב שכולם מדלגים עליו
מטוקנייזר שאתם בונים ביד עם minbpe, דרך למה tiktoken כתוב ב-Rust, ועד nanochat שמאמן צ'אט שלם ב-4 שעות ובכ-100 דולר. הכל עם קוד ומספרים אמיתיים.
מאת Yuval Avidaniקריאה בת 5 דק׳
שיתוף
אמ;לק
5 הדברים שצריך לדעת
לולאת אימון של ~300 שורות (train.py) ומודל GPT של ~300 שורות (model.py). הנתיב למתחילים מאמן GPT ברמת התו על ~1MB שייקספיר.
טוקניזציה היא לא חלק מהמודל אלא צינור בפני עצמו עם אימון משלו. האלגוריתם BPE מאחד שוב ושוב את זוג הטוקנים הכי שכיח עד גודל אוצר רצוי.
minbpe של קרפתי (MIT, 3 טוקנייזרים) נבנה חי בהרצאה של 2h13m. tiktoken של OpenAI כתוב ב-Rust ומהיר פי 3-6.
ל-GPT-4 יש אוצר cl100k_base (~100,256), ל-GPT-4o יש o200k_base (~200 אלף). אוצר גדול יותר משפר יעילות על טקסט רב-לשוני.
מאוקטובר 2025: ~8,000 שורות PyTorch שמאמנות צ'אט שלם בסגנון ChatGPT, מהטוקנייזר ועד web UI, ב-~4 שעות ובכ-100 דולר על 8xH100.
מסתבר שהמשפט "אימנתי LLM לבד ב-Python" הפסיק להיות פנטזיה של חוקרים עם חוות שרתים, והפך למשהו שאתם באמת יכולים לגעת בו. הטרנד הזה אמיתי ונגיש, אבל יש שלב אחד שכולם מדלגים עליו, והוא בדיוק השלב שגורם לרוב האנשים להתבלבל: הטוקנייזר.
בואו נפרק את זה מההתחלה, בלי לזרוק עליכם קוד לפני שהבנו למה.
מה זה בכלל "לאמן מודל" בבית
כשאנחנו אומרים לאמן LLM, הכוונה למודל שפה: תוכנה שמנבאת את המילה (או ליתר דיוק את הטוקן) הבא. אנדריי קרפתי, אחד המורים הכי טובים בתחום, בנה ריפו בשם nanoGPT שהוא הגדיר כ"המאגר הכי פשוט והכי מהיר לאימון ולפיין-טיונינג של GPT בגודל בינוני". הקסם שם הוא בפשטות: קובץ האימון train.py הוא לולאת אימון של בערך 300 שורות, וקובץ המודל model.py הוא הגדרת GPT של בערך 300 שורות. זהו. כל מה שנשמע כמו קסם שחור מתרכז בשש מאות שורות שאתם יכולים לקרוא בישיבה אחת.
כל ה"קסם" של אימון GPT מתרכז בבערך שש מאות שורות קוד ב-nanoGPT: 300 ללולאת האימון, 300 למודל עצמו.
הנתיב למתחילים ב-nanoGPT מאמן GPT ברמת התו (כלומר כל אות היא יחידה) על בערך מגה-בייט אחד של טקסט משייקספיר. ההגדרות שם קטנטנות: חלון הקשר של 256 תווים, 384 ערוצי מאפיינים, שש שכבות טרנספורמר, ושש ראשי-קשב בכל שכבה. זה מספיק קטן כדי לרוץ אצלכם, וזה מספיק אמיתי כדי להבין מה קורה.
ואם רוצים לשחק במגרש של הגדולים: nanoGPT משחזר את GPT-2 בגרסת 124 מיליון פרמטרים, על ידי אימון על מאגר בשם OpenWebText, תוך שימוש בטוקנים של GPT-2. זה רץ על צומת של שמונה כרטיסי A100 בזיכרון 40GB, בערך ארבעה ימים, ומגיע ל-validation loss (מדד שגיאה על נתונים שהמודל לא ראה) של בערך 2.85. שימו לב לפער: מגה-בייט שייקספיר על המחשב שלכם מול ארבעה ימים על שמונה כרטיסי על. אותה פילוסופיה, סקייל אחר לגמרי.
השלב שכולם מדלגים עליו: הטוקנייזר
וכאן מגיע הפלוט טוויסט. לפני שהמודל בכלל רואה טקסט, מישהו צריך להפוך את המילים למספרים. החלק הזה נקרא טוקניזציה, והטעות הכי נפוצה היא לחשוב שזה חלק מהמודל. זה לא. קרפתי מקדיש לזה הרצאה שלמה, "Let's build the GPT Tokenizer", באורך שעתיים ושלוש עשרה דקות, ובה הוא ממסגר את הטוקנייזר בתור שלב נפרד לגמרי בצינור, עם סט אימון משלו ועם אלגוריתם אימון משלו.
הטוקנייזר הוא שלב נפרד לגמרי מהמודל: יש לו סט אימון משלו, אלגוריתם משלו, ואם הוא גרוע, שום מודל לא יציל אתכם.
הדימוי שאני אוהב: הטוקנייזר הוא כמו המילון והדקדוק שהמורה בונה לפני שהתלמיד מתחיל לקרוא. שני פונקציות מרכזיות: encode שממיר מחרוזת טקסט לרשימת טוקנים, ו-decode שממיר טוקנים בחזרה לטקסט. אם המילון בנוי רע, לא משנה כמה חכם התלמיד.
האלגוריתם שמאמן את המילון הזה נקרא BPE, ראשי תיבות של Byte Pair Encoding. בואו נפרק: מתחילים מהתווים או הבייטים הבסיסיים של הטקסט בתור הטוקנים הראשוניים. אחר כך, שוב ושוב, מזהים את זוג הטוקנים הצמודים הכי שכיח ומאחדים אותו לטוקן חדש אחד. עוצרים כשאוצר המילים הגיע לגודל הרצוי. זה עובד על מחרוזות מקודדות ב-UTF-8, והרעיון מגיע ממאמר של סנריך ושותפים מ-2015, שהתפרסם בגדול בזכות המאמר של GPT-2.
צעד אחר צעד
איך אלגוריתם BPE מאמן טוקנייזר
1
1 / 5
בונים אחד ביד עם minbpe
הדבר הכי יפה: קרפתי בנה את הקוד הזה בשידור חי במהלך ההרצאה, וזה יושב בריפו נפרד בשם minbpe. ההגדרה שלו: "קוד מינימלי ונקי לאלגוריתם ה-BPE ברמת הבייט, שמשמש בדרך כלל לטוקניזציה ב-LLM". הריפו הוא ברישיון MIT, כלומר אתם חופשיים להשתמש בו.
בתוך minbpe יש שלושה טוקנייזרים, וכל אחד מלמד אתכם רעיון:
הראשון, BasicTokenizer, מריץ BPE ישר על הטקסט. פשוט, לימודי. השני, RegexTokenizer, מפצל קודם את הטקסט לפי אותיות, מספרים וסימני פיסוק (בדיוק כמו GPT-2), כדי למנוע מיזוגים שחוצים גבולות. השלישי, GPT4Tokenizer, משחזר את הטוקניזציה של GPT-4. שלושתם תומכים ב-train, encode, decode ושמירה וטעינה.
אימון טוקנייזר BPE עם minbpe
from minbpe import BasicTokenizer
tokenizer = BasicTokenizer()
text = open("taylorswift.txt", "r").read()
tokenizer.train(text, vocab_size=512)
ids = tokenizer.encode("hello world")
print(ids)
print(tokenizer.decode(ids))
tokenizer.save("toy")
למה tiktoken כתוב ב-Rust ולמה ל-GPT-4o יש 200 אלף טוקנים
עכשיו למגרש של הפרודקשן. כשמריצים טוקנייזר על מיליארדי מילים, מהירות זה לא מותרות. לכן OpenAI כתבה את tiktoken, טוקנייזר BPE מהיר, בליבת Rust עם שכבת Python דקה מעל. לפי הריפו הרשמי הוא מדווח כמהיר פי שלושה עד שש מטוקנייזר קוד-פתוח דומה. הדימוי: אותו רעיון בדיוק כמו minbpe, אבל עם מנוע מירוץ במקום מנוע לימוד.
tiktoken של OpenAI כתוב בליבת Rust ומדווח כמהיר פי 3 עד 6 מטוקנייזר קוד-פתוח דומה, כי במהירות של פרודקשן זה קריטי.
וכאן מספר שמסביר הרבה: לטוקנייזר של tiktoken יש כמה "קידודים". הקידוד cl100k_base, עם אוצר של בערך 100,256 טוקנים, משמש את GPT-4 ואת GPT-3.5-Turbo. הקידוד החדש יותר, o200k_base, עם אוצר של בערך 200 אלף טוקנים, משמש את GPT-4o. למה הכפילו את האוצר? כי אוצר גדול יותר משפר את היעילות על טקסט רב-לשוני. בעיניי זה נגיעה ישירה אלינו: ככל שהאוצר גדול ומגוון יותר, ככה עברית נדחסת לפחות טוקנים, וזה חוסך כסף ומאיץ תשובות.
ואם אתם רוצים לאמן טוקנייזר בעצמכם בלי לכתוב את BPE מאפס, ספריית tokenizers של HuggingFace עושה את זה: מזווגים Tokenizer(BPE()) עם BpeTrainer, מגדירים טוקנים מיוחדים כמו UNK ו-PAD, קובעים מפצל מקדים כמו Whitespace, מריצים train על קבצי טקסט, ושומרים לקובץ JSON. התיעוד שלהם אפילו כולל מתכונים לשחזר את הטוקנייזרים של GPT-2, BERT ו-T5.
הכותרת שהתחלפה ב-2025: nanochat
וכאן החלק שחשוב שתדעו, כי הרבה מדריכים ברשת עדיין לא עודכנו. נכון לנובמבר 2025, ה-README של nanoGPT נושא הודעה בולטת שהריפו "עכשיו מאוד ישן ומיושן", ומפנה את הגולשים ליורש שלו, nanochat.
מה זה nanochat? קרפתי שחרר אותו ב-13 באוקטובר 2025. זה קוד-פתוח ב-PyTorch, בערך 8,000 שורות, שמממש צינור מלא בסגנון ChatGPT: מאימון הטוקנייזר ועד ממשק web שלם. והנה המספרים שמשגעים אותי: אפשר לאמן אותו בבערך ארבע שעות, בעלות של בערך 100 דולר, על צומת של שמונה כרטיסי H100 (שעולה בערך 24 דולר לשעה).
nanochat, היורש של nanoGPT מאוקטובר 2025, מאמן צ'אט שלם בסגנון ChatGPT, מהטוקנייזר ועד ה-web UI, בכ-4 שעות ובכ-100 דולר.
שורה תחתונה
בעיניי הסיפור האמיתי כאן הוא לא "כל אחד יכול לאמן ChatGPT בבית". הוא כן דורש צומת של שמונה כרטיסי H100 ובערך 100 דולר, וזה עדיין ChatGPT קטנטן, לא GPT-4o. הסיפור האמיתי הוא שהצינור נפתח לרווחה: בפעם הראשונה אתם יכולים לקרוא את כל השלבים, מהטוקנייזר ועד הצ'אט, בקוד קריא, נקי, וברישיון פתוח.
והמגבלה שכדאי לזכור: הבנה של הקוד לא שווה למודל שימושי. שייקספיר ברמת התו על המחשב שלכם יפליט משהו שנשמע כמו שייקספיר, לא עוזר אישי. וכל המספרים כאן, ארבעה ימים, 2.85, 100 דולר, מגיעים מהריפואים והמקורות הרשמיים של קרפתי ו-OpenAI, לא ממני.
אז אם הייתם צריכים לבחור: הייתם מתחילים מלבנות טוקנייזר ביד עם minbpe כדי להבין מה קורה מתחת למכסה, או קופצים ישר ל-nanochat ומאמנים צ'אט שלם באותו אחר צהריים?