Мульти-GPU на сыром PyTorch с библиотекой Hugging Face Accelerate
Распределенное машинное обучение сложно, и в сочетании с моделями глубокого обучения, которые также сложны, оно может превратить любую работу в исследовательский проект. Добавьте к этому настройку аппаратного и программного обеспечения вашего графического процессора, и это может оказаться слишком сложной задачей.
Здесь мы покажем, что библиотека Accelerate Hugging Face снимает часть бремени использования распределенной установки, при этом позволяя вам сохранить весь исходный код PyTorch.
Предварительные условия
Чтобы следовать этой статье, вам понадобится опыт работы с кодом Python и начальное понимание глубокого обучения. Мы будем исходить из предположения, что все читатели имеют доступ к достаточно мощным машинам, чтобы они могли запускать предоставленный код.
Если у вас нет доступа к системе с несколькими графическими процессорами, мы предлагаем получить к ней доступ через облако. Существует множество облачных провайдеров, предлагающих графические процессоры. DigitalOcean GPU Droplets в настоящее время находится в ранней доступности. Узнайте больше и подпишитесь на интерес к GPU Droplets здесь.
Чтобы получить инструкции по началу работы с кодом Python, мы рекомендуем попробовать это руководство для начинающих, чтобы настроить систему и подготовиться к запуску руководств для начинающих.
Что такое ускорение?
Accelerate — это библиотека от Hugging Face, которая упрощает преобразование кода PyTorch для одного графического процессора в код для нескольких графических процессоров на одной или нескольких машинах. Вы можете прочитать больше об Accelerate в репозитории GitHub здесь.
Мотивация
Благодаря новейшим технологиям глубокого обучения мы не всегда сможем избежать сложности реальных данных или моделей, но мы можем уменьшить сложность их запуска на графических процессорах, а также на более чем одном графическом процессоре одновременно. один раз.
Для этого существует несколько библиотек, но часто они либо предоставляют абстракции более высокого уровня, которые лишают пользователя детального управления, либо предоставляют другой интерфейс API, который необходимо сначала изучить, прежде чем его можно будет использовать.
Именно это вдохновило на создание Accelerate: дать возможность пользователям, которым необходимо писать полностью общий код PyTorch, одновременно снизить нагрузку на распределенный запуск такого кода.
Еще одна ключевая возможность, предоставляемая библиотекой, заключается в том, что фиксированную форму кода можно запускать как распределенно, так и нет. Это отличается от традиционного распределенного запуска PyTorch, который необходимо изменить, чтобы перейти от одного к другому и обратно.
Изменения кода для использования Accelerate
Если вам нужно использовать полностью общий код PyTorch, вполне вероятно, что вы пишете собственный цикл обучения для модели.
Тренировочный цикл
Типичный цикл обучения PyTorch выглядит примерно так:
- Импортировать библиотеки
- Установите устройство (например, графический процессор)
- Наведите модель на устройство
- Выберите оптимизатор (например, Адам)
- Загрузите набор данных с помощью DataLoader (чтобы мы могли передавать пакеты в модель)
Модель поезда в цикле (один раунд за эпоху):
- Направьте исходные данные и цели на устройство
- Обнулить градиенты сети
- Рассчитать результат модели
- Рассчитать потери (например, перекрестную энтропию)
- Обратное распространение градиента
Могут быть и другие шаги, такие как подготовка данных или запуск модели на тестовых данных, в зависимости от решаемой проблемы.
Изменения кода
В файле readme для репозитория Accelerate GitHub изменения кода по сравнению с обычным PyTorch для цикла обучения, подобного приведенному выше, проиллюстрированы посредством выделения строк, которые необходимо изменить:
Изменения кода для цикла обучения с использованием Accelerate по сравнению с исходным PyTorch. (Из README репозитория Accelerate GitHub)
Зеленый цвет означает добавление новых строк, а красный — удаление строк. Мы видим, как код соответствует шагам цикла обучения, описанным выше, и необходимые изменения.
На первый взгляд кажется, что изменения не сильно упрощают код, но если вы представите, что красные линии исчезли, вы увидите, что мы больше не говорим о том, на каком устройстве мы находимся (ЦП, ГП и т. д.). Он был абстрагирован, оставив остальную часть цикла нетронутой.
Более подробно изменения в коде таковы:
- Импортируйте библиотеку ускорителя.
- Используйте ускоритель в качестве устройства, которое может быть процессором или графическим процессором.
- Создайте экземпляр модели без указания устройства.
- Настройте модель, оптимизатор и данные, которые будут использоваться Accelerate.
- Нам не нужно указывать исходные данные и цели на устройстве.
- Акселератор выполняет этап обратного распространения ошибки
Однографический процессор
Код выше предназначен для одного графического процессора.
В своей записи в блоге Hugging Face авторы Accelerate затем показывают, как необходимо изменить код PyTorch, чтобы включить использование нескольких графических процессоров традиционным методом.
Он включает в себя еще много строк кода:
import os
...
from torch.utils.data import DistributedSampler
from torch.nn.parallel import DistributedDataParallel
local_rank = int(os.environ.get("LOCAL_RANK", -1))
...
device = device = torch.device("cuda", local_rank)
...
model = DistributedDataParallel(model)
...
sampler = DistributedSampler(dataset)
...
data = torch.utils.data.DataLoader(dataset, sampler=sampler)
...
sampler.set_epoch(epoch)
...
Полученный код больше не работает для одного графического процессора.
Напротив, код с использованием Accelerate уже работает для нескольких графических процессоров и продолжает работать и для одного графического процессора.
Бег Ускорение
В репозитории Accelerate GitHub показано, как запустить библиотеку, с помощью хорошо документированного набора примеров.
Для запуска запустите Jupyter Notebook обычным способом.
Давайте посмотрим пример.
Простой пример НЛП
Hugging Face была основана с целью облегчить людям доступ к обработке естественного языка (НЛП), поэтому НЛП — подходящее место для начала.
Далее следует несколько коротких шагов по настройке.
pip install accelerate
pip install datasets transformers
pip install scipy sklearn
и мы можем перейти к примеру
cd examples
python ./nlp_example.py
При этом выполняется точная настройка известной модели преобразователя BERT в ее базовой конфигурации с использованием набора данных GLUE MRPC, определяющего, является ли предложение перефразированием другого.
Его точность составляет около 85 %, а показатель F1 (сочетание точности и полноты) — чуть ниже 90 %. Так что производительность достойная.
Мульти-GPU
Для нескольких графических процессоров действительно начинает проявляться упрощающая сила библиотеки Accelerate, поскольку можно запускать тот же код, что и выше.
Затем, чтобы вызвать сценарий для нескольких графических процессоров, выполните:
pip install accelerate datasets transformers scipy sklearn
и выполните краткие шаги настройки, чтобы указать, как его запускать:
accelerate config
In which compute environment are you running? ([0] This machine, [1] AWS (Amazon SageMaker)): 0
Which type of machine are you using? ([0] No distributed training, [1] multi-CPU, [2] multi-GPU, [3] TPU): 2
How many different machines will you use (use more than 1 for multi-node training)? [1]: 1
Do you want to use DeepSpeed? [yes/NO]: no
Do you want to use FullyShardedDataParallel? [yes/NO]: no
How many GPU(s) should be used for distributed training? [1]: 2
Do you wish to use FP16 or BF16 (mixed precision)? [NO/fp16/bf16]: no
Обратите внимание, что мы говорим «1 машина», потому что наши 2 графических процессора находятся на одной машине, но мы подтверждаем, что будут использоваться 2 графических процессора.
Затем мы можем работать, как и раньше, теперь используя команду launch
вместо python
, чтобы указать Accelerate использовать конфигурацию, которую мы только что установили:
accelerate launch ./nlp_example.py
Вы можете увидеть, что оба графических процессора используются, запустив nvidia-smi
в терминале.
Дополнительные возможности
Как следует из приведенной выше настройки файла конфигурации, мы лишь поверхностно рассмотрели возможности библиотеки.
Некоторые другие функции включают в себя:
- Диапазон аргументов запускаемого скрипта: см. https://github.com/huggingface/accelerate/tree/main/examples.
- Мультипроцессор в дополнение к мультиграфическому процессору
- Мульти-GPU на нескольких машинах
- Средство запуска из блокнота
.ipynb
Jupyter - С плавающей запятой смешанной точности
- Интеграция DeepSpeed
- Многопроцессорный процессор с MPI
Пример компьютерного зрения
Существует также еще один пример машинного обучения, который вы можете запустить; это похоже на задачу НЛП, которую мы здесь выполняли, но для компьютерного зрения. Он обучает сеть ResNet50 на наборе данных домашних животных Oxford-IIT.
В нашем блокноте вы можете добавить в ячейку кода следующее, чтобы быстро запустить пример:
pip install accelerate datasets transformers scipy sklearn
pip install timm torchvision
cd examples
wget https://www.robots.ox.ac.uk/~vgg/data/pets/data/images.tar.gz
tar -xzf images.tar.gz
python ./cv_example.py --data_dir images
Выводы и следующие шаги
Мы показали, как библиотека Accelerate от Hugging Face упрощает распределенный запуск моделей глубокого обучения PyTorch по сравнению с традиционным PyTorch, не устраняя при этом полностью общий характер пользовательского кода.
Некоторые дальнейшие шаги:
- Ознакомьтесь с оригинальной записью в блоге Hugging Face.
- Посетите репозиторий Accelerate GitHub для получения дополнительных примеров и функций.