Распределенная точная настройка модели BERT Large для задачи «Ответы на вопросы» с использованием трансформеров Hugging Face Transformers в Amazon SageMaker.

Исходный узел: 1885069

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

Благодаря своей библиотеке с открытым исходным кодом Transformers и платформе машинного обучения Hugging Face делает трансферное обучение и новейшие модели машинного обучения доступными для глобального сообщества ИИ, сокращая время, необходимое специалистам по данным и инженерам машинного обучения в компаниях по всему миру, чтобы воспользоваться преимуществами каждого нового научного исследования. продвижение.

Применение Transformers к новым задачам или областям НЛП требует точной настройки больших языковых моделей, метода, использующего накопленные знания предварительно обученных моделей для их адаптации к новой задаче или определенному типу документов в дополнительном эффективном процессе обучения.

Тонкая настройка модели для получения точных прогнозов для конкретной бизнес-задачи требует обучения больших моделей Transformers, например, BERT, BART, RoBERTa, T5, которые могут быть сложными для масштабируемого выполнения.

Hugging Face тесно сотрудничает с SageMaker, чтобы предоставить готовые к использованию контейнеры для глубокого обучения (DLC), которые делают обучение и развертывание новейших моделей Трансформеров проще и быстрее, чем когда-либо. Поскольку в контейнер интегрированы такие функции, как SageMaker Data Parallel (SMDP), SageMaker Model Parallel (SMMP), конвейерный режим S3, их использование значительно сокращает время, затрачиваемое компаниями на создание решений машинного обучения на основе Transformers, таких как ответы на вопросы, генерация текста и изображений, оптимизации результатов поиска и улучшения автоматизации поддержки клиентов, диалоговых интерфейсов, семантического поиска, анализа документов и многих других приложений.

В этом посте мы сосредоточимся на глубокой интеграции распределенных библиотек SageMaker с Hugging Face, которая позволяет специалистам по данным ускорить обучение и тонкую настройку моделей Transformers с нескольких дней до нескольких часов, и все это в SageMaker.

Обзор распределенного обучения

Практики машинного обучения и специалисты по данным сталкиваются с двумя проблемами масштабирования при обучении моделей: масштабирование размера модели (количество параметров и слоев) и масштабирование обучающих данных. Масштабирование либо размера модели, либо обучающих данных может привести к большей точности, но в глубоком обучении могут быть случаи, когда объем памяти на ускорителе (ЦП или ГП) ограничивает комбинацию размера обучающих данных и размера модель. Например, при обучении большой языковой модели размер пакета часто ограничивается небольшим количеством образцов, что может привести к менее точной модели.

Распределенное обучение может разделить рабочую нагрузку для обучения модели между несколькими процессорами, что называется рабочие. Эти работники работают параллельно, чтобы ускорить обучение модели.

В зависимости от того, что мы хотим масштабировать (модель или данные), существует два подхода к распределенному обучению: параллель данных и модель параллельно.

Параллельность данных — наиболее распространенный подход к распределенному обучению. Параллелизм данных влечет за собой создание копии архитектуры модели и весов на разных ускорителях. Затем вместо того, чтобы передавать всю обучающую выборку одному ускорителю, мы можем разделить обучающую выборку по разным ускорителям и быстрее проходить обучающую выборку. Хотя это добавляет этап, когда ускорителям необходимо передавать информацию о градиенте обратно на сервер параметров, это время с лихвой компенсируется ускорением итерации по части всего набора данных на ускоритель. Из-за этого параллелизм данных может значительно помочь сократить время обучения. Например, обучение одной модели без распараллеливания занимает 4 часа. Использование распределенного обучения может сократить это время до 24 минут. Распределенное обучение SageMaker также реализует передовые методы обновления градиентов.

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

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

Предпосылки

Для выполнения распределенного обучения моделей Hugging Face Transformers в SageMaker необходимо выполнить следующие предварительные условия:

Внедрить распределенное обучение

Библиотека Hugging Face Transformers предоставляет API-интерфейс Trainer, оптимизированный для обучения или точной настройки моделей, предоставляемых библиотекой. Вы также можете использовать его на своих собственных моделях, если они работают так же, как модели Transformers; видеть Trainer Больше подробностей. Этот API используется в нашем примеры скриптов, которые показывают, как предварительно обрабатывать данные для различных задач NLP, которые вы можете использовать в качестве моделей для написания сценария, решающего вашу собственную задачу. Преимущество Trainer API в том, что этот скрипт работает «из коробки» на любой распределенной установке, включая SageMaker.

