Навчання гігантських моделей із майже лінійним масштабуванням за допомогою фрагментованого паралелізму даних на Amazon SageMaker

У гонитві за винятковою точністю моделі глибокого навчання в таких сферах, як обробка природної мови та комп’ютерне зір, за останні кілька років значно зросли в розмірах, часто обчислюючись у десятках-сотнях мільярдів параметрів. Навчання цих гігантських моделей є складним завданням і вимагає складних стратегій розподілу. Вчені з обробки даних та інженери з машинного навчання постійно шукають найкращий спосіб оптимізувати свої навчальні обчислення, але при цьому мають проблеми з накладними витратами на зв’язок, які можуть збільшуватися разом із загальним розміром кластера.

Ось чому ми нещодавно запустили sжорсткий паралелізм даних on Amazon SageMaker, нова методика розподіленого навчання для збереження пам’яті в Бібліотека паралельної моделі (SMP) SageMaker. Паралелізм сегментованих даних розроблено спеціально для моделей екстремального масштабу та використовує власні ресурси Amazon MiCS технологія під капотом, наукова спроба мінімізувати масштаб зв’язку шляхом зниження дорогих накладних витрат на зв’язок, які ґрунтуються на зборі параметрів і градієнтній синхронізації. Завдяки моделі GPT-30 із параметрами 2B і довжиною послідовності 2048 ця нова функція досягла 141 TFLOPs, що на 39.7% вище в порівнянні з DeepSpeed ​​ZeRO-3. Для моделі 10B GPT-2 із довжиною послідовності 512 ця нова функція також досягла 564 зразків за секунду, що на 13.9% швидше порівняно з Fully Sharded Data Parallel (FSDP) PyTorch. Пам’ятайте, що під час навчання гігантської моделі кожен відсоток прискорення перетворюється на економію доларів і підвищення продуктивності у вашій команді.

У цій публікації блогу ми спочатку детальніше розглянемо ключові відмінності паралелізму сегментованих даних і коли його використовувати. Потім ви дізнаєтеся, як легко навчити модель GPT-30 із параметрами 2B на SageMaker за допомогою цієї нової функції. Нарешті ми порівняємо продуктивність з іншими опціями з відкритим кодом, особливо перевершуючи DeepSpeed ​​ZeRO на 39.7% на 256 графічних процесорах.

Як працює паралелізм сегментованих даних і коли його використовувати

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

У існуючих фреймворках, які підпадають під цю парадигму, зокрема DeepSpeed ​​ZeRO-3 і FSDP PyTorch, переданий FairScale, стани моделі розбиті по всі Графічні процесори, стратегія, яка зменшує споживання пам’яті на кожному графічному процесорі ціною великих накладних витрат на зв’язок, які збільшуються разом із розміром кластера, а отже, спричиняє значне зниження масштабованості в масштабі. Навпаки, паралелізм сегментованих даних у моделі розділів бібліотеки SMP зазначає a з урахуванням масштабу шляхом розділення кожної копії станів моделі лише всередині підмножина графічних процесорів.

Давайте розглянемо ближче поділ моделі з урахуванням масштабу у MiCS, основній технології, що лежить в основі паралельної обробки сегментованих даних. Інтуїція, що лежить в основі цього дизайну, полягає в тому, що для навчання моделі з десятками мільярдів параметрів може не знадобитися розподіл станів навчання по всій групі паралельних даних. Наприклад, 8 графічних процесорів V100 (по 32 ГБ кожен) достатньо для зберігання копії станів моделі моделі з 10 В-параметрами, яка потребує приблизно 200 ГБ пам’яті під час навчання за допомогою оптимізатора Adam із використанням змішаної точності. Обмежуючи повну копію станів моделі в найменший підмножини графічних процесорів, ми можемо ефективно зменшити масштаб комунікаційних витрат порівняно з DeepSpeed ​​і PyTorch FSDP. Паралельний доступ до сегментованих даних також використовує інші методи в MiCS, такі як ієрархічна комунікація та 2-hop градієнтна синхронізація. Для отримання додаткової інформації перевірте Майже лінійне масштабування навчання гігантської моделі на AWS or MiCS: майже лінійне масштабування для навчання гігантської моделі в публічній хмарі.

