```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 Анотація Великі мовні моделі (LLM), навчені на коді, революціонізують процес розробки програмного забезпечення. Все частіше LLM для коду інтегруються в середовища розробки програмного забезпечення для підвищення продуктивності людських програмістів, а агенти на основі LLM починають демонструвати багатообіцяючі результати у самостійному виконанні складних завдань. Реалізація повного потенціалу LLM для коду вимагає широкого спектру можливостей, включаючи генерацію коду, виправлення помилок, пояснення та документування коду, обслуговування репозиторіїв та багато іншого. У цій роботі ми представляємо серію декодерних моделей Granite для завдань генерації коду, навчених на коді, написаному 116 мовами програмування. Сімейство моделей Granite Code складається з моделей розміром від 3 до 34 мільярдів параметрів, придатних для застосувань від складних завдань модернізації додатків до випадків використання з обмеженою пам'яттю на пристрої. Оцінка на комплексному наборі завдань демонструє, що моделі Granite Code стабільно досягають найвищої продуктивності серед доступних відкритих 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: моделі, що дотримуються інструкцій, доналаштовані за допомогою комбінації пар 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 Ми проводимо обширні оцінки наших LLM для коду на комплексному наборі бенчмарків, включаючи 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 з іншими відкритими базовими 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. Наприклад, 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 досягають конкурентоспроможної або найвищої продуктивності в різних типах завдань, пов'язаних з кодом, включаючи генерацію, пояснення, виправлення, редагування, переклад коду тощо, демонструючи свою здатність вирішувати різноманітні завдання кодування; Універсальна LLM для коду : Усі наші моделі навчені на даних, дозволених для ліцензування, зібраних відповідно до принципів IBM AI Ethics та керованих юридичним відділом IBM для надійного корпоративного використання. Усі моделі Granite Code випускаються під ліцензією Apache 2.0. Надійна LLM корпоративного рівня 1 Ми описуємо весь наш конвеєр збору, фільтрації та попередньої обробки даних у розділі . Розділ описує деталі архітектури моделі, за яким слідують деталі навчання в Розділі . Розділ надає деталі про навчання з інструкціями, а Розділ описує експерименти та результати порівняння моделей Granite Code з іншими відкритими LLM. 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 усіх документів, а потім використовувати Локальне Чутливе Хешування (LSH) для групування документів на основі їх MinHash-відбитків, (2) виміряти подібність Якарда між кожною парою документів в одному кошику та анотувати документи, крім одного, як дублікати на основі порогу подібності 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 detect-malware 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 Архітектура моделі Ми тренуємо серію моделей коду різного розміру на основі декодерної архітектури трансформера ( , ). Гіперпараметри моделі для цих моделей наведені в Таблиці . Для всіх архітектур моделей ми використовуємо попередню нормалізацію ( , ): нормалізація, застосована до входу блоків уваги та MLP. Vaswani et al. 2017 1 Xiong et al. 2020 : Найменша модель у сімействі Granite-code навчена з використанням RoPE embeddings ( , ) та 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 токенах кодових даних та даних природної мови, пов'язаних з кодом. Дані токенізуються за допомогою алгоритму Byte Pair Encoding (BPE, ( , )), використовуючи той самий токенізатор, що й StarCoder ( , ). Дотримуючись ( , ; , ), ми використовуємо високоякісні дані з двома фазами навчання, як зазначено нижче. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Під час фази 1 моделі 3B та 8B навчаються на 4 трильйонах токенів кодових даних, що складають 116 мов. Модель 20B параметрів навчається на 3 трильйонах токенів коду. Модель 34B навчається на 1.4T токенах після масштабування глибини, яке проводиться на чекпоінті 1.6T моделі 20B. Фаза 1 (навчання лише коду) • : На фазі 2 ми включаємо додаткові високоякісні загальнодоступні дані з різних доменів, включаючи технічні, математичні та веб-документи, щоб ще більше покращити продуктивність моделі в міркуваннях та розв'язанні проблем, які є важливими для генерації коду. Ми навчаємо всі наші моделі на 500B токенів (80% коду та 20% мовних даних) на фазі 2 навчання. Фаза 2 (навчання коду + мови) 4.2 Навчальна ціль Для навчання всіх наших моделей ми використовуємо об'єктив причинного мовного моделювання та об'єктив Fill-In-the-Middle (FIM) ( , ). Об'єктив FIM призначений для передбачення вставлених токенів з заданим контекстом та подальшим текстом. Ми тренуємо наші моделі для роботи як з режимами PSM (префікс-су Bavarian et al. 2022