Trainer API содержит все необходимое для обучения. Сюда входят ваши наборы данных, ваша модель (или функция, которая возвращает вашу модель), compute_metrics функция, которая возвращает метрики, которые вы хотите отслеживать, из массивов предикатов и меток, вашего оптимизатора и планировщика скорости обучения (предусмотрены хорошие значения по умолчанию), а также все гиперпараметры, которые вы можете настроить для своего обучения, сгруппированные в классе данных, называемом TrainingArguments. При всем этом он предоставляет три метода — обучение, оценка и прогнозирование — для обучения вашей модели, получения результатов метрик для любого набора данных или получения прогнозов для любого набора данных. Чтобы узнать больше об объекте Trainer, см. Тонкая настройка модели с помощью Trainer API и видео API тренера, который проведет вас через простой пример.

За кулисами Trainer API начинает с анализа среды, в которой вы запускаете свой скрипт при создании TrainingArguments. Например, если вы запустили обучение с помощью SageMaker, оно просматривает SM_FRAMEWORK_PARAMS в среде, чтобы определить, включен ли параллелизм данных SageMaker или параллелизм моделей. Затем он получает соответствующие переменные (такие как ранг процесса или размер мира) из среды перед выполнением необходимых шагов инициализации (таких как smdistributed.dataparallel.torch.distributed.init_process_group()).

Trainer содержит весь тренировочный цикл, поэтому он может настроить необходимые шаги, чтобы убедиться, что smdistributed.dataparallel backend используется при необходимости без необходимости изменять строку кода в вашем скрипте. Он по-прежнему может работать (хотя и намного медленнее) на вашем локальном компьютере для отладки. Он управляет сегментированием вашего набора данных таким образом, что каждый процесс автоматически видит разные выборки, с перетасовкой в ​​каждую эпоху, синхронизацией ваших градиентов перед шагом оптимизации, обучением смешанной точности, если вы его активировали, накоплением градиента, если вы не можете уместить большой размер пакета на ваши графические процессоры и многие другие оптимизации.

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

При использовании методов оценки и прогнозирования Trainer выполняет распределенную оценку, чтобы использовать преимущества всех ваших графических процессоров. Он правильно обрабатывает ваши данные для каждого процесса (процесс одного и того же dp_rank если параллелизм модели активирован) и гарантирует, что прогнозы правильно собраны в том же порядке, что и набор данных, который вы используете, прежде чем они будут отправлены в compute_metrics функция или только что вернулся. Использование Trainer API не является обязательным. Пользователи по-прежнему могут использовать Keras или PyTorch в Hugging Face. Однако Trainer API может предоставить полезный уровень абстракции.

Обучите модель с помощью SageMaker Hugging Face Estimators

Estimator — это высокоуровневый интерфейс для обучения SageMaker, который выполняет комплексные задачи обучения и развертывания SageMaker. Обучение вашего сценария вызывается, когда вы вызываете fit на HuggingFace Оценщик. В Estimator вы определяете, какой скрипт тонкой настройки использовать в качестве entry_point, который instance_type использовать и какие гиперпараметры передаются. HuggingFace параметры см. Оценщик объятий лица.

Распределенное обучение: параллельные данные

В этом примере мы используем новые DLC Hugging Face и SageMaker SDK для обучения распределенной модели Seq2Seq-трансформера задачам вопросов и ответов с использованием библиотек Transformers и наборов данных. bert-large-uncased-целое-слово-маскирование модель точно настроена на отряд набор данных.

В следующих примерах кода показаны этапы создания HuggingFace оценщик для распределенного обучения с параллелизмом данных.

  1. Выберите сценарий Hugging Face Transformers:
    # git configuration to download our fine-tuning script
    git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.6.1'}

Когда вы создаете HuggingFace Estimator можно указать сценарий обучения, хранящийся в репозитории GitHub, в качестве точки входа для Estimator, поэтому вам не нужно загружать сценарии локально. Вы можете использовать git_config для запуска примеров сценариев Hugging Face Transformers и правой «ветки», если ваш transformers_version необходимо настроить. Например, если вы используете transformers_version 4.6.1, вы должны использовать 'branch':'v4.6.1».

  1. Настройте гиперпараметры обучения, которые передаются в задание обучения:
    # hyperparameters, which are passed into the training job
    hyperparameters={ 'model_name_or_path': 'bert-large-uncased-whole-word-masking', 'dataset_name':'squad', 'do_train': True, 'do_eval': True, 'fp16': True, 'per_device_train_batch_size': 4, 'per_device_eval_batch_size': 4, 'num_train_epochs': 2, 'max_seq_length': 384, 'max_steps': 100, 'pad_to_max_length': True, 'doc_stride': 128, 'output_dir': '/opt/ml/model'
    }