А тепер, як ви знаєте, коли вибрати паралельні сегментовані дані замість інших методів розподіленого навчання? Загальне правило полягає в тому, що якщо ваша модель має менше 1 мільярда параметрів і може поміститися в пам’ять GPU, Паралельна бібліотека даних SageMaker or Навчальний компілятор SageMaker може бути достатньо для вас. Якщо у вас є більші моделі мови або комп’ютерного зору, ми пропонуємо навчити їх за допомогою техніки паралелізму фрагментованих даних у поєднанні з контрольна точка активації та розвантаження активації у бібліотеці паралельних моделей SageMaker спочатку, перед іншими техніками, такими як тензорний паралельність або паралельність трубопроводу.

Використання паралелізму фрагментованих даних для навчання GPT-2 на Amazon SageMaker

Давайте тепер дізнаємося, як навчити модель GPT-2 із паралельними фрагментованими даними, а SMP інкапсулює всю складність за вас. Це повний навчальний зошит проведе вас через увесь процес, від обробки даних, визначення та подання навчальних завдань до моніторингу журналів навчання. Далі наведено короткий огляд, у якому висвітлюються основні кроки для використання цієї функції.

1. Почніть

Паралелізм сегментованих даних доступний у PyTorch v1.12.0+ і працює як з FP16, так і з BF16. Найпростіший спосіб використання бібліотеки SMP — це попередньо зібраний контейнер AWS Deep Learning Container для PyTorch. Однак, якщо ви хочете принести свій власний контейнер Docker, ви можете звернутися до Створіть свій власний контейнер Docker за допомогою паралельної бібліотеки розподілених моделей SageMaker. Щоб почати, слідуйте Змініть навчальний скрипт PyTorch адаптувати API SMP у вашому сценарії навчання. У цьому розділі ми лише називаємо кілька основних кроків із фрагментами коду з готового до використання сценарію навчання train_gpt_simple.py. Ви можете стежити за коментарями в сценарії і Документ API щоб дізнатися більше про те, де використовуються SMP API.

Спочатку імпортуйте та ініціалізуйте бібліотеку за допомогою виклику smdistributed.modelparallel.torch.init() на початку сценарію тренінгу:

import smdistributed.modelparallel.torch as smp

smp.init(smp_config)

По-друге, оберніть модель, якою потрібно розділити smdistributed.modelparallel.torch.DistributedModel і використати повернуте DistributedModel об'єкт, що йде вперед:

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_config(model_config)
model = smp.DistributedModel(model, trace_device="gpu", backward_passes_per_step=args.gradient_accumulation)

Оберніть оптимізатор с smdistributed.modelparallel.torch.DistributedOptimizer для збереження та завантаження станів оптимізатора.

from torch import optim

optimizer = optim.Adam(
    param_groups, betas=(args.beta1, args.beta2), lr=args.lr, weight_decay=args.weight_decay
)

optimizer = smp.DistributedOptimizer(
        optimizer, 
        static_loss_scale=None, 
        dynamic_loss_scale=True,
        dynamic_loss_args={"scale_window": 1000, "min_scale": 1, "delayed_shift": 2},
        )

Помістіть логіку вперед і назад у функцію кроку та прикрасьте її smdistributed.modelparallel.torch.step.  Будь-які обчислення, визначені всередині smp.step-decorated функція виконується розподіленим способом.

@smp.step
def train_step(model, optimizer, input_ids, attention_mask, args):
    loss = model(input_ids=input_ids, attention_mask=attention_mask, labels=input_ids)["loss"]
    model.backward(loss)

    return loss

@smp.step
def test_step(model, input_ids, attention_mask):
    loss = model(input_ids=input_ids, attention_mask=attention_mask, labels=input_ids)["loss"]
    
    return loss

2. Підготуйте набір даних

Ми використовуємо openwebtext це набір даних, який ми використовуємо в цьому прикладі. Блокнот використовує скрипт data_prep_512.py для завантаження та попередньої обробки набору даних. Ви також можете навчатися з іншими наборами даних, змінюючи data_pipeline.py. Маючи справу з великим набором даних і моделлю, ви можете прискорити навчання, використовуючи дані, що зберігаються в Amazon FSx для Luster, який забезпечує високопродуктивну файлову систему, інтегровану з нею Служба простого зберігання Amazon (S3). Перегляньте інструкції від Налаштуйте канал введення даних для використання Amazon FSx для Lustre для вказівок щодо встановлення файлової системи FSx Lustre як каналу введення даних.

