Ай Дайджест

Свежая выжимка ml и AI статей - каждый день

Открытый Код: Рецепт для Создания Лучших Моделей Кода на Базе LLM

В современном мире разработки программного обеспечения большие языковые модели (LLM), специализирующиеся на обработке и генерации кода, становятся неотъемлемым инструментом. Они помогают в автоматизации процессов написания кода, анализа и даже в решении задач программирования. Однако, несмотря на прогресс в этой области, качество и доступность открытых кодовых LLM оставляют желать лучшего по сравнению с проприетарными моделями. Основной причиной этого является отсутствие прозрачности в обучающих данных и методах обучения, что ограничивает возможности для научных исследований и инноваций.

Чтобы устранить этот пробел, мы представляем OpenCoder — передовую модель LLM для кода, которая не только демонстрирует производительность, сравнимую с ведущими моделями, но и служит открытым "кулинарным рецептом" для исследовательского сообщества. Мы делимся не только весами модели и кодом для инференса, но и полностью воспроизводимым набором обучающих данных, детальным описанием процесса обработки данных, экспериментальными результатами и протоколами обучения.

Предобучение Данных

RefineCode

Для создания высококачественного набора данных для предобучения, мы разработали RefineCode — набор данных, состоящий из 960 миллиардов токенов, охватывающий 607 языков программирования. Этот набор данных включает в себя:

  • Сырой код: В основном собранный с GitHub до ноября 2023 года, с дополнительными данными из The Stack v2.
  • Веб-данные, связанные с кодом: Собранные из веб-корпуса, чтобы обеспечить контекст и разнообразие.

Обработка Сырого Кода

Процесс обработки включает в себя несколько этапов:

  1. Предобработка: Исключение файлов, превышающих 8 МБ, и ограничение выборки по типам файлов, связанных с программированием.

  2. Дедупликация: Использование как точного, так и нечеткого дедупликации для удаления дублирующихся документов.

    • Точная дедупликация: Удаление файлов с идентичным содержимым.
    • Нечеткая дедупликация: Удаление файлов с похожим содержимым, используя MinHash и LSH.
  3. Трансформация: Удаление копирайтов и замена персонально идентифицируемой информации (PII) на заглушки.

  4. Фильтрация: Применение эвристических правил для удаления низкокачественного кода и обеспечения разнообразия.

    • Общие правила фильтрации: Применяются ко всем файлам кода.
    • Специфические для языка правила: Разработаны для особенностей конкретных языков программирования.
  5. Выборка данных: Уменьшение объема данных для некоторых языков, чтобы сохранить баланс в наборе данных.

Веб-данные, связанные с кодом

Для обеспечения разнообразия и контекста, мы также собираем данные из веб-ресурсов:

  • Обучение FastText: Использование модели FastText для классификации веб-страниц на кодовые и не-кодовые.
  • Реколл из Common Crawl: Поиск и сбор веб-данных, связанных с кодом.
  • Аннотация доменов: Определение доменов, связанных с кодом, и аннотация URL-адресов.

Аннеалинг Данные

Аннеалинг — это фаза, в которой модель подвергается обучению на высококачественных данных для дальнейшего улучшения ее способностей. Набор данных для аннеалинга включает:

  • Исходное распределение данных: 84% данных из RefineCode для сохранения общего распределения.
  • Алгоритмический корпус: Данные, содержащие алгоритмическую логику, для улучшения понимания кодовых структур.
  • Синтетические данные: Высококачественные фрагменты кода и учебные материалы для расширения знаний модели.

Архитектура и Обучение Модели

Архитектура Модели

OpenCoder доступен в двух размерах:

  • OpenCoder-1.5B: 24 слоя, размер скрытого состояния 2240, 14 внимательных голов, поддержка контекстного окна в 4096 токенов.
  • OpenCoder-8B: Следует архитектуре Llama-3.1-8B, с 32 слоями, размером скрытого состояния 4096 и 8 внимательными головами.

Обе модели используют функцию активации SwiGLU и имеют словарный запас в 96 640 токенов.

Детали Обучения

Процесс обучения включает в себя:

  • Обучение на 2 триллионах токенов для модели 1.5B и 2.5 триллионах для модели 8B.
  • Аннеалинг на дополнительных 100 миллиардах токенов.
  • График обучения WSD: Использование графика обучения с разогревом на 2000 шагов, пиковая скорость обучения 3e-4, затем экспоненциальное затухание до 1e-5 во время аннеалинга.
  • Размеры батча: Микро-батч размером 4 и глобальный размер батча 1024.
  • Оптимизация и распределение: Использование Megatron-LM с распределенной оптимизацией и перекрытием градиентов DDP.

Постобучение

Составление Данных

Для улучшения обучения мы собираем инструкционные корпуса из различных источников:

  • Открытые обучающие данные: Инструкционные данные из веб-сайтов, включая Evol-Instruct, Infinity-Instruct и McEval.
  • Синтез инструкций: Создание вопросов и ответов на основе образцов кода для обучения модели на практических задачах.
  • Синтез инструкций, связанных с пакетами: Обучение модели на актуальном использовании библиотек и пакетов.

Двухэтапная Инструкция-Настройка

Для обеспечения высокой производительности как в теоретических, так и в практических задачах, мы используем двухэтапную стратегию инструкции-настройки:

  1. Первая стадия: Фокус на теоретических знаниях в области компьютерных наук, создание специализированного набора данных для понимания алгоритмов, структур данных и других концепций.

  2. Вторая стадия: Упор на практические задачи программирования, используя высококачественный код из GitHub для обучения модели на реальных примерах.

Экспериментальные Результаты

Оценка Базовых Моделей

Мы сравнили OpenCoder с другими открытыми и закрытыми моделями на ряде бенчмарков, таких как HumanEval, MBPP и BigCodeBench, демонстрируя превосходство в производительности.

Оценка Инструкционных Моделей

Для инструкционных моделей мы использовали бенчмарки, такие как LiveCodeBench и MultiPL-E, показывая, что OpenCoder способен эффективно работать с различными языками программирования и решать сложные задачи.

Анализ

Уровень Дедупликации

Мы провели анализ эффективности различных стратегий дедупликации, показав, что файловая дедупликация более эффективна, чем дедупликация на уровне репозитория, для поддержания разнообразия данных и улучшения производительности модели.

Важность Высококачественных Данных в Фазе Аннеалинга

Эксперименты показали, что использование высококачественных данных в фазе аннеалинга значительно улучшает производительность модели.

Влияние Звезд GitHub

Фильтрация данных на основе количества звезд на GitHub может снизить разнообразие данных и повлиять на общее распределение, что приводит к неоптимальным результатам.

Двухэтапная Стратегия Инструкции-Настройки

Двухэтапная стратегия инструкции-настройки доказала свою эффективность, позволяя модели приобретать широкие возможности на первой стадии и затем уточнять их на второй стадии, специализируясь на кодовых задачах.

Заключение и Будущие Работы

OpenCoder представляет собой важный шаг вперед в направлении открытых, прозрачных и высокопроизводительных моделей LLM для кода. Мы надеемся, что наша работа вдохновит и ускорит развитие сообщества открытых кодовых LLM, обеспечивая доступ к высококачественным инструментам для разработчиков и исследователей. В будущем мы планируем продолжать улучшать OpenCoder, обновляя модель и данные, чтобы она оставалась на передовой технологического прогресса и могла удовлетворять разнообразные потребности разработчиков по всему миру.