Accelerate documentation
Быстрый тур
Быстрый тур
Существует множество способов запуска и выполнения кода в зависимости от среды обучения (torchrun, DeepSpeed и т. д.) и доступного оборудования. Accelerate предлагает единый интерфейс для запуска и обучения в различных распределённых конфигурациях, что позволяет сосредоточиться на коде обучения PyTorch, а не на тонкостях адаптации кода под эти конфигурации. Это позволяет легко масштабировать код PyTorch для обучения и вывода в распределённых средах с использованием оборудования, такого как GPU и TPU. Accelerate также предоставляет Big Model Inference, чтобы сделать загрузку и выполнение вывода с действительно большими моделями, которые обычно не помещаются в память, более доступным.
В этом быстром туре представлены три основные возможности Accelerate:
- единый интерфейс командной строки для запуска сценариев распределённого обучения
- библиотека для обучения, позволяющая адаптировать код обучения PyTorch для работы в различных распределённых средах
- Вывод больших моделей
Единый интерфейс запуска
Accelerate автоматически выбирает соответствующие значения конфигурации для любого заданного фреймворка распределённого обучения (DeepSpeed, FSDP и т. д.) с помощью единого файла конфигурации, генерируемого командой accelerate config. Вы также можете явно передать значения конфигурации в командную строку, что полезно в определённых ситуациях, например, при использовании SLURM.
Но в большинстве случаев сначала всегда следует выполнять accelerate config, чтобы помочь Accelerate узнать о вашей конфигурации обучения.
accelerate config
Команда accelerate config создаёт и сохраняет файл default_config.yaml в папке кэша Accelerate. Этот файл хранит конфигурацию вашей среды обучения, что позволяет Accelerate корректно запускать ваш скрипт обучения с учётом характеристик вашего компьютера.
После настройки окружения вы можете проверить конфигурацию с помощью accelerate test, который запускает короткий скрипт для проверки распределённого окружения.
accelerate testДобавьте
--config_fileк командеaccelerate testилиaccelerate launch, чтобы указать расположение файла конфигурации, если он сохранён в нестандартном месте, например в кэше.
Когда окружение настроено, запустите скрипт обучения с помощью accelerate launch!
accelerate launch path_to_script.py --args_for_the_script
Чтобы узнать больше, обратитесь к учебнику Запуск распределённого кода, где приведена дополнительная информация о запуске ваших скриптов.
Также у нас есть зoo конфигураций, где представлены готовые минимальные примеры конфигураций для различных сценариев, которые вы можете запустить.
Адаптация кода обучения
Следующая ключевая функция Accelerate — это класс Accelerator, который адаптирует ваш код PyTorch для работы в различных распределённых средах.
Чтобы запустить обучение на нескольких GPU или TPU, достаточно добавить несколько строк кода в ваш скрипт обучения.
+ from accelerate import Accelerator
+ accelerator = Accelerator()
+ device = accelerator.device
+ model, optimizer, training_dataloader, scheduler = accelerator.prepare(
+ model, optimizer, training_dataloader, scheduler
+ )
for batch in training_dataloader:
optimizer.zero_grad()
inputs, targets = batch
- inputs = inputs.to(device)
- targets = targets.to(device)
outputs = model(inputs)
loss = loss_function(outputs, targets)
+ accelerator.backward(loss)
optimizer.step()
scheduler.step()- Импортируйте и создайте экземпляр класса Accelerator в начале сценария обучения. Класс Accelerator инициализирует всё необходимое для распределённого обучения и автоматически определяет среду обучения (один компьютер с GPU, компьютер с несколькими GPU, несколько компьютеров с несколькими GPU или TPU и т. д.) на основе способа запуска кода.
from accelerate import Accelerator
accelerator = Accelerator()- Уберите вызовы вида
.cuda()для вашей модели и входных данных. Класс Accelerator автоматически размещает эти объекты на соответствующем устройстве.
Этот шаг необязателен, но считается лучшей практикой позволить Accelerate управлять размещением на устройствах. Вы также можете отключить автоматическое размещение на устройствах, передав
device_placement=Falseпри инициализации Accelerator. Если вы хотите явно разместить объекты на устройстве с помощью.to(device), убедитесь, что используетеaccelerator.device. Например, если вы создадите оптимизатор до размещения модели наaccelerator.device, обучение на TPU завершится ошибкой.
Accelerate по умолчанию не использует неблокирующие передачи для автоматического размещения на устройствах, что может приводить к нежелательным синхронизациям CUDA. Вы можете включить неблокирующие передачи, передав DataLoaderConfiguration с установленным
non_blocking=Trueв качествеdataloader_configпри инициализации Accelerator. Как обычно, неблокирующие передачи будут работать только в том случае, если для dataloader также установленоpin_memory=True. Будьте осторожны: использование неблокирующих передач с GPU на CPU может привести к некорректным результатам, если в результате на CPU будут выполняться операции с тензорами, которые ещё не готовы.
device = accelerator.device
- Передавайте все соответствующие объекты PyTorch для обучения (оптимизатор, модель, загрузчик(и) данных, планировщик скорости обучения) в метод prepare() сразу после их создания. Этот метод оборачивает модель в контейнер, оптимизированный под вашу распределённую конфигурацию, использует версии оптимизатора и планировщика от Accelerate, а также создаёт шардированную версию вашего загрузчика данных для распределения по GPU или TPU.
model, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(
model, optimizer, train_dataloader, lr_scheduler
)- Замените
loss.backward()на backward(), чтобы использовать правильный методbackward()для вашей конфигурации обучения.
accelerator.backward(loss)
Ознакомьтесь с руководством Внутренние механизмы Accelerate, чтобы узнать больше о том, как Accelerate адаптирует ваш код.
Распределённая оценка
Для выполнения распределённой оценки передайте ваш загрузчик данных валидации в метод prepare():
validation_dataloader = accelerator.prepare(validation_dataloader)
Each device in your distributed setup only receives a part of the evaluation data, which means you should group your predictions together with the gather_for_metrics() method. This method requires all tensors to be the same size on each process, so if your tensors have different sizes on each process (for instance when dynamically padding to the maximum length in a batch), you should use the pad_across_processes() method to pad you tensor to the largest size across processes. Note that the tensors needs to be 1D and that we concatenate the tensors along the first dimension.
for inputs, targets in validation_dataloader:
predictions = model(inputs)
# Gather all predictions and targets
all_predictions, all_targets = accelerator.gather_for_metrics((predictions, targets))
# Example of use with a *Datasets.Metric*
metric.add_batch(all_predictions, all_targets)Для более сложных случаев (например, тензоры 2D, нежелание конкатенировать тензоры, словарь тензоров 3D) можно передать use_gather_object=True в gather_for_metrics. В этом случае после сбора будет возвращён список объектов. Обратите внимание, что использование этого параметра с тензорами на GPU поддерживается плохо и является неэффективным.
Данные в конце набора данных могут быть продублированы, чтобы батч можно было равномерно распределить между всеми воркерами. Метод gather_for_metrics() автоматически удаляет продублированные данные для более точного расчёта метрики.
Вывод больших моделей
Big Model Inference в Accelerate включает две основные функции, init_empty_weights() и load_checkpoint_and_dispatch(), для загрузки крупных моделей, предназначенных для инференса и обычно не помещающихся в память.
Ознакомьтесь с руководством Обработка больших моделей для инференса, чтобы лучше понять, как работает Big Model Inference под капотом.
Инициализация пустых весов
Контекстный менеджер init_empty_weights() инициализирует модели любого размера, создавая каркас модели и перемещая параметры на устройство meta PyTorch в момент их создания. Благодаря этому не все веса загружаются сразу, а в память попадает лишь небольшая часть модели за один раз.
Например, загрузка пустой модели Mixtral-8x7B требует значительно меньше памяти, чем полная загрузка моделей и весов на CPU.
from accelerate import init_empty_weights
from transformers import AutoConfig, AutoModelForCausalLM
config = AutoConfig.from_pretrained("mistralai/Mixtral-8x7B-Instruct-v0.1")
with init_empty_weights():
model = AutoModelForCausalLM.from_config(config)Загрузка и распределение весов
Функция load_checkpoint_and_dispatch() загружает полные или разбитые на части контрольные точки в пустую модель и автоматически распределяет веса по всем доступным устройствам.
Параметр device_map определяет, на каком устройстве размещать каждый слой модели. Если указать "auto", слои будут размещены сначала на GPU, затем на CPU, а если памяти всё ещё не хватит — на жёстком диске в виде тензоров с отображением в память. Используйте параметр no_split_module_classes, чтобы указать, какие модули не следует разделять между устройствами (обычно это модули с остаточным соединением).
from accelerate import load_checkpoint_and_dispatch
model_checkpoint = "your-local-model-folder"
model = load_checkpoint_and_dispatch(
model, checkpoint=model_checkpoint, device_map="auto", no_split_module_classes=['Block']
)Дальнейшие шаги
Теперь, когда вы ознакомились с основными возможностями Accelerate, следующие шаги могут включать:
- Ознакомьтесь с туториалами, чтобы познакомиться с Accelerate в спокойном темпе. Это особенно полезно, если вы только начинаете работать с распределённым обучением и библиотекой.
- Изучите руководства, чтобы узнать, как использовать Accelerate для конкретных задач.
- Углубите своё концептуальное понимание того, как Accelerate работает изнутри, прочитав концептуальные руководства.
- Обращайтесь к справочнику API, чтобы узнать, какие параметры и опции доступны.