3. Розпочати навчальні роботи

Цей крок передбачає, що ви вже зробили це змінив ваш сценарій навчання і підготував набір даних, як зазначено в попередніх розділах. до увімкнути паралелізм сегментованих даних, просто встановіть sharded_data_parallel_degree в Оцінювач PyTorch. У цьому підручнику ми встановлюємо sharded_data_parallel_degree=128 та  instace_count=32 для вузлів p4d.24xlarge, що вказує на те, що стани моделі будуть розділені на 128 GPU із загальної кількості 256 GPU. На основі цього вибраного значення SMP автоматично встановлює ступінь паралельності даних на 2 (оскільки 256/128=2), тобто ми матимемо дві репліки для паралельності даних. Загальне правило вибору ідеального значення для sharded_data_parallel_degree полягає в додаванні ще одного вузла до групи спільного доступу на кожні 3B параметрів моделі. У цьому підручнику розмір нашої моделі становить 30B, тому ми повинні використовувати принаймні 10 вузлів для шардингу. І оскільки 16 вузлів (128 графічних процесорів) є найменшим ступенем 2 вище порогового значення, ми встановили sharded_data_parallel_degree=128.

Для контрольних точок ми також надаємо набір утиліт контрольних точок sharded_data_parallel_checkpoint.py , включаючи утиліту для повної реконструкції state_dict для розширених випадків використання. Нарешті, ми можемо запустити завдання розподіленого навчання, викликавши fit() в Estimator.

smp_estimator = PyTorch(
    entry_point="train_gpt_simple.py",
    instance_type="ml.p4d.24xlarge",
    source_dir=os.getcwd(),
    volume_size=500,
    instance_count=32,
    distribution={
        "mpi": {
            "enabled": True,
            "processes_per_host": processes_per_host,
            "custom_mpi_options": mpioptions,
        },
        "smdistributed": {
            "modelparallel": {
                "enabled": True,
                "parameters": {
                    "ddp": True,
                    "skip_tracing": True,
                    "delayed_parameter_initialization": True,
                    "offload_activations": True,
                    "activation_loading_horizon": 4,
                    # To enable sharded data parallelism.
                    # Here we shard model states across 128 GPUs. 
                    "sharded_data_parallel_degree": 128, 
                    "fp16": False,
                    "bf16": True,
                    # This is to disable pipeline parallelism.
                    "partitions": 1,
                },
            }
        },
    },
    framework_version="1.12",
    py_version="py38",
    hyperparameters=hyperparameters,
    checkpoint_s3_uri=checkpoint_s3_uri if not use_fsx else None,
    checkpoint_local_path=hyperparameters["checkpoint-dir"] if use_fsx else None,
    ...
)

smp_estimator.fit(inputs=data_channels)

4. Контролювати підготовку робочих місць

Ви можете отримати доступ до журналів навчання та відстежувати використання графічного процесора та пам’яті Amazon CloudWatch. Перегляньте логи «алго-1» тому що це головний вузол, вихідний потік якого містить журнали завдань навчання з усіх примірників.

Порівняльний аналіз продуктивності

Ми перевірили паралелізм фрагментованих даних у бібліотеці SMP на 16 і 32 вузлах p4d.24xlarge для довжини послідовності 512 і 2048 відповідно. Модель GPT30 із параметрами 2B налаштована на використання прихованої ширини 7168, 48 шарів і 64 голів. Ви можете прийняти ту саму конфігурацію, де довжина послідовності становить 2048, встановивши model_config = "gpt2-30b" у зошиті підручника. З цим налаштуванням SMP досяг 73.52 вибірок на секунду, що на 39.7% більше, ніж у DeepSpeed ​​ZeRO-3. Якщо розмір вашого токена становить 500 мільярдів, це прискорення означає майже 367 годин економії на вузлах p4d.24xlarge, що еквівалентно економії понад 12,000 XNUMX доларів США за одне навчання! У наведеній нижче таблиці наведено результати нашого порівняльного тесту.

