В последние годы технологии искусственного интеллекта стремительно развиваются, и одним из ключевых элементов этой эволюции стали большие языковые модели (LLM), такие как GPT-2. Созданная OpenAI в 2019 году, модель GPT-2 с 124 миллионами параметров стала первой публично доступной современной архитектурой трансформера, которая задала планку для будущих разработок. Однако обучение подобных моделей традиционно требует больших вычислительных ресурсов и значительных затрат. К счастью, новая реализация под названием llm.c от Андрея Карпацкого позволяет воспроизвести GPT-2 124M за крайне короткое время и относительно небольшие деньги, открывая дверь для энтузиастов и исследователей с ограниченным бюджетом.
Llm.c представляет собой полностью написанный на C и CUDA эффективный тренажер трансформеров, который оптимизирован для максимально комфортной работы с GPU, в частности с NVIDIA A100. Главным преимуществом проекта является высокая эффективность использования вычислительных ресурсов - примерно 60% от максимального потенциала флопсов модели, что исключает излишне длительные и дорогостоящие тренировки. Процесс воспроизведения GPT-2 (124M) в llm.c занимает порядка 90 минут на одном GPU-сервере с восьмью графическими процессорами A100 80GB SXM.
Стоимость подобных машин, например на Lambda Labs, составляет примерно 14 долларов в час, что вместе с затратами времени приводит к общему бюджету около 20 долларов. Такой показатель уникален для подобных проектов и делает обучение GPT-2 доступным не только для крупномасштабных организаций, но и для отдельного пользователя или маленькой команды. Основой для тренировки служит корпус FineWeb, который используется в размере 10 миллиардов токенов. FineWeb по своим характеристикам напоминает классические выборки Common Crawl, что позволяет модели адаптироваться к реальным задачам обработки естественных языков. Благодаря особенностям архива, в частности длине контекста в 1024 токена и тщательно подобранным параметрам обучения, итоговый результат не только соответствует оригинальному GPT-2, но и превосходит его в ряде метрик, таких как HellaSwag - стандартном бенчмарке для оценки навыков понимания текстов моделями.
На практике запуск и настройка тренировки начинается с установки необходимых компонентов на Linux-системе с поддержкой CUDA 12.0 и выше. Важным инструментом в процессе является Miniconda, который облегчает организацию окружения для Python-скриптов, необходимых для подготовки данных и токенизации корпуса. Следующим критическим этапом является подготовка и токенизация корпуса FineWeb при помощи скриптов из репозитория llm.c.
Токенизация представляет собой преобразование текста в целочисленные коды на основе GPT-2 токенизатора, что значительно ускоряет последующую обработку и обучение модели. Компиляция самого llm.c - достаточно быстрая операция примерно на одну минуту, при этом она включает в себя оптимизации с использованием cuDNN и FlashAttention, которые положительно влияют на производительность и общие характеристики тренировки. Для обучения доступна гибкая настройка параметров, в том числе размеры микробатчей, длина последовательности, режимы оптимизации и величина шага обучения. Среди них особое внимание уделяется параметру recompute, который отвечает за пересчет активаций GeLU в обратном проходе и позволяет значительно экономить память, повышая тем самым итоговую пропускную способность модели.
Особенную роль играет механика шардирования оптимизатора (ZeRO-1), которая настраивается через флаг и особенно полезна для многогруппового обучения с несколькими GPU. В режиме одного GPU она не оказывает влияния, но при масштабировании на несколько устройств позволяет уменьшить объем используемой в памяти информации, оптимизируя вычислительные ресурсы. Стоит упомянуть, что llm.c - это проект с открытым исходным кодом, разработанный преимущественно на C и CUDA. Благодаря такому подходу достигается высокая скорость и близость к аппаратным ресурсам по сравнению с аналогичными системами, написанными на языках высокого уровня.
Основная часть кода сосредоточена в файле train_gpt2.cu, где реализованы как прямой, так и обратный проходы всех слоев трансформера, включая CUDA-ядра для операций с матрицами и активациями. Важным отличием llm.c от других реализаций является акцент на воспроизводимость и компактность кода, что сильно облегчает понимание и адаптацию проекта под нужды пользователя. Документация содержит подробный разбор параметров запуска, что помогает быстро стартовать и добиться успешной тренировки без глубоких знаний в CUDA-программировании.
Кроме того, сообщество активно развивается и обсуждает текущие вопросы в GitHub Discussions, а также в Discord-каналах, что создает комфортные условия для совместной работы и обмена опытом. Пользователи делятся собственными результатами, размещают советы по оптимизации, а также варианты обучения модели на различных GPU, от мощных A100 до более скромных 3090 и AMD GPU. Интересен и подход к генерации текста на базе обученной модели. Пока что llm.c не предлагает полноценного режима инференса с кешированием ключей и значений (KV-кэш), поэтому генерация идет несколько медленнее, чем в других системах.
Однако при некотором хакерском вмешательстве возможно достижение приемлемого результата, в том числе для условных генераций и дополнений текстов. Текущие ограничения включают отсутствие полноценного режима чата, отказ от Dropout для упрощения обучения, а также фокусировку на bf16 и fp16 форматах вычислений без активной поддержки fp8. При этом разработчики анонсируют планы по расширению возможностей и поддержке многомашинного обучения, что значительно повысит масштабируемость и практичность llm.c. Подводя итоги, проект llm.
c предоставляет уникальную возможность воспроизвести классическую модель GPT-2 с 124 миллионами параметров на современном оборудовании с минимальными усилиями и затратами. Это значительный шаг в демократизации технологий искусственного интеллекта, позволяющий широкому кругу специалистов и исследователей познакомиться с архитектурой трансформеров, реализовать стендовый эксперимент и глубже понять ключевые принципы обучения LLM. Для тех, кто хочет освоить тонкости работы с llm.c и GPT-2, рекомендовано изучить официальный репозиторий на GitHub, ознакомиться с необходимыми зависимостями, правильно подготовить и токенизировать корпус данных, а затем запустить тренинг с оптимальными параметрами. Успешная тренировка откроет двери для проведения качественного анализа, улучшения модели, а также даст возможность экспериментировать с более крупными архитектурами и разнообразными корпусами текста.
Таким образом, сочетание эффективной реализации, доступной стоимости и краткого времени обучения делает воспроизведение GPT-2 124M в llm.c настоящей находкой для всех, кто заинтересован в современных технологиях обработки естественного языка и хочет окунуться в мир больших языковых моделей своими силами. .