В качестве гиперпараметра мы можем определить любой Seq2SeqTrainingАргументы и те, которые определены в сценарии обучения.

  1. Задайте параметры распределения в HuggingFace Оценщик:
    # configuration for running training on smdistributed Data Parallel
    distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}

Вы можете использовать Библиотека параллелизма данных SageMaker из коробки для распределенного обучения. Мы добавили функционал параллелизма данных прямо в Тренер. Чтобы включить параллелизм данных, вы можете просто добавить один параметр в свой HuggingFace Estimator, чтобы ваш код на основе Trainer использовал его автоматически.

  1. Создайте HuggingFace Оценщик, включающий параметры, определенные на предыдущих шагах, и начните обучение:
from sagemaker.huggingface import HuggingFace
# estimator
huggingface_estimator = HuggingFace(entry_point='run_qa.py', source_dir='./examples/pytorch/question-answering', git_config=git_config, instance_type= 'ml.p3.16xlarge', instance_count= 2, volume_size= 200, role= <SageMaker Role>, # IAM role, transformers_version='4.6', pytorch_version='1.7', py_version='py36', distribution= distribution, hyperparameters = hyperparameters) # starting the train job huggingface_estimator.fit()

Ассоциация Репозиторий Hugging Face Transformers содержит несколько примеров и скриптов для тонкой настройки моделей на задачах от языкового моделирования до классификации токенов. В нашем случае мы используем run_qa.py из examples/pytorch/question-answering примеры.

smdistributed.dataparallel поддерживает обучение модели в SageMaker с только следующие типы экземпляров. Для лучшей производительности мы рекомендуем использовать тип экземпляра, который поддерживает Эластичный тканевый адаптер (ОДВ):

  • мл.p3.16xбольшой
  • ml.p3dn.24xlarge (рекомендуется)
  • ml.p4d.24xlarge (рекомендуется)

Чтобы получить максимальную производительность и максимальную отдачу от SMDataParallel, вы должны использовать как минимум два экземпляра, но вы также можете использовать один для тестирования этого примера.

Следующие пример тетради содержит более подробные пошаговые инструкции.

Распределенное обучение: параллельная модель

Для распределенного обучения с модельным параллелизмом мы используем библиотеку Hugging Face Transformers и наборы данных вместе с SageMaker SDK для классификации последовательностей на Оценка общего понимания языка (КЛЕЙ) тест на кластере с несколькими узлами и несколькими графическими процессорами с использованием Библиотека параллелизма моделей SageMaker.

Как и в случае с параллелизмом данных, сначала мы устанавливаем конфигурацию git, гиперпараметры обучения и параметры распределения в HuggingFace Оценщик:

# git configuration to download our fine-tuning script
git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.6.1'} # hyperparameters, which are passed into the training job
hyperparameters={ 'model_name_or_path':'roberta-large', 'task_name': 'mnli', 'per_device_train_batch_size': 16, 'per_device_eval_batch_size': 16, 'do_train': True, 'do_eval': True, 'do_predict': True, 'num_train_epochs': 2, 'output_dir':'/opt/ml/model', 'max_steps': 500,
} # configuration for running training on smdistributed Model Parallel
mpi_options = { "enabled" : True, "processes_per_host" : 8,
}
smp_options = { "enabled":True, "parameters": { "microbatches": 4, "placement_strategy": "spread", "pipeline": "interleaved", "optimize": "speed", "partitions": 4, "ddp": True, }
} distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options
}

Библиотека параллелизма моделей внутренне использует MPI, поэтому для использования параллелизма моделей необходимо включить MPI с помощью параметра распределения. “processes_per_host” в предыдущем коде указывает количество процессов, которые MPI должен запускать на каждом хосте. Мы предлагаем их для разработки и тестирования. Во время производства вы можете обратиться в службу поддержки AWS, если вам требуется большая мощность графического процессора. Для получения дополнительной информации см. Запуск задания параллельного обучения распределенной модели SageMaker.

Следующие пример тетради содержит полные сценарии кода.

Точечные экземпляры

С расширением инфраструктуры Hugging Face для SageMaker Python SDK мы также можем воспользоваться преимуществами полностью управляемого Эластичное вычислительное облако Amazon (Амазон EC2) Точечные экземпляры и сэкономьте до 90% стоимости обучения.

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

Чтобы использовать спотовые инстансы с HuggingFace Оценщик, мы должны установить use_spot_instances значение True и определите свой max_wait и max_run время. Дополнительные сведения о жизненном цикле управляемого спотового обучения см. Управляемый спот-тренинг в Amazon SageMaker.