конфігурація продуктивність Час навчання з SMP (дні)
Модель/Навчання кластер DeepSpeed SMP Швидкість (зразків/с)
DeepSpeed ​​v0.7.2
Швидкість (зразків/с)
SMP v1.11
% Прискорення SMP TFLOPS, досягнутий завдяки SMP 100 мільярдів жетонів 500 мільярдів жетонів
30Б ГПТ-2
Довжина послідовності: 512
Загальний розмір партії: 3072
FP16
16 p4d.24xвеликі вузли Контрольна точка активації
gradient_accumulation_steps:2
Контрольна точка активації
sharded_data_parallel_degree:64
Gradient_accumulation:1
142 181.05 27.5 173.6 12.49 62.43
30Б ГПТ-2
Довжина послідовності: 2048
Загальний розмір партії 1536
FP16
32 p4d.24xвеликі вузли Контрольна точка активації
gradient_accumulation_steps:2
Контрольна точка активації sharded_data_parallel_degree:128
Gradient_accumulation:1
52.6 73.52 39.77 141 7.69 38.43
1/ Для кожної конфігурації моделі ми протестували різні функції, етапи та конфігурації в DeepSpeed ​​ZeRO та вибрали ту, яка забезпечує найкращу пропускну здатність як базову лінію DeepSpeed. Тест був запущений Обчислювальна хмара Amazon Elastic (Amazon EC2). 2/ Ці результати покладаються на покращені комунікаційні колективи, оптимізовані для AWS, які незабаром будуть доступні. 3/ Час до тренування прогнозується на основі швидкості на основі кількості оброблених жетонів.

Таким чином, ми спостерігали незмінно вищу пропускну здатність із паралелізмом фрагментованих даних у SMP порівняно з DeepSpeed ​​у різних моделях і конфігураціях. Ця нова функція також продемонструвала кращу ефективність пам’яті порівняно з DeepSpeed, дозволяючи SMP відповідати більшому розміру партії та зменшувати рівень накопичення градієнта, необхідний для відповідності конкретному глобальному розміру партії.

Висновок

У цій публікації ми представили нову техніку розподіленого навчання — паралелізм фрагментованих даних — і те, як вона прискорює навчання гігантської моделі за допомогою майже лінійного масштабування на Amazon SageMaker. Ми також розповіли, як навчити модель GPT-2 за новою технікою повний приклад. Ви можете стежити за Amazon SageMaker Приклади GitHub repo щоб відстежувати всі паралельні приклади моделей SageMaker або відвідати наш наступний розподілені навчальні семінари. Щоб дізнатися більше про паралелізм сегментованих даних, див документація.


Про авторів

Train gigantic models with near-linear scaling using sharded data parallelism on Amazon SageMaker PlatoBlockchain Data Intelligence. Vertical Search. Ai.Емілі Веббер приєднався до AWS відразу після запуску SageMaker і з тих пір намагається розповісти про це всьому світу! Крім створення нових можливостей ML для клієнтів, Емілі любить медитувати та вивчати тибетський буддизм.

Train gigantic models with near-linear scaling using sharded data parallelism on Amazon SageMaker PlatoBlockchain Data Intelligence. Vertical Search. Ai.Може Каракус є старшим науковим співробітником AWS, оптимізуючи масштабне розподілене глибоке навчання на AWS. Його наукові інтереси охоплюють глибинне навчання, розподілену оптимізацію, розподілені системи та теорію інформації. Поза роботою він любить їздити на велосипеді, подорожувати, читати та вчитися.

Train gigantic models with near-linear scaling using sharded data parallelism on Amazon SageMaker PlatoBlockchain Data Intelligence. Vertical Search. Ai.Рахул Хуілгол є старшим інженером-програмістом в AWS. Він працює над системами розподіленого глибокого навчання, щоб зробити навчання великих моделей глибокого навчання в хмарі легким і ефективним. У вільний час він захоплюється фотографією, їздою на велосипеді та садівництвом.

Train gigantic models with near-linear scaling using sharded data parallelism on Amazon SageMaker PlatoBlockchain Data Intelligence. Vertical Search. Ai.Сухіт Кодгуле є інженером із розробки програмного забезпечення в групі штучного інтелекту AWS, яка працює над фреймворками глибокого навчання. У вільний час захоплюється походами, подорожами та кулінарією.

Train gigantic models with near-linear scaling using sharded data parallelism on Amazon SageMaker PlatoBlockchain Data Intelligence. Vertical Search. Ai.Ерін Хо є менеджером із продуктів AWS Deep Learning. Вона працює над продуктами, які полегшують клієнтам навчання моделей глибокого навчання на AWS. Для розваги поза роботою вона любить піші прогулянки та катання на лижах.

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

Більше від AWS Машинне навчання