Розподілене тонке налаштування моделі BERT Large для завдання на запитання-відповідь за допомогою трансформаторів Hugging Face Transformers на Amazon SageMaker

Вихідний вузол: 1885069

Від навчання нових моделей до впровадження їх у виробництво, Amazon SageMaker пропонує найповніший набір інструментів для стартапів і підприємств для використання можливостей машинного навчання (ML) і глибокого навчання.

Завдяки своїй бібліотеці з відкритим кодом Transformers і платформі ML Hugging Face робить навчання з передачі та новітні моделі ML доступними для глобальної спільноти AI, скорочуючи час, необхідний науковцям з даних та інженерам з ML у компаніях по всьому світу, щоб скористатися всіма новими науковими можливостями. просування.

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

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

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

У цій публікації ми зосереджуємось на глибокій інтеграції розподілених бібліотек SageMaker з Hugging Face, що дає змогу науковцям з даних прискорювати навчання та тонке налаштування моделей Transformers від днів до годин, і все це в SageMaker.

Огляд розподіленого навчання

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

Розподілене навчання може розділити робоче навантаження для навчання моделі між кількома процесорами, що називається робочі. Ці працівники працюють паралельно, щоб прискорити навчання моделі.

На основі того, що ми хочемо масштабувати (модель чи дані), існує два підходи до розподіленого навчання: паралельні дані і паралельні моделі.

Паралель даних є найпоширенішим підходом до розподіленого навчання. Паралелізм даних тягне за собою створення копії архітектури моделі та ваг на різних прискорювачах. Тоді замість того, щоб передавати весь навчальний набір до одного прискорювача, ми можемо розділити навчальний набір між різними прискорювачами і швидше пройти навчальний набір. Хоча це додає прискорювачів необхідність передавати інформацію про градієнт назад на сервер параметрів, цей час більш ніж компенсується збільшенням швидкості ітерації над часткою всього набору даних на прискорювач. Через це паралелізм даних може значно скоротити час навчання. Наприклад, навчання однієї моделі без розпаралелювання займає 4 години. Використання розподіленого навчання може скоротити це до 24 хвилин. Розподілене навчання SageMaker також реалізує передові методи в оновленнях градієнтів.

Паралельний підхід моделі використовується з великими моделями, занадто великими, щоб поміститися на одному прискорювачі (GPU). Цей підхід реалізує стратегію паралелізації, коли архітектура моделі ділиться на сегменти та розміщується на різних прискорювачах. Конфігурація кожного з цих сегментів залежить від архітектури нейронної мережі і зазвичай включає кілька шарів. Зв’язок між прискорювачами відбувається щоразу, коли навчальні дані переходять від одного з шардів до наступного.

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

Передумови

Щоб виконати розподілене навчання моделей Hugging Face Transformers у SageMaker, потрібно виконати наступні умови:

Запровадити розподілене навчання

Бібліотека Hugging Face Transformers надає API Trainer, оптимізований для навчання або тонкого налаштування моделей, які надає бібліотека. Ви також можете використовувати його на власних моделях, якщо вони працюють так само, як моделі трансформаторів; побачити тренер для більш детальної інформації. Цей API використовується в нашому приклади скриптів, які показують, як попередньо обробляти дані для різних завдань НЛП, які ви можете використовувати як моделі для написання сценарію, що вирішує вашу власну проблему. Обіцянка Trainer API полягає в тому, що цей скрипт працює з коробки на будь-якій розподіленій установці, включаючи SageMaker.

API Trainer приймає все необхідне для навчання. Це включає ваші набори даних, вашу модель (або функцію, яка повертає вашу модель), а compute_metrics функція, яка повертає показники, які ви хочете відстежувати з масивів прогнозів і міток, вашого оптимізатора і планувальника швидкості навчання (надаються хороші значення за замовчуванням), а також усі гіперпараметри, які ви можете налаштувати для свого навчання, згруповані в клас даних, що називається TrainingArguments. З усім цим він надає три методи — тренувати, оцінювати та прогнозувати — щоб навчити вашу модель, отримати результати метрики для будь-якого набору даних або отримати прогнози для будь-якого набору даних. Щоб дізнатися більше про об’єкт Trainer, див Точне налаштування моделі за допомогою Trainer API і відео API тренера, який проведе вас через простий приклад.

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

Тренажер містить весь цикл навчання, тому він може налаштувати необхідні кроки, щоб переконатися в цьому smdistributed.dataparallel backend використовується, коли це необхідно, без необхідності змінювати рядок коду у вашому сценарії. Він все ще може працювати (хоча набагато повільніше) на вашій локальній машині для налагодження. Він обробляє розділення вашого набору даних таким чином, що кожен процес автоматично бачить різні зразки з перестановкою в кожну епоху, синхронізуючи ваші градієнти перед кроком оптимізації, змішане тренування точності, якщо ви його активували, накопичення градієнта, якщо ви не можете вмістити велику партію на ваші графічні процесори та багато інших оптимізацій.

Якщо ви активували паралелізм моделі, це гарантує, що процеси, які мають бачити ті самі дані (якщо їх dp_rank однаково) отримують однакові партії, а процеси з різними dp_rank не бачу тих самих зразків, знову ж таки з перестановкою в кожну епоху. Він гарантує, що словники стану моделі або оптимізаторів належним чином синхронізовані під час встановлення контрольних точок, і знову обробляє всі оптимізації, такі як змішана точність і накопичення градієнта.

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

