```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 Аннотация Большие языковые модели (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 могут достигать превосходной производительности в кодировании, их размер делает их дорогими в развертывании. Модели меньшего размера, ориентированные на код (<a href="#_bookmark86">Li et al., <a href="#_bookmark86">2023a; <a href="#_bookmark91">Lozhkov et al., <a href="#_bookmark91">2024; <a href="#_bookmark96">Nijkamp et al., <a href="#_bookmark96">2023; <a href="#_bookmark103">Rozie`re et al., <a href="#_bookmark103">2023; <a href="#_bookmark61">CodeGemma Team et al., <a href="#_bookmark61">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 (<a href="#_bookmark94">Muennighoff et al., <a href="#_bookmark94">2023), наборов данных инструкций на естественном языке (OASST (<a href="#_bookmark82">Ko¨ pf et al., <a href="#_bookmark82">2023), HelpSteer (<a href="#_bookmark114">Wang et al., <a href="#_bookmark114">2023)) и открытых наборов данных математики (MathInstruct (<a href="#_bookmark118">Yue et al., <a href="#_bookmark118">2023) и MetaMathQA (<a href="#_bookmark117">Yu et al., <a href="#_bookmark117">2023)), включая синтетически сгенерированные наборы данных кода для улучшения следования инструкциям и способностей к рассуждению. Мы проводим обширные оценки наших LLM для кода на исчерпывающем наборе эталонных тестов, включая HumanEvalPack (<a href="#_bookmark94">Muennighoff et al., <a href="#_bookmark94">2023), MBPP(+) (<a href="#_bookmark52">Austin et al., <a href="#_bookmark52">2021; <a href="#_bookmark88">Liu <a href="#_bookmark88">et al., <a href="#_bookmark88">2023a), RepoBench (<a href="#_bookmark89">Liu et al., <a href="#_bookmark89">2023b), ReCode (<a href="#_bookmark113">Wang et al., <a href="#_bookmark113">2022) и другие. Этот набор эталонных тестов охватывает множество различных видов задач кодирования, помимо простого синтеза кода на Python, например, исправление кода, объяснение кода, редактирование кода, перевод кода и т. д. на большинстве основных языков программирования (Python, JavaScript, Java, Go, C++, Rust и т. д.). Наши выводы показывают, что среди открытых моделей модели Granite Code в целом демонстрируют очень высокую производительность по всем размерам моделей и эталонным тестам (часто превосходя другие открытые модели для кода, которые в два раза больше Granite). В качестве иллюстрации, рис. 1 (вверху) показывает сравнение Granite-8B-Code-Base с другими открытыми базовыми LLM для кода, включая недавние высокопроизводительные универсальные базовые LLM, такие как Mistral (<a href="#_bookmark77">Jiang et al., <a href="#_bookmark77">2023b) и LLama-3 (<a href="#_bookmark49">AI@Meta, <a href="#_bookmark49">2024) на HumanEvalPack (<a href="#_bookmark94">Muennighoff et al., <a href="#_bookmark94">2023). В то время как CodeGemma и StarCoder2 показывают разумные результаты в генерации кода, они значительно хуже работают в вариантах HumanEvalPack для исправления и объяснения кода. В среднем Granite-8B-Code-Base превосходит наиболее конкурентоспособную модель CodeGemma-8B почти на 12 пунктов в HumanEvalPack (33,2% против 21,3%), несмотря на то, что обучался на значительно меньшем количестве токенов (4,5 трлн против 7,5 трлн токенов). Помимо базовых моделей, варианты Granite Code, настроенные на инструкции, также демонстрируют высокую производительность в HumanEvalPack, превосходя другие открытые модели (для кода), настроенные на инструкции, что демонстрирует преимущества для более широкого набора задач кодирования с инструкциями на естественном языке (см. рис. 1 (внизу)). Кроме того, поскольку рассуждение критически важно для решения сложных вопросов и задач, мы также тестируем нашу модель Granite-8B-Code-Base на шести математических эталонных тестах, включая MATH (<a href="#_bookmark60">Cobbe et al., <a href="#_bookmark60">2021), GSM8K (<a href="#_bookmark60">Cobbe et al., <a href="#_bookmark60">2021) и решение задач с доступом к вычислительным инструментам, где наша модель Granite 8B достигает лучшей производительности по сравнению с большинством современных LLM размером 7B или 8B. Например, Granite-8B-Code-Base превосходит Llama-3-8B-Base примерно на 12 пунктов в GSM8K и примерно на 6 пунктов в MATH (см. таблицу 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 (<a href="#_bookmark86">Li et al., <a href="#_bookmark86">2023a). После фильтрации языков мы применяем четыре основных правила фильтрации для исключения кода низкого качества (<a href="#_bookmark86">Li et al., <a href="#_bookmark86">2023a): (1) удаление файлов с менее чем 25% буквенных символов, (2) за исключением языка XSLT, фильтрация файлов, где строка «<?xml version=” появляется в первых 100 символах, (3) для HTML-файлов сохранять только файлы, где видимый текст составляет не менее 20% HTML-кода и имеет минимальную длину 100 символов, (4) для файлов JSON и YAML сохранять только файлы с количеством символов от 50 до 5000. Мы также фильтруем выпуски GitHub с использованием набора метрик качества, которые включают удаление автоматически сгенерированного текста, фильтрацию неанглоязычных выпусков, исключение комментариев от ботов и использование количества пользователей, участвующих в беседе, в качестве показателя качества. Мы также аннотируем каждый файл кода информацией о лицензии, связанной с соответствующим репозиторием, найденной через API GitHub, и сохраняем только файлы с разрешенными лицензиями для обучения моделей. 2 3 A 2.2 Точная и нечеткая дедупликация Мы применяем агрессивную стратегию дедупликации, включая точную и нечеткую дедупликацию, для удаления документов, имеющих (почти) идентичное содержимое кода в нашем наборе данных для обучения. Для точной дедупликации мы сначала вычисляем хеш SHA256 по содержимому документа и удаляем записи с идентичными хешами. После точной дедупликации мы применяем нечеткую дедупликацию с целью удаления файлов кода, которые могут иметь небольшие вариации и, таким образом, еще больше смещать данные. Мы применяем для этого двухступенчатый метод: (1) вычисляем MinHashes всех документов, а затем используем локально-чувствительное хеширование (LSH) для группировки документов на основе их MinHash-отпечатков, (2) измеряем Jaccard-сходство между каждой парой документов в одной группе и аннотируем документы, кроме одного, как дубликаты на основе порога сходства 0,7. Мы применяем этот процесс почти-дедупликации ко всем языкам программирования, включая выпуски GitHub, для повышения богатства и разнообразия обучающего набора данных. 2.3 Фильтрация HAP, PII, вредоносного ПО Чтобы снизить вероятность генерации моделями ненавистнического, оскорбительного или нецензурного (HAP) языка, мы прилагаем добросовестные усилия для фильтрации HAP-контента из обучающего набора. Сначала мы создаем словарь HAP-ключевых слов, а затем аннотируем каждый документ кода количеством вхождений таких ключевых слов в содержимом, включая комментарии. Мы отфильтровываем документы, которые превышают порог HAP, рассчитанный на основе распределительного анализа, а также ручной проверки файлов кода. Кроме того, для защиты конфиденциальности мы следуем StarCoder (<a href="#_bookmark86">Li <a href="#_bookmark86">et al., <a href="#_bookmark86">2023a) и прилагаем добросовестные усилия для удаления лично идентифицируемой информации (PII) из обучающего набора. В частности, мы используем модель StarPII для обнаружения IP-адресов, ключей, адресов электронной почты, имен, имен пользователей и паролей, найденных в содержимом. Шаг удаления PII заменяет текст PII соответствующими токенами NAME, EMAIL, KEY, PASSWORD и заменяет IP-адрес синтетически сгенерированным IP-адресом, как в Li et al. (2023a). Мы также сканируем наши наборы данных с помощью для идентификации и удаления экземпляров вредоносного ПО в исходном коде. 4 2.4 Наборы данных на естественном языке В дополнение к сбору данных кода для обучения моделей, мы подбираем несколько общедоступных высококачественных наборов данных на естественном языке для улучшения владения моделью языковым пониманием и математическими рассуждениями. Типичные наборы данных этой категории включают веб-документы (Stackexchange, CommonCrawl), математические веб-тексты (OpenWeb-Math; <a href="#_bookmark98">Paster et al. (<a href="#_bookmark98">2023), StackMathQA; <a href="#_bookmark120">Zhang (<a href="#_bookmark120">2024)), академические тексты (Arxiv, Wikipedia) и наборы данных для обучения инструкциям (FLAN; <a href="#_bookmark90">Longpre et al. (<a href="#_bookmark90">2023), HelpSteer (<a href="#_bookmark114">Wang et al., <a href="#_bookmark114">2023)). Мы не дедуплицируем эти уже предварительно обработанные наборы данных на естественном языке. 3 Архитектура модели Мы обучаем серию моделей кода различных размеров на основе архитектуры декодера трансформера (<a href="#_bookmark112">Vaswani et al., <a href="#_bookmark112">2017). Гиперпараметры модели для этих моделей приведены в Таблице . Для всех архитектур моделей мы используем предварительную нормализацию (<a href="#_bookmark115">Xiong et al., <a href="#_bookmark115">2020): нормализация применяется ко входу блоков внимания и MLP. 1 : Самая маленькая модель в семействе моделей Granite-code обучается с использованием эмбеддингов RoPE (<a href="#_bookmark110">Su et al., <a href="#_bookmark110">2023) и многоголового внимания (Multi-Head Attention) (<a href="#_bookmark112">Vaswani et al., <a href="#_bookmark112">2017). Эта модель использует функцию активации swish (<a href="#_bookmark101">Ramachandran et al., <a href="#_bookmark101">2017) с GLU (<a href="#_bookmark105">Shazeer, <a href="#_bookmark105">2020) для MLP, также обычно называемого swiglu. Для нормализации мы используем RMSNorm (<a href="#_bookmark119">Zhang & Sennrich, <a href="#_bookmark119">2019), поскольку он вычислительно более эффективен, чем LayerNorm (<a href="#_bookmark54">Ba et al., <a href="#_bookmark54">2016). Модель 3B обучается с длиной контекста 2048 токенов. 3B : Модель 8B имеет схожую архитектуру с моделью 3B, за исключением использования группированного внимания запросов (Grouped-Query Attention, GQA) (<a href="#_bookmark50">Ainslie et al., <a href="#_bookmark50">2023). Использование GQA обеспечивает лучший компромисс между производительностью модели и эффективностью вывода при таком масштабе. Мы обучаем модель 8B с длиной контекста 4096 токенов. 8B : Модель кода 20B обучается с использованием обучаемых абсолютных позиционных эмбеддингов. Мы используем многозапросное внимание (Multi-Query Attention) (<a href="#_bookmark106">Shazeer, <a href="#_bookmark106">2019) во время обучения для эффективного последующего вывода. Для блока MLP мы используем функцию активации GELU (<a href="#_bookmark71">Hendrycks & Gimpel, <a href="#_bookmark71">2023). Для нормализации активаций мы используем LayerNorm (<a href="#_bookmark54">Ba et al., <a href="#_bookmark54">2016). Эта модель обучается с длиной контекста 8192 токенов. 20B : Для обучения модели 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,5-4,5 трлн токенов данных кода и наборах данных естественного языка, связанных с кодом. Данные токенизируются с помощью байт-парного кодирования (BPE, (<a href="#_bookmark104">Sennrich et al., <a href="#_bookmark104">2015)), используя тот же токенизатор, что и StarCoder (<a href="#_bookmark86">Li et al., <a href="#_bookmark86">2023a). В соответствии с (<a href="#_bookmark107">Shen et al., <a href="#_bookmark107">2024; <a href="#_bookmark73">Hu et al., <a href="#_bookmark73">2024), мы используем высококачественные данные в два этапа обучения следующим образом. • : На этапе 1 модели 3B и 8B обучаются на 4 трлн токенов данных кода, охватывающих 116 языков. Модель с 20 миллиардами параметров обучается на 3 трлн токенов кода. Модель 34B обучается на 1,4 трлн токенов после увеличения глубины, которое выполняется на контрольной точке 1,6 трлн модели 20B. Этап 1 (обучение только кода) • : На этапе 2 мы включаем дополнительные общедоступные высококачественные данные из различных областей, включая технические, математические и веб-документы, для дальнейшего улучшения производительности модели в навыках рассуждения и решения задач, которые необходимы для генерации кода. Мы обучаем все наши модели на 500 млрд токенов (80% кода и 20% данных языка) на этапе 2 обучения. Этап 2 (обучение кода + языка) 4.2 Цель обучения Для обучения всех наших моделей мы используем задачу каузального языкового моделирования и задачу заполнения середины (Fill-In-the-Middle, FIM) (<a href="#_bookmark56">Bavarian et al., <a href="#_bookmark56">2022). Задача FIM состоит в предсказании вставленных токенов с учетом заданного контекста и последующего текста. Мы обучаем наши модели работать как в режимах PSM (префикс-суффикс-средний), так и SPM (суффикс-префикс-средний) с соответствующими токенами управления форматированием, как и StarCoder (<a href="#_bookmark86">Li et al., <a href="#_bookmark86">2023a). Общая потеря вычисляется как взвешенная комбинация 2 целей: Мы эмпирически устанавливаем = 0,5 во время обучения и обнаруживаем, что это хорошо работает на практике, приводя к SOTA-производительности как в задачах завершения кода, так и в задачах заполнения кода. Следует отметить, что задача FIM используется только во время предварительного обучения, однако мы отказываемся от нее во время обучения инструкций, то есть устанавливаем = 1. α α 4.3 Оптимизация Мы используем оптимизатор AdamW ([Kingma & Ba](#_bookmark80), [2017](#_bookmark80)) с β1 = 0,9, β2 = 0,95 и весовым затуханием 0,1 для обучения всех наших моделей Granite Code. Для предварительного обучения этапа 1 скорость обучения следует косинусоидальному расписанию, начиная с 3 10−4, которое снижается до 3 10−5 с начальным линейным этапом прогрева в 2k итераций. Для предварительного обучения этапа 2 мы начинаем с 3 10−4 (1,5 10−4 для моделей 20B и 34B) и применяем экспоненциальное расписание затухания, чтобы уменьшить его до 10% от начальной скорости обучения. Мы используем размер пакета от 4M до 5M токенов в зависимости от размера модели на обоих этапах предварительного обучения. Для ускорения обучения мы используем FlashAttention 2 (<a href="#_bookmark64">Dao et al., <a href="#_