```html מחברים: מאיינק מישרה⋆, IBM מאט סטאלון⋆, IBM גאויואן ג'אנג⋆, IBM יקאנג שן, IBM אדיטיה פראסאד, IBM אדריאנה מזה סוריה, IBM מישל מרלר, IBM פרמסוואראן סלוואם, IBM ספטא סורנדראן, IBM שיבדפ סינג, IBM מניש סטי, IBM קסואן-הונג דאנג, IBM פנג-יואן לי, IBM קון-לונג וו, IBM סיד זאוואד, IBM אנדרו קולמן, IBM מתיו ווייט, IBM מארק לואיס, IBM רג'ו פאבולורי, IBM יאן קויפמן, IBM בוריס לוובלינסקי, IBM מקסמיליאן דה באיזר, IBM איברהים עבד אל-עזיז, IBM קינג'אל באסו, IBM מאיינק אגרוואל, IBM יי ג'ואו, IBM כריס ג'ונסון, IBM אנצ'ל גויאל, IBM חימה פאטל, IBM יוסף שה, IBM פטרוס זרפוס, IBM הייקו לודוויג, IBM אס-ים מנוואר, IBM מק'סוול קראוס, IBM פאבאן קפניפאטי, IBM שווטה סאלריה, IBM בוב קאליו, IBM סופיה וון, IBM סיטארמי סיאלם, IBM בריאן בלגודרה, IBM קרלוס פונסקה, IBM אמית סינגי, IBM נירמיט דסאי, IBM דייוויד ד. קוקס, IBM רוצ'יר פורי†, IBM ראמסוואר פאנדה†, IBM תקציר מודלי שפה גדולים (LLMs) שאומנו על קוד משנים באופן דרמטי את תהליך פיתוח התוכנה. יותר ויותר, מודלי שפה גדולים לקוד משולבים בסביבות פיתוח תוכנה כדי לשפר את הפרודוקטיביות של מתכנתים אנושיים, וסוכנים מבוססי מודלי שפה גדולים מתחילים להראות הבטחה בטיפול במשימות מורכבות באופן אוטונומי. מימוש הפוטנציאל המלא של מודלי שפה גדולים לקוד דורש מגוון רחב של יכולות, כולל יצירת קוד, תיקון באגים, הסבר ותיעוד קוד, תחזוקת מאגרים, ועוד. בעבודה זו, אנו מציגים את סדרת Granite של מודלי קוד מסוג decoder-only למשימות יצירת קוד, שאומנו על קוד הכתוב ב-116 שפות תכנות. משפחת מודלי Granite Code כוללת מודלים בגדלים שנעים בין 3 ל-34 מיליארד פרמטרים, המתאימים ליישומים החל ממשימות מודרניזציה מורכבות של יישומים ועד לתרחישי שימוש מוגבלים בזיכרון על המכשיר. הערכה על מערך מקיף של משימות מדגימה כי מודלי Granite Code מגיעים באופן עקבי לביצועים מתקדמים (state-of-the-art) בקרב מודלי שפה גדולים לקוד קוד פתוח זמינים. משפחת מודלי Granite Code עברה אופטימיזציה עבור זרימות עבודה של פיתוח תוכנה ארגוני ומבצעת היטב במגוון משימות קידוד (למשל, יצירת קוד, תיקון והסבר), מה שהופך אותה למודל קוד "כל-סיבובי" ורב-תכליתי. אנו משחררים את כל מודלי Granite Code שלנו תחת רישיון Apache 2.0 לשימוש מחקרי ומסחרי כאחד. https://github.com/ibm-granite/granite-code-models 1 מבוא במהלך העשורים האחרונים, תוכנה הפכה לחלק בלתי נפרד מכל היבט בחברה שלנו. ככל שהביקוש לפיתוח תוכנה גובר, קריטי מתמיד להגביר את הפרודוקטיביות של פיתוח תוכנה, ומודלי שפה גדולים מספקים נתיב מבטיח להרחבת היכולות של מתכנתים אנושיים. מקרי שימוש ארגוניים בולטים למודלי שפה גדולים בפרודוקטיביות פיתוח תוכנה כוללים יצירת קוד, הסבר קוד, תיקון קוד, יצירת בדיקות יחידה ותיעוד, מודרניזציה של יישומים, זיהוי פגיעויות, תרגום קוד, ועוד. בשנים האחרונות חלה התקדמות מהירה ביכולתם של מודלי שפה גדולים ליצור ולטפל בקוד, ומגוון מודלים בעלי יכולות קידוד מרשימות זמינים כיום. המודלים נעים בגדלים של בין מיליארדי פרמטרים בודדים (למשל, Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024), וכו') למאות מיליארדים: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere), והם משתנים בשימושיות הכללית המיועדת להם, כאשר חלק מהמודלים שואפים לכסות מגוון שימושים מחוץ לקוד, בעוד שאחרים מתמקדים בעיקר במשימות הקשורות לקידוד (למשל, StarCoder (Li et al., 2023a; Lozhkov et al., 2024), CodeGen (Nijkamp et al., 2023), CodeLlama (Rozie`re et al., 2023), ו-CodeGemma (CodeGemma Team et al., 2024)). עם זאת, עדיין קיימים פערים חשובים בתחום הנוכחי של מודלי שפה גדולים לקוד, במיוחד בהקשר של פיתוח תוכנה ארגוני. ראשית, בעוד שמודלי שפה גדולים, כלליים וגדולים מאוד יכולים להשיג ביצועי קידוד מצוינים, גודלם הופך אותם ליקרים לפריסה. מודלי קוד קטנים יותר ( , ; , ; , ; , ; , ) יכולים להשיג ביצועי יצירת קוד מצוינים בחבילה קטנה וגמישה יותר, אך הביצועים במשימות קידוד מעבר ליצירה (למשל, תיקון והסבר) עשויים להיות נמוכים מביצועי יצירת הקוד. Li et al. 2023a Lozhkov et al. 2024 Nijkamp et al. 2023 Rozie`re et al. 2023 CodeGemma Team et al. 2024 בהקשרים ארגוניים רבים, אימוץ מודלי שפה גדולים לקוד יכול להיות מסובך עוד יותר על ידי גורמים מעבר לביצועי המודלים. לדוגמה, אפילו מודלים פתוחים סובלים לעיתים ממחסור בשקיפות לגבי מקורות הנתונים ושיטות עיבוד הנתונים שהובילו ליצירת המודל, מה שיכול לפגוע באמון במודלים בהקשרים קריטיים ובמצבים מפוקחים. יתרה מכך, תנאי רישוי במודלי שפה גדולים פתוחים כיום יכולים להכביד ולסבך את יכולתה של ארגון להשתמש במודל. כאן, אנו מציגים את מודלי Granite Code, סדרה של מודלי שפה גדולים לקוד בעלי יכולת גבוהה, שתוכננו לתמוך בפיתוח תוכנה ארגוני במגוון רחב של משימות קידוד. למשפחת מודלי Granite Code יש שני וריאנטים עיקריים שאנו משחררים בארבעה גדלים שונים (3B, 8B, 20B, ו-34B): מודלי בסיס יסודיים למשימות הקשורות לקוד; Granite Code Base: מודלי מעקב אחר הוראות שאומנו באמצעות שילוב של עדכוני Git בשילוב עם הוראות אנושיות ומערכי נתונים של הוראות קוד סינתטיות בקוד פתוח. Granite Code Instruct: מודלי הבסיס בסדרה אומנו מאפס באסטרטגיית אימון דו-שלבית. בשלב 1, המודל שלנו מאומן על 3 עד 4 טריליון טוקנים שמקורם ב-116 שפות תכנות, מה שמבטיח הבנה מקיפה של שפות תכנות ותחביר. בשלב 2, המודל שלנו מאומן נוספת על 500 מיליארד טוקנים עם תערובת מתוכננת בקפידה של נתונים באיכות גבוהה מתחומי הקוד והשפה הטבעית כדי לשפר את יכולת ההיסק של המודל. אנו משתמשים במטרת מידול שפה בלתי מפוקחת כדי לאמן את מודלי הבסיס בשני שלבי האימון. מודלי ההוראות נגזרים על ידי אימון נוסף של מודלי הבסיס המאומנים לעיל על שילוב של גרסה מסוננת של CommitPack ( , ), מערכי נתונים למעקב אחר הוראות בשפה טבעית (OASST ( , ), HelpSteer ( , )) ומערכי נתונים של מתמטיקה סינתטיים (MathInstruct ( , ) ו-MetaMathQA ( , )), כולל מערכי נתונים של קוד סינתטיים ליצירה כדי לשפר את יכולות המעקב אחר הוראות וההיסק. Muennighoff et al. 2023 Ko¨pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 אנו עורכים הערכות מקיפות של מודלי שפה גדולים לקוד שלנו על מערך מקיף של מדדי ביצועים, כולל HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ), ועוד. מערך זה של מדדי ביצועים כולל סוגים רבים ושונים של משימות קידוד מעבר לסינתזת קוד ב-Python, למשל, תיקון קוד, הסבר קוד, עריכת קוד, תרגום קוד, וכו', ברוב שפות התכנות העיקריות (Python, JavaScript, Java, Go, C++, Rust, וכו'). Muennighoff et al. 2023 Austin et al. 2021 Liu et al. 2023a Liu et al. 2023b Wang et al. 2022 ממצאינו חושפים כי בקרב מודלים בקוד פתוח, מודלי Granite Code מציגים באופן כללי ביצועים חזקים מאוד בכל גדלי המודלים ומדדי הביצועים (לעיתים קרובות עולים בביצועים על מודלי קוד אחרים בקוד פתוח שהם גדולים פי שניים מ-Granite). כהמחשה, איור (למעלה) מציג השוואה של Granite-8B-Code-Base עם מודלי שפה גדולים אחרים של קוד בסיס בקוד פתוח, כולל מודלי שפה גדולים כלליים בעלי ביצועים גבוהים כמו Mistral ( , ) ו-LLama-3 ( , ) על HumanEvalPack ( , ). בעוד ש-CodeGemma ו-StarCoder2 מציגים ביצועים סבירים ביצירת קוד, הם מציגים ביצועים נמוכים משמעותית על גרסאות תיקון קוד והסבר של HumanEvalPack. בממוצע, Granite-8B-Code-Base עולה בביצועיו על מודל CodeGemma-8B התחרותי ביותר בכמעט 12 נקודות על HumanEvalPack (33.2% לעומת 21.3%), למרות שאומן על מספר טוקנים קטן משמעותית (4.5T לעומת 7.5T טוקנים). בנוסף למודלי הבסיס, הווריאנטים המכווננים להוראות של מודלי Granite Code שלנו מציגים גם ביצועים חזקים על HumanEvalPack, ועולים בביצועיהם על מודלי הוראות אחרים (קוד) בקוד פתוח, מה שמדגים יתרונות למגוון רחב יותר של משימות קידוד עם הוראות בשפה טבעית (ראה איור (למטה)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 יתר על כן, מכיוון שהיסק קריטי לפתרון שאלות ומשימות מורכבות, אנו גם בודקים את מודל Granite-8B-Code-Base שלנו על שישה מדדי ביצועים מתמטיים, כולל MATH ( , ), GSM8K ( , ) ופתרון בעיות עם גישה לכלי חישוב, שם מודל Granite 8B שלנו משיג ביצועים טובים יותר בהשוואה למרבית מודלי השפה הגדולים המתקדמים בגודל 7B או 8B. לדוגמה, Granite-8B-Code-Base עולה בביצועיו על Llama-3-8B-Base בכ-12 נקודות ב-GSM8K ובכ-6 נקודות ב-MATH (ראה טבלה ). Cobbe et al. 2021 Cobbe et al. 2021 15 היתרונות המרכזיים של מודלי Granite Code כוללים: : מודלי Granite Code משיגים ביצועים תחרותיים או מתקדמים בתחום במשימות שונות הקשורות לקוד, כולל יצירת קוד, הסבר, תיקון, עריכה, תרגום, וכו', מה שמדגים את יכולתם לפתור משימות קידוד מגוונות; מודל שפה גדול לקוד "כל-סיבובי" : כל המודלים שלנו אומנו על נתונים המותרים לשימוש לפי רישיון שנאספו בהתאם לעקרונות האתיקה של IBM AI ובהנחיית הצוות המשפטי התאגידי של IBM לשימוש ארגוני אמין. כל מודלי Granite Code משוחררים תחת רישיון Apache 2.0. מודל שפה גדול אמין ברמה ארגונית 1 אנו מתארים את כל צינור איסוף הנתונים, הסינון והעיבוד המקדים שלנו בסעיף . סעיף מתאר את פרטי ארכיטקטורת המודל, ואחריו פרטי אימון בסעיף . סעיף מספק את הפרטים על כוונון הוראות, וסעיף מתאר את הניסויים והתוצאות המשוות את מודלי Granite Code למודלי שפה גדולים אחרים בקוד פתוח. 2 3 4 5 6 2 איסוף נתונים בסעיף זה, אנו מתארים את תהליך הזחילה והסינון (סע' ), הסרת כפילויות (סע' ), סינון HAP/PII (סע' ) ששימשו להכנת נתוני הקוד לאימון המודל. אנו גם מספקים סקירה כללית של נתונים באיכות גבוהה בשפה טבעית ששימשו לשיפור הבנת השפה ומיומנויות ההיסק המתמטי של המודל. 2.1 2.2 2.3 2.1 זחילה וסינון נתונים נתוני הקוד לאימון קדם מקדימים נבעו משילוב של מערכי נתונים זמינים לציבור כמו Github Code Clean , StarCoderdata , ומאגרי קוד ציבוריים נוספים וסוגיות מ-GitHub. אנו מסננים נתונים גולמיים כדי לשמור רשימה של 116 שפות תכנות מתוך יותר מ-300 שפות, כמפורט בנספח . הקצאת נתונים לשפות תכנות מתבצעת על בסיס סיומת קובץ בלבד, בדומה ל-StarCoder ( , ). לאחר סינון השפות, אנו מיישמים ארבע כללי סינון עיקריים כדי לסנן קוד באיכות נמוכה יותר ( , ): (1) הסר קבצים עם פחות מ-25% תווים אלפביתיים, (2) למעט שפת XSLT, סנן קבצים בהם המחרוזת "<?xml version=” מופיעה ב-100 התווים הראשונים, (3) עבור קבצי HTML, שמור רק קבצים בהם הטקסט הנראה מהווה לפחות 20% מקוד ה-HTML ויש לו אורך מינימלי של 100 תווים, (4) עבור קבצי JSON ו-YAML, שמור רק קבצים בעלי ספירת תווים בטווח של 50 עד 5000 תווים. אנו גם מסננים סוגיות GitHub באמצעות סט של מדדי איכות הכוללים הסרת טקסט שנוצר אוטומטית, סינון סוגיות שאינן באנגלית, החרגת הערות של בוטים, ושימוש במספר המשתמשים המעורבים בשיחה כאינדיקטור לאיכות. אנו גם מוסיפים לכל קובץ קוד מידע רישוי הקשור למאגר המתאים, שנמצא באמצעות ממשקי API של Github ושומרים רק קבצים עם רישיונות מתירים לאימון המודל. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 הסרת כפילויות מדויקת ועמומה אנו מאמצים אסטרטגיית הסרת כפילויות אגרסיבית הכוללת הסרת כפילויות מדויקת ועמומה כדי להסיר מסמכים בעלי תוכן קוד (כמעט) זהה במערך האימון שלנו. להסרת כפילויות מדויקת, אנו תחילה מחשבים גיבוב SHA256 על תוכן המסמך ומסירים רשומות בעלות גיבובים זהים. לאחר הסרת כפילויות מדויקת, אנו מיישמים הסרת כפילויות עמומה במטרה להסיר קבצי קוד שעשויים להיות בעלי וריאציות קלות ובכך להטות את הנתונים עוד יותר. אנו מיישמים שיטה דו-שלבית לכך: (1) מחשבים MinHashes של כל המסמכים ולאחר מכן משתמשים ב-Locally Sensitive Hashing (LSH) כדי לקבץ מסמכים על בסיס טביעות האצבע MinHash שלהם, (2) מודדים את דמיון Jaccard בין כל זוג מסמכים באותה דלי ומוסיפים תווית למסמכים, למעט אחד, ככפילויות על בסיס סף דמיון של 0.7. אנו מיישמים תהליך כמעט-הסרת כפילויות זה על כל שפות התכנות, כולל סוגיות GitHub, כדי לשפר את העושר והמגוון של מערך נתוני האימון. 2.3 סינון HAP, PII, נוזקות כדי להפחית את הסבירות ליצירת שפה פוגענית, משמיצה או גסה (HAP) מהמודלים, אנו עושים מאמצים ניכרים לסנן תוכן HAP ממערך האימון. אנו יוצרים תחילה מילון של מילות מפתח HAP ולאחר מכן מוסיפים תווית לכל מסמך קוד עם מספר המופעים של מילות מפתח כאלה בתוכן, כולל הערות. אנו מסננים מסמכים החורגים מסף ה-HAP, המחושב על בסיס ניתוח התפלגותי ובדיקה ידנית של קבצי קוד. יתרה מכך, כדי להגן על הפרטיות, אנו עוקבים אחר StarCoder ( , ) ועושים מאמצים ניכרים לערוך מידע זיהוי אישי (PII) ממערך האימון. באופן ספציפי, אנו ממנפים את מודל StarPII כדי לזהות כתובות IP, מפתחות, כתובות דוא"ל, שמות, שמות משתמש וסיסמאות הנמצאים בתוכן. שלב עריכת ה-PII מחליף את טקסט ה-PII באסימונים המתאימים NAME , EMAIL , KEY , PASSWORD ומשנה את כתובת ה-IP בכתובת IP שנוצרה סינתטית, כפי שנעשה אצל Li et al. (2023a). אנו גם סורקים את מערכי הנתונים שלנו באמצעות כדי לזהות ולהסיר מקרים של נוזקות בקוד המקור. Li et al. 2023a 4 2.4 מערכי נתונים בשפה טבעית בנוסף לאיסוף נתוני קוד לאימון המודל, אנו מאתריבים מספר מערכי נתונים בשפה טבעית באיכות גבוהה הזמינים לציבור כדי לשפר את מיומנות המודל בהבנת שפה והיסק מתמטי. מערכי נתונים מייצגים תחת קטגוריה זו כוללים מסמכי אינטרנט (Stackexchange, CommonCrawl), טקסט מתמטי אינטרנטי (OpenWeb-Math; ( ), StackMathQA; ( )), טקסט אקדמי (Arxiv, Wikipedia), ומערכי נתונים לכוונון הוראות (FLAN; ( ), HelpSteer ( , )). אנו איננו מסירים כפילויות ממערכי נתונים אלו בשפה טבעית שכבר עברו עיבוד מקדים. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 ארכיטקטורת המודל אנו מאמנים סדרת מודלי קוד בגדלים משתנים המבוססים על ארכיטקטורת טרנספורמר decoder ( , ). היפר-פרמטרים המודל למודלים אלו ניתנים בטבלה . עבור כל ארכיטקטורות המודל, אנו משתמשים ב-pre-normalization ( , ): נורמליזציה המיושמת לקלט של בלוקי attention ו-MLP. Vaswani et al. 2017 1 Xiong et al. 2020 : המודל הקטן ביותר במשפחת מודלי Granite-code מאומן עם הטמעת RoPE ( , ) ו-Multi-Head Attention ( , ). מודל זה משתמש בפונקציית ההפעלה swish ( , ) עם GLU ( , ) עבור ה-MLP, המכונה גם swiglu. לצורך נורמליזציה, אנו משתמשים ב-RMSNorm ( , ) מכיוון שהוא יעיל יותר חישובית מ-LayerNorm ( , ). מודל ה-3B מאומן באורך הקשר של 2048 טוקנים. 3B Su et al. 2023 Vaswani et al. 2017 Ramachandran et al. 2017 Shazeer 2020 Zhang & Sennrich 2019 Ba et al. 2016 : למודל ה-8B ארכיטקטורה דומה למודל ה-3B למעט השימוש ב-Grouped-Query Attention (GQA) ( , ). שימוש ב-GQA מספק יחס החזר טוב יותר בין ביצועי המודל ליעילות ההסקה בסדר גודל זה. אנו מאמנים את מודל ה-8B באורך הקשר של 4096 טוקנים. 8B Ainslie et al. 2023 : מודל הקוד 20B מאומן עם הטמעות מיקום אבסולוטיות נלמדות. אנו משתמשים ב-Multi-Query Attention ( , ) במהלך האימון לצורך הסקה יעילה לאחר האימון. עבור בלוק ה-MLP, אנו משתמשים בפונקציית ההפעלה GELU ( , ). לצורך נורמליזציה של ההפעלות, אנו משתמשים ב-LayerNorm ( , ). מודל זה מאומן באורך הקשר של 8192 טוקנים. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : לאימון מודל ה-34B, אנו עוקבים אחר הגישה של להגדלת עומק של מודל ה-20B. באופן ספציפי, אנו תחילה משכפלים את מודל הקוד 20B עם 52 שכבות ולאחר מכן מסירים 8 שכבות סופיות מהמודל המקורי ו-8 שכבות ראשוניות מהעותק שלו כדי ליצור שני מודלים. 34B Kim et al. לבסוף, אנו מחברים את שני המודלים ליצירת מודל Granite-34B-Code עם 88 שכבות (ראה איור להמחשה). לאחר הגדלת העומק, אנו מבחינים כי הירידה בביצועים בהשוואה למודל 20B קטנה למדי, בניגוד למה שנצפה על ידי . ביצועים אלו מתאוששים במהירות למדי לאחר שאנו ממשיכים באימון קדם של מודל 2 Kim et al.