```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 етика и ръководени от юридическия екип на 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 проблеми, използвайки набор от метрики за качество, които включват премахване на генериран текст, филтриране на проблеми, които не са на английски, изключване на коментари от ботове и използване на броя потребители, участващи в разговора, като индикатор за качество. Също така анотираме всеки файл с код с информация за лиценза, свързан със съответното хранилище, открит чрез Github API, и запазваме само файлове с разрешени лицензи за обучение на модела. 2 3 А Li et al. 2023a Li et al. 2023a 2.2 Точна и неточна дедупликация Прилагаме агресивна стратегия за дедупликация, включваща както точна, така и неточна дедупликация, за да премахнем документи с (почти) идентично съдържание на код от нашия набор от данни за обучение. За точна дедупликация, първо изчисляваме SHA256 хеш на съдържанието на документа и премахваме записи с идентични хешове. След точна дедупликация, прилагаме неточна дедупликация с цел премахване на файлове с код, които може да имат леки вариации и по този начин допълнително да се намали отклонението на данните. Прилагаме двустъпков метод за това: (1) изчисляваме MinHashes на всички документи и след това използваме локално чувствително хеширане (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 Архитектура на модела Обучаваме серия от модели за код с различни размери, базирани на архитектурата на трансформер декодер ( , ). Хиперпараметрите на модела за тези модели са дадени в Таблица . За всички архитектури на модели използваме предварителна нормализация ( , ): нормализация, приложена към входа на блоковете за внимание и 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 токена данни за код и набори от данни на естествен език, свързани с код. Данните се токенизират чрез 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 (обучение на код + език)