Сочетание экономии и точности Экономичное обучение моделей GPT NeoX и Pythia с использованием AWS Trainium

Экономичное обучение моделей GPT NeoX и Pythia сочетание экономии и точности с использованием AWS Trainium

Большие языковые модели (или LLM) стали темой ежедневных разговоров. Быстрое принятие их показано количеством времени, необходимым для достижения 100 миллионов пользователей, которое сократилось с “4,5 лет у Facebook” до исторического минимума в “всего 2 месяца у ChatGPT”. Генеративный предварительно обученный трансформер (GPT) использует причинно-обратное обновление для прогнозирования. Эти архитектуры моделей демонстрируют потрясающую производительность в таких задачах, как распознавание речи, генерация текста и ответы на вопросы. Несколько последних моделей, таких как NeoX, Falcon, Llama, используют архитектуру GPT в качестве основы. Обучение LLM требует колоссального количества времени вычислений, что обходится миллионами долларов. В этом посте мы рассмотрим процедуру обучения GPT NeoX на AWS Trainium, специализированном ускорителе машинного обучения (ML), оптимизированном для обучения глубокого обучения. Мы опишем, как эффективно (3,2 млн токенов/$) обучали такие модели с AWS Trainium, не потеряв при этом качество моделей.

Обзор решения

Модели GPT NeoX и Pythia

GPT NeoX и Pythia – это открытые причинно-следственные языковые модели от Eleuther-AI с примерно 20 миллиардами параметров в NeoX и 6,9 миллиарда в Pythia. Оба являются декодерными моделями, следуя подобному архитектурному дизайну, как Chat GPT3. Однако в них также есть несколько дополнений, которые также широко применяются в последних моделях, таких как Llama. Особенно они имеют вращающуюся позиционную эмбеддинг (ROPE) с частичным вращением по измерениям заголовка. Исходные модели (NeoX и Pythia 6.9B) обучаются на доступном открытом наборе данных Pile с удалением дубликатов и использованием бэкэнда Megatron и Deepspeed.

Мы демонстрируем предварительное обучение и дообучение этих моделей на базе экземпляров Trn1, основанных на AWS Trainium, с использованием библиотеки Neuron NeMo. Чтобы создать доказательство концепции и осуществить быстрое воспроизведение, мы будем использовать небольшой набор данных из Википедии, токенизированный с использованием GPT2 метода кодирования с использованием байт-парных энкодеров.

Прохождение

Загрузите предварительно токенизированный набор данных из Википедии, как показано ниже:

export DATA_DIR=~/examples_datasets/gpt2mkdir -p ${DATA_DIR} && cd ${DATA_DIR}wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.jsonwget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txtaws s3 cp s3://neuron-s3/training_datasets/gpt/wikipedia/my-gpt2_text_document.bin . --no-sign-requestaws s3 cp s3://neuron-s3/training_datasets/gpt/wikipedia/my-gpt2_text_document.idx . --no-sign-requestaws s3 cp s3://neuron-s3/training_datasets/gpt/wikipedia/license.txt . --no-sign-request

Как для NeoX 20B, так и для Pythia 6.9B используется ROPE с частичным вращением, например, вращение 25% измерений заголовка и сохранение остальных без вращения. Чтобы эффективно реализовать частичное вращение на ускорителе AWS Trainium, вместо объединения вращающихся и невращающихся измерений, мы добавляем нулевые частоты для невращающихся измерений, а затем вращаем полный набор измерений заголовка. Этот простой трюк позволил нам увеличить пропускную способность (обработка последовательностей в секунду) на AWS Trainium.

Шаги обучения

Для запуска обучения мы используем кластер Trn1, управляемый SLURM, в многоузловой среде вычислительного облака Amazon Elastic Compute Cloud (Amazon EC2), где каждый узел содержит экземпляр trn1.32xl. Каждый экземпляр trn1.32xl имеет 16 ускорителей с двумя рабочими процессами на ускоритель. После загрузки последнего пакета Neuron NeMo используйте предоставленные сценарии предварительного обучения и донастройки neox и pythia с оптимизированными гиперпараметрами и выполните следующее для обучения на четырех узлах.

  1. Компиляция: Предварительная компиляция модели с тремя итерациями обучения для генерации и сохранения графов:

    sbatch --nodes 4 compile.slurm ./neoX_20B_slurm.sh
  2. Запуск: Выполнение обучения путем загрузки сохраненных графов из первых шагов

    sbatch --nodes 4 run.slurm ./neoX_20B_slurm.sh
  3. Мониторинг результатов

    tensorboard --logdir=nemo_experiments/megatron_neox

Те же шаги необходимо выполнить для запуска модели Pythia 6.9B путем замены neox_20B_slurm.sh на pythia_6.9B_slurm.sh.

Эксперименты по предварительному обучению и донастройке