Навчайте модель за допомогою інструментів оцінки обличчя SageMaker Hugging Face

Estimator — це інтерфейс високого рівня для навчання SageMaker, який обробляє наскрізні завдання навчання та розгортання SageMaker. Навчання вашого сценарію викликається, коли ви викликаєте fit на HuggingFace Оцінювач. У інструменті оцінки ви визначаєте, який сценарій тонкого налаштування використовувати як entry_point, Яка instance_type для використання та які гіперпараметри передаються. Щоб отримати додаткові відомості про HuggingFace параметри див Обіймає Face Estimator.

Розподілене навчання: Паралель даних

У цьому прикладі ми використовуємо нові DLC Hugging Face та SageMaker SDK для навчання розподіленої моделі Seq2Seq-трансформатора задачі запитання та відповіді за допомогою бібліотек Transformers та наборів даних. The bert-large-ucased-whole-word-masking модель точно налаштована на загін набір даних.

У наведених нижче прикладах коду показано кроки створення a HuggingFace оцінювач для розподіленого навчання з паралелізмом даних.

  1. Виберіть сценарій Transformers Hugging Face:
    # 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'
    }

Як гіперпараметр ми можемо визначити будь-який Seq2SeqTrainingArguments і ті, що визначені в сценарії навчання.

  1. Визначте параметри розподілу в HuggingFace Оцінювач:
    # configuration for running training on smdistributed Data Parallel
    distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}

Ви можете використовувати Бібліотека паралелізму даних SageMaker з коробки для розподіленого навчання. Ми додали функціональність паралелізму даних безпосередньо в трейнер. Щоб увімкнути паралелізм даних, ви можете просто додати один параметр до свого HuggingFace Оцінювач, щоб дозволити вашому коду на основі 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 з лише наступні типи екземплярів. Для найкращої продуктивності ми рекомендуємо використовувати тип екземпляра, який підтримує Адаптер з еластичної тканини (EFA):

  • ml.p3.16xlarge
  • ml.p3dn.24xlarge (рекомендовано)
  • ml.p4d.24xlarge (рекомендовано)

Щоб отримати найкращу продуктивність і максимальну віддачу SMDataParallel, ви повинні використовувати принаймні два екземпляри, але ви також можете використовувати один для перевірки цього прикладу.

Наступні приклад блокнота надає докладнішу покрокову інструкцію.

Розподілене навчання: Паралель моделі

Для розподіленого навчання з паралельністю моделі ми використовуємо бібліотеку Hugging Face Transformers і наборів даних разом із SageMaker SDK для класифікації послідовності на Загальна оцінка розуміння мови (GLUE) тест на багатовузловому кластері з кількома графічними процесорами за допомогою Бібліотека паралелізму моделі 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 Elastic (Amazon EC2) Точкові екземпляри і заощадити до 90% наших витрат на навчання.

Якщо ваша навчальна робота не завершиться швидко, ми рекомендуємо вам використовувати контрольний пункт з керованим точковим тренуванням, тому вам потрібно визначити checkpoint_s3_uri.

Щоб використовувати спотові екземпляри з HuggingFace Оцінювач, ми повинні встановити use_spot_instances для параметра True і визначте свій max_wait та max_run час. Додаткову інформацію про життєвий цикл керованого спотового навчання див Керований точковий тренінг в Amazon SageMaker.

Нижче наведено фрагмент коду для налаштування оцінювача точкового навчання:

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 разів. Для ситуації, коли вам потрібно навчити багато моделей протягом короткого періоду часу, паралелізм даних може дозволити це зробити при відносно низькому збільшенні вартості. Що стосується випадку використання паралельності моделей, він додає можливість тренувати моделі, які раніше взагалі не могли бути навчені через апаратні обмеження. Обидві функції забезпечують нові робочі процеси для практиків ML, і вони легко доступні через HuggingFace Оцінювач як частина SageMaker Python SDK. Розгортання цих моделей на розміщених кінцевих точках виконується за такою ж процедурою, як і для інших Оцінювачів.

Ця інтеграція включає інші функції, які є частиною екосистеми SageMaker. Наприклад, ви можете використовувати спотові екземпляри, додавши простий прапорець до оцінювача для додаткової оптимізації витрат. Як наступний крок, ви можете знайти та запустити файл навчальна демонстрація та приклад блокнота.


Про авторів

Архіс Йоглекар є архітектором партнерських рішень AI/ML у команді Emerging Technologies. Його цікавлять продуктивне, масштабоване глибоке навчання та наукові обчислення з використанням будівельних блоків AWS. Його минулий досвід варіюється від досліджень комп’ютерної фізики до розробки платформ машинного навчання в наукових колах, національних лабораторіях і стартапах. Свій час поза комп’ютером проводить за футболом, з друзями та родиною.

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

Філіп Шмід є інженером з машинного навчання та технічним керівником Hugging Face, де він керує співпраці з командою Amazon SageMaker. Він захоплений демократизацією, оптимізацією та виробництвом передових моделей НЛП та покращенням простоти використання для глибокого навчання.

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

Джефф Буд'є створює продукти в Hugging Face, творці Transformers, провідної бібліотеки ML з відкритим вихідним кодом. Раніше Джефф був співзасновником 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- transformers-on-amazon-sagemaker/

Часова мітка:

Більше від Блог машинного навчання AWS