```html מחברים: Mayank Mishra⋆, IBM Matt Stallone⋆, IBM Gaoyuan Zhang⋆, IBM Yikang Shen, IBM Aditya Prasad, IBM Adriana Meza Soria, IBM Michele Merler, IBM Parameswaran Selvam, IBM Saptha Surendran, IBM Shivdeep Singh, IBM Manish Sethi, IBM Xuan-Hong Dang, IBM Pengyuan Li, IBM Kun-Lung Wu, IBM Syed Zawad, IBM Andrew Coleman, IBM Matthew White, IBM Mark Lewis, IBM Raju Pavuluri, IBM Yan Koyfman, IBM Boris Lublinsky, IBM Maximilien de Bayser, IBM Ibrahim Abdelaziz, IBM Kinjal Basu, IBM Mayank Agarwal, IBM Yi Zhou, IBM Chris Johnson, IBM Aanchal Goyal, IBM Hima Patel, IBM Yousaf Shah, IBM Petros Zerfos, IBM Heiko Ludwig, IBM Asim Munawar, IBM Maxwell Crouse, IBM Pavan Kapanipathi, IBM Shweta Salaria, IBM Bob Calio, IBM Sophia Wen, IBM Seetharami Seelam, IBM Brian Belgodere, IBM Carlos Fonseca, IBM Amith Singhee, IBM Nirmit Desai, IBM David D. Cox, IBM Ruchir Puri†, IBM Rameswar Panda†, IBM תקציר מודלי שפה גדולים (LLMs) שאומנו על קוד מחוללים מהפכה בתהליך פיתוח התוכנה. יותר ויותר, מודלי קוד LLM משולבים בסביבות פיתוח תוכנה כדי לשפר את הפרודוקטיביות של מתכנתים אנושיים, וסוכנים מבוססי LLM מתחילים להראות הבטחה בטיפול במשימות מורכבות באופן אוטונומי. מימוש מלוא הפוטנציאל של מודלי קוד LLM דורש מגוון רחב של יכולות, כולל יצירת קוד, תיקון באגים, הסבר ותיעוד קוד, תחזוקת מאגרים, ועוד. בעבודה זו, אנו מציגים את סדרת Granite של מודלי קוד מסוג decoder-only למשימות יצירת קוד, שאומנו עם קוד הכתוב ב-116 שפות תכנות. משפחת מודלי Granite Code כוללת מודלים בגדלים שונים, החל מ-3 עד 34 מיליארד פרמטרים, המתאימים ליישומים החל ממשימות מודרניזציה מורכבות של יישומים ועד למקרים של שימוש מוגבל בזיכרון על המכשיר. הערכה על מערך מקיף של משימות מדגימה שמודלי Granite Code מגיעים באופן עקבי לביצועים של state-of-the-art מבין מודלי קוד LLM בקוד פתוח זמינים. משפחת מודלי Granite Code עברה אופטימיזציה עבור תהליכי פיתוח תוכנה ארגוניים ומציגה ביצועים טובים במגוון משימות קידוד (למשל, יצירת קוד, תיקון והסבר), מה שהופך אותה למודל קוד "הכל כלול" ורסטילי. אנו משחררים את כל מודלי Granite Code שלנו תחת רישיון Apache 2.0 לשימוש מחקרי ומסחרי כאחד. https://github.com/ibm-granite/granite-code-models 1 מבוא בעשורים האחרונים, תוכנה נארגה אל תוך המרקם של כל היבט בחברה שלנו. ככל שהביקוש לפיתוח תוכנה גואה, קריטי מתמיד להגביר את פרודוקטיביות פיתוח התוכנה, ומודלי LLM מספקים נתיב מבטיח להגברת מתכנתים אנושיים. שימושים ארגוניים בולטים עבור מודלי LLM בפרודוקטיביות פיתוח תוכנה כוללים יצירת קוד, הסבר קוד, תיקון קוד, יצירת יחידות בדיקה ותיעוד, מודרניזציה של יישומים, זיהוי פגיעויות, תרגום קוד, ועוד. בשנים האחרונות נרשמה התקדמות מהירה ביכולתם של מודלי LLM ליצור ולטפל בקוד, ומגוון מודלים עם יכולות קידוד מרשימות זמינים כיום. המודלים נעים בגודלם בין מיליארדי פרמטרים בודדים (למשל, 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)). עם זאת, קיימים פערים חשובים בשדה הנוכחי של מודלי LLM לקוד, במיוחד בהקשר של פיתוח תוכנה ארגוני. ראשית, בעוד שמודלי LLM כלליים גדולים מאוד יכולים להשיג ביצועי קידוד מצוינים, גודלם הופך אותם ליקרים לפריסה. מודלי קוד קטנים יותר ( , ; , ; , ; , ; , ) יכולים להשיג ביצועי יצירת קוד מצוינים בחבילה קטנה וגמישה יותר, אך הביצועים במשימות קידוד מעבר ליצירה (למשל, תיקון והסבר) יכולים להיות נמוכים מביצועי יצירת הקוד. Li et al. 2023a Lozhkov et al. 2024 Nijkamp et al. 2023 Rozie`re et al. 2023 CodeGemma Team et al. 2024 בהקשרים ארגוניים רבים, אימוץ של מודלי LLM לקוד יכול להיות מסובך עוד יותר על ידי גורמים מעבר לביצועי המודלים. לדוגמה, אפילו מודלים פתוחים סובלים לעתים קרובות מחוסר שקיפות לגבי מקורות הנתונים ושיטות עיבוד הנתונים ששימשו ליצירת המודל, מה שיכול לשחוק אמון במודלים בהקשרים קריטיים ומוסדרים. יתר על כן, תנאי הרישיון במודלי LLM פתוחים כיום יכולים להגביל ולסבך את יכולת הארגון להשתמש במודל. כאן אנו מציגים את מודלי Granite Code, סדרה של מודלי LLM לקוד בעלי יכולות גבוהות, שנועדו לתמוך בפיתוח תוכנה ארגוני במגוון רחב של משימות קידוד. למשפחת מודלי Granite Code ישנם שני וריאנטים עיקריים שאנו מפיצים בארבעה גדלים שונים (3B, 8B, 20B, ו-34B): מודלי בסיס יסודיים למשימות הקשורות לקוד; Granite Code Base: מודלים העוקבים אחר הוראות, שעברו fine-tuning באמצעות שילוב של Git commits לצד הוראות אנושיות ומערכי נתונים של הוראות קוד סינתטיות בקוד פתוח. Granite Code Instruct: מודלי הבסיס בסדרה אומנו מאפס באמצעות אסטרטגיית אימון דו-שלבית. בשלב 1, המודל שלנו מאומן על 3 עד 4 טריליון טוקנים שמקורם ב-116 שפות תכנות, מה שמבטיח הבנה מקיפה של שפות תכנות ותחביר. בשלב 2, המודל שלנו מאומן נוסף על 500 מיליארד טוקנים עם תערובת שתוכננה בקפידה של נתונים איכותיים מתחומי קוד ושפה טבעית כדי לשפר את יכולת ההיסק של המודל. אנו משתמשים במטרה של מידול שפה ללא פיקוח לאימון מודלי הבסיס בשני שלבי האימון. מודלי ההוראות נגזרים על ידי fine-tuning נוסף של מודלי הבסיס המאומנים לעיל על שילוב של גרסה מסוננת של 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, 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 עם מודלי LLM בסיסיים אחרים בקוד פתוח, כולל מודלי LLM כלליים בסיסיים בעלי ביצועים גבוהים לאחרונה כמו 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 שלנו משיג ביצועים טובים יותר בהשוואה לרוב מודלי LLM של 7B או 8B state-of-the-art. לדוגמה, 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 משיגים ביצועים תחרותיים או state-of-the-art במגוון סוגים של משימות הקשורות לקוד, כולל יצירת קוד, הסבר, תיקון, עריכה, תרגום, וכו', מה שמדגים את יכולתם לפתור משימות קידוד מגוונות; מודל LLM קוד "הכל-כלול" : כל המודלים שלנו מאומנים על נתונים המותרים לרישיון שנאספו בהתאם לעקרונות האתיקה של IBM AI ונחנכו על ידי צוות המשפטי של IBM לשימוש ארגוני אמין. כל מודלי Granite Code משוחררים תחת רישיון Apache 2.0. מודל LLM אמין ברמה ארגונית 1 אנו מתארים את כל צינור איסוף הנתונים, הסינון והעיבוד המקדים שלנו בסעיף . סעיף מתאר את פרטי ארכיטקטורת המודל, ואחריו פרטי אימון בסעיף . סעיף מספק את פרטי ה-instruction tuning, וסעיף מתאר את הניסויים והתוצאות המשוות את מודלי Granite Code למודלי LLM אחרים בקוד פתוח. 2 3 4 5 6 2 איסוף נתונים בסעיף זה, אנו מתארים את תהליך הזחילה והסינון (סעיף ), דה-דופליקציה (סעיף ), וסינון HAP/PII (סעיף ) ששימשו להכנת נתוני הקוד לאימון המודל. אנו מספקים גם סקירה של נתונים בשפה טבעית באיכות גבוהה ששימשו לשיפור הבנת השפה ומיומנויות ההיסק המתמטי של המודל. 2.1 2.2 2.3 2.1 זחילה וסינון נתונים נתוני הקוד לאימון המוקדם נלקחו משילוב של מערכי נתונים זמינים לציבור כמו Github Code Clean , StarCoderdata , ומאגרי קוד ציבוריים נוספים ו-issues מ-GitHub. אנו מסננים נתונים גולמיים כדי לשמור על רשימה של 116 שפות תכנות מתוך יותר מ-300 שפות, כפי שמופיע בנספח . הקצאת נתונים לשפות תכנות מתבצעת על סמך סיומת קובץ בלבד, בדומה ל-StarCoder ( , ). לאחר סינון שפות, אנו מיישמים ארבע כללי סינון עיקריים כדי לסנן קוד באיכות נמוכה ( , ): (1) הסרת קבצים עם פחות מ-25% תווים אלפביתיים, (2) למעט שפת XSLT, סינון קבצים שהמחרוזת “<?xml version=” מופיעה ב-100 התווים הראשונים, (3) עבור קבצי HTML, שמירת קבצים בהם הטקסט הנראה מהווה לפחות 20% מקוד ה-HTML ויש לו אורך מינימלי של 100 תווים, (4) עבור קבצי JSON ו-YAML, שמירת קבצים שהיקף התווים שלהם נע בין 50 ל-5000 תווים. אנו גם מסננים issues מ-GitHub באמצעות מערך של מדדי איכות הכוללים הסרת טקסט שנוצר אוטומטית, סינון issues שאינם באנגלית, החרגת תגובות מבוטים, ושימוש במספר המשתמשים המעורבים בשיחה כמדד לאיכות. אנו גם מתייגים כל קובץ קוד עם מידע רישיון הקשור למאגר הרלוונטי, שנמצא באמצעות ממשקי 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. אנו מיישמים תהליך דה-דופליקציה קרוב זה על כל שפות התכנות, כולל issues מ-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), ומערכי נתונים של instruction tuning (FLAN; ( ), HelpSteer ( , )). אנו לא מבצעים דה-דופליקציה למערכי נתונים אלו בשפה טבעית שכבר עברו עיבוד מקדים. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 ארכיטקטורת מודל אנו מאמנים סדרת מודלי קוד בגדלים שונים על בסיס ארכיטקטורת פענח הטרנספורמר ( , ). היפר-פרמטרים של המודל עבור מודלים אלו מופיעים בטבלה . עבור כל ארכיטקטורות המודל, אנו משתמשים ב-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 היא קטנה למדי בניגוד למה שנצפה אצל . ביצועים אלו משוחזרים במהירות רבה לאחר שאנו ממשיכים באימון המוקדם של מודל 34B שהוגדל. בדומה ל-20B, אנו משתמשים בהקשר של 8192 טוקנים במהלך האימון המוקדם. 2 Kim et al. 4 אימון מוקדם בסעיף זה, אנו מספקים פרטים על אימון דו-שלבי (סעיף ), מטרות אימון (סעיף ), אופטימיזציה (סעיף ) ותשתית (סעיף ) ששימשו לאימון המוקדם של המודלים. 4.1 4.2 4.3 4.4 4.1 אימון דו-שלבי מודלי Granite Code מאומנים על 3.5T עד 4.5T טוקנים של נתוני קוד ומ