Мы продемонстрируем предварительное обучение моделей GPT-NeoX и Pythia на AWS Trainium с использованием библиотеки Neuron NeMo в течение 10 тысяч итераций, а также покажем донастройку этих моделей на 1 тысячу шагов. Для предварительного обучения мы используем токенизатор BPE GPT2 внутри NeMo и следуем той же конфигурации, что и в оригинальной модели. Для донастройки на AWS Trainium требуется изменение нескольких параметров (например, коэффициента деления размера словаря), которые предоставляются в сценариях донастройки для учета различий между Megatron и NeMo и изменений GPU и AWS Trainium. Многозадачное распределенное обучение с различным числом узлов показано в таблице-1.

Модель Тензорное параллелизм Параллельное конвейерирование Количество экземпляров Стоимость ($/час) Длина последовательности Глобальный размер пакета Производительность (посл./сек) Соотношение стоимости и производительности (токены/$)
Pythia 6.9B 8 1 1 7.59 2048 256 10.4 10,102,387
8 1 4 30.36 2048 256 35.8 8,693,881
NeoX 20B 8 4 4 30.36 2048 16384 13.60 3,302,704
8 4 8 60.72 2048 16384 26.80 3,254,134
8 4 16 121.44 2048 16384 54.30 3,296,632
8 4 32 242.88 2048 16384 107.50 3,263,241
8 4 64 485.76 2048 16384 212.00 3,217,708

Таблица 1. Сравнение средней производительности моделей GPT NeoX и Pythia на обучении до 500 шагов с изменением количества узлов. Ценообразование для trn1.32xl основано на 3-летней зарезервированной эффективной ставке в час.

Далее мы также оцениваем траекторию потерь обучения модели на оборудовании AWS Trainium и сравниваем ее с соответствующим запуском на кластере P4d (ядра Nvidia A100 GPU). Вместе с потерями обучения мы также сравниваем полезные показатели, такие как норма градиента, которая представляет собой 2-норму градиентов модели, рассчитываемых на каждой итерации обучения для отслеживания хода обучения. Результаты обучения показаны на рисунках 1, 2 и донастройка NeoX 20B на рисунке 3.

Training loss averaged across all workers (left) and gradient norm (right) at training each step.

Рисунок 1. Потери обучения, усредненные по всем работникам (слева) и норма градиента (справа) на каждом шаге обучения. Модель NeoX 20B обучается на 4 узлах с небольшим набором данных Википедии на графическом процессоре и Trainium с теми же гиперпараметрами обучения (глобальный размер пакета = 256). Графический процессор использует BF16 и стандартное смешанное представление (mixed-precision), в то время как AWS Trainium использует полный BF16 с стохастическим округлением. Графики потерь и нормы градиента совпадают для графического процессора и AWS Trainium.

Training loss averaged across all workers (left) and gradient norm (right) at training each step (Pythia).

Рисунок 2. Потери обучения, усредненные по всем работникам (слева) и норма градиента (справа) на каждом шаге обучения. Как и в случае с GPT NeoX на рисунке 1, модель Pythia 6.9B обучается на 4 узлах с небольшим набором данных Википедии на графическом процессоре и Trainium с теми же гиперпараметрами обучения (глобальный размер пакета = 256). Графики потерь и нормы градиента совпадают для графического процессора и AWS Trainium.

Fine-tuning GPT NeoX 20B model on GPU and AWS Trainium with training loss averaged across all workers (left) and gradient norm (right).

Рисунок 3. Доведение модели GPT NeoX 20B до итогового состояния на графическом процессоре и AWS Trainium с усредненными по всем работникам потерями обучения (слева) и нормой градиента (справа). Для демонстрации доведения использован небольшой набор данных Википедии. Графики потерь и нормы градиента совпадают для графического процессора и AWS Trainium.

В этой статье мы показали эффективное с точки зрения затрат обучение LLM на оборудовании глубокого обучения AWS. Мы обучили модели GPT NeoX 20B и Pythia 6.9B на Trn1 от AWS с использованием библиотеки NeMo Neuron. Нормализованная по стоимости производительность для 20 миллиардов моделей с использованием AWS Trainium составляет около 3.2M токенов/$. Вместе с экономичным обучением на AWS Trainium мы получаем схожую точность модели, что подтверждается потерями на каждом шаге обучения и траекторией нормы градиента. Мы также доводим доступные контрольные точки для модели NeoX 20B на AWS Trainium. Для получения дополнительной информации о распределенном обучении с помощью NeMo Megatron на AWS Trainium см. Ссылку AWS Neuron для NeMo Megatron. Хороший ресурс для начала доведения модели Llama может быть найден здесь, Llama2 доведение. Для начала работы с управляемым AWS Trainium на Amazon SageMaker см. Обучайте ваши модели машинного обучения с AWS Trainium и Amazon SageMaker.