Ниже приведен фрагмент кода для настройки Estimator для точечного обучения:

from sagemaker.huggingface import HuggingFace # hyperparameters, which are passed into the training job
hyperparameters={'epochs': 1, 'train_batch_size': 32, 'model_name':'distilbert-base-uncased', 'output_dir':'/opt/ml/checkpoints' } # s3 uri where our checkpoints will be uploaded during training
job_name = "using-spot"
checkpoint_s3_uri = f's3://{sess.default_bucket()}/{job_name}/checkpoints' huggingface_estimator = HuggingFace(entry_point='train.py', source_dir='./scripts', instance_type='ml.p3.2xlarge', instance_count=1, base_job_name=job_name, checkpoint_s3_uri=checkpoint_s3_uri, use_spot_instances=True, max_wait=3600, # This should be equal to or greater than max_run in seconds' max_run=1000, # expected max run in seconds role=role, transformers_version='4.6', pytorch_version='1.7', py_version='py36', hyperparameters = hyperparameters)

Следующие ноутбук содержит полные сценарии кода.

Заключение

В этом посте мы обсудили распределенное обучение Hugging Face Transformers с помощью SageMaker. Сначала мы рассмотрели варианты использования параллелизма данных и параллелизма моделей. Параллелизм данных, как правило, более уместен, но не обязательно ограничен случаями, когда узким местом обучения являются вычислительные ресурсы, тогда как параллелизм моделей можно использовать, когда модель не помещается в памяти, предоставляемой одним ускорителем. Затем мы показали, как тренироваться обоими методами.

В рассмотренном нами случае использования параллелизма данных обучение модели на одном экземпляре p3.2xlarge (с одним графическим процессором) занимает 4 часа и стоит примерно 15 долларов на момент написания этой статьи. Благодаря параллелизму данных мы можем обучить ту же модель за 24 минуты по цене 28 долларов. Хотя стоимость удвоилась, время обучения сократилось в 10 раз. В ситуации, когда вам нужно обучить множество моделей за короткий период времени, параллелизм данных может обеспечить это при относительно небольшом увеличении затрат. Что касается варианта использования параллелизма моделей, он добавляет возможность обучать модели, которые ранее вообще не могли быть обучены из-за аппаратных ограничений. Обе функции открывают новые рабочие процессы для специалистов по машинному обучению и легко доступны через HuggingFace Estimator как часть SageMaker Python SDK. Развертывание этих моделей на размещенных конечных точках выполняется по той же процедуре, что и для других Estimators.

Эта интеграция включает другие функции, которые являются частью экосистемы SageMaker. Например, вы можете использовать спотовые инстансы, добавив простой флаг в Estimator для дополнительной оптимизации затрат. В качестве следующего шага вы можете найти и запустить обучающая демонстрация и пример тетради.


Об авторах

Арчис Йоглекар является архитектором партнерских решений AI / ML в команде Emerging Technologies. Он интересуется производительным, масштабируемым глубоким обучением и научными вычислениями с использованием строительных блоков AWS. Его прошлый опыт варьируется от исследований вычислительной физики до разработки платформ машинного обучения в академических кругах, национальных лабораториях и стартапах. Вне компьютера он проводит время за игрой в футбол, с друзьями и семьей.

Джеймс Йи является старшим архитектором партнерских решений AI/ML в команде Emerging Technologies в Amazon Web Services. Он увлечен работой с корпоративными клиентами и партнерами над проектированием, развертыванием и масштабированием приложений AI/ML для получения их бизнес-ценности. Вне работы он любит играть в футбол, путешествовать и проводить время со своей семьей.

Филипп Шмид является инженером по машинному обучению и техническим руководителем в Hugging Face, где он руководит сотрудничеством с командой Amazon SageMaker. Он увлечен демократизацией, оптимизацией и производством передовых моделей NLP, а также упрощением использования Deep Learning.

Сильвен Гуггер является инженером-исследователем в Hugging Face и одним из основных сопровождающих библиотеки Transformers. Он любит программное обеспечение с открытым исходным кодом и помогает сообществу использовать его.

Джефф Будье создает продукты в Hugging Face, создателе Transformers, ведущей библиотеки машинного обучения с открытым исходным кодом. Ранее Джефф был соучредителем Stupeflix, приобретенной GoPro, где он занимал должность директора по управлению продуктами, маркетингу продуктов, развитию бизнеса и корпоративному развитию.

Источник: https://aws.amazon.com/blogs/machine-learning/distributed-fine-tuning-of-a-bert-large-model-for-a-question-answering-task-using-hugging-face- трансформеры-на-амазонке-sagemaker/

Отметка времени:

Больше от Блог машинного обучения AWS