```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 могут достигать превосходной производительности кодирования, их размер делает их дорогими для развертывания. Меньшие модели, ориентированные на код ( , ; , ; , ; , ; , ) могут достигать превосходной производительности генерации кода в меньшем и более гибком пакете, но производительность в задачах кодирования, выходящих за рамки генерации (например, исправление и объяснение), может отставать от производительности генерации кода. 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,5 трлн против 7,5 трлн токенов). Помимо базовых моделей, дообученные на инструкциях варианты наших моделей 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 [ ](#_bookmark1) и под руководством юридической команды 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 [ ](#_bookmark6), StarCoderdata [ ](#_bookmark7) и дополнительных общедоступных репозиториев кода и выпусков с 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) вычисляем MinHash всех документов, а затем используем локальное чувствительное хэширование (LSH) для группировки документов на основе их MinHash-отпечатков, (2) измеряем сходство Jaccard между каждой парой документов в одном бакете и аннотируем документы, кроме одного, как дубликаты на основе порога сходства 0,7. Мы применяем этот процесс почти дедупликации ко всем языкам программирования, включая выпуски GitHub, для повышения богатства и разнообразия обучающего набора данных. 2.3 Фильтрация HAP, PII, вредоносного ПО Чтобы снизить вероятность генерации моделью ненавистнических, оскорбительных или нецензурных (HAP) выражений, мы прилагаем добросовестные усилия для фильтрации HAP-контента из обучающего набора. Сначала мы создаем словарь HAP-ключевых слов, а затем аннотируем каждый документ кода количеством вхождений таких ключевых слов в содержимом, включая комментарии. Мы фильтруем документы, которые превышают порог HAP, рассчитанный на основе распределительного анализа, а также ручной проверки файлов кода. Кроме того, для защиты конфиденциальности мы следуем StarCoder ( , ) и прилагаем добросовестные усилия для редактирования лично идентифицируемой информации (PII) из обучающего набора. В частности, мы используем модель StarPII [ ](#_bookmark8) для обнаружения 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 Архитектура модели Мы обучаем серию моделей кода различных размеров на основе декодерной архитектуры Transformer ( , ). Гиперпараметры модели для этих моделей приведены в таблице . Для всех архитектур моделей мы используем предварительную нормализацию ( , ): нормализация применяется ко входу блоков внимания и MLP. Vaswani et al. 2017 1 Xiong et al. 2020 : Самая маленькая модель в семействе моделей Granite-code обучается с использованием эмбеддингов RoPE ( , ) и многоголового внимания ( , ). Эта модель использует функцию активации 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, за исключением использования группированного внимания запросов (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,5–4,5 трлн токенов данных кода и наборов данных на естественном языке, связанных с кодом. Данные токенизируются с помощью попарного кодирования (BPE, ( , )), используя тот же токенизатор, что и StarCoder ( , ). Следуя ( , ; , ), мы используем высококачественные данные с двумя этапами обучения следующим образом. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : На этапе 1 модели 3B и 8B обучаются на 4 триллионах токенов данных кода, охватывающих 116 языков. Модель с 20 миллиардами параметров обучается на 3 триллионах токенов кода. Модель 34B обучается на 1,4 трлн токенов после увеличения глубины, которое выполняется на контрольной точке 1,6 трлн модели 20B. Этап 1 (обучение только коду) • : На этапе 2 мы включаем дополнительные общедоступные высококачественные данные из различных областей, включая технические, математические и веб-документы, для дальнейшего улучшения производительности модели в задачах рассуждения и решения проблем, которые необходимы для генерации кода. Мы обучаем все наши модели на 500 миллиардах токенов (80% кода и 20% языковых данных) на этапе 2. Этап 2 (обучение коду + языку) 4.2 Задача обучения Для обучения всех наших моделей мы используем задачу каузального языкового моделирования и задачу заполнения середины (FIM) ( , ). Задача FIM заключается в предсказании вставленных токенов с учетом заданного контекста и последующего текста. Мы обучаем наши модели работать как в режимах PSM (префикс-суффикс-середина) и SPM (суффикс-префикс-середина) с соответствующими токенами управления форматированием, как и StarCoder ( , ). Bavarian et al. 2022 Li et al. 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 с начальным линейным этапом разогрева из 2 тыс. итераций. Для предварительного обучения на этапе 2 мы начинаем с 3 10−4 (1,5 10−4 для моделей 20B и 34B) и применяем экспоненциальный график снижения, чтобы уменьшить его до 10% от начальной скорости обучения. Мы используем размер пакета от 4M до 5M токенов в зависимости от размера модели на обоих этапах предварительного обучения. Для ускорения обучения мы используем FlashAttention 2 ( , ; , ), постоянное ядро layernorm, объединенное ядро RMSNorm (в зависимости от модели) и объединенное ядро Adam, доступные в . Мы используем пользовательский форк Megatron-LM от NVIDIA ( , ; < Dao et al. 2022 Dao 2023 библиотеке NVIDIA Apex Shoeybi et al. 2019