Перейти к содержанию

Обучение с использованием нескольких GPU с YOLOv5

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

Прежде чем начать

Клонируйте репозиторий и установите requirements.txt в окружении Python>=3.8.0, включая PyTorch>=1.8. Модели и наборы данных загружаются автоматически из последнего релиза YOLOv5.

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

ProTip!

Docker-образ Рекомендуется для всех Multi-GPU тренировок. Смотрите Краткое руководство по DockerЗагрузки Docker

ProTip!

torch.distributed.run заменяет torch.distributed.launch в PyTorch>=1.9. Смотрите Распределенная документация PyTorch для получения подробной информации.

Обучение

Выберите предварительно обученную модель для начала обучения. Здесь мы выбрали YOLOv5s, самую маленькую и быструю из доступных моделей. Полное сравнение всех моделей приведено в нашей таблице README. Мы будем тренировать эту модель с помощью GPU на COCO датасете.

Модели YOLOv5

Один GPU

python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0

Вы можете увеличить device чтобы использовать несколько GPU в режиме DataParallel.

python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1

Этот метод медленный и едва ускоряет обучение по сравнению с использованием только 1 GPU.

Вам нужно будет передать python -m torch.distributed.run --nproc_per_node, за которым следуют обычные аргументы.

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1
  • --nproc_per_node указывает, сколько GPU вы хотите использовать. В примере выше это 2.
  • --batch это общий размер пакета. Он будет равномерно разделен между всеми GPU. В примере выше это 64/2=32 на GPU.

Приведенный выше код будет использовать GPU. 0... (N-1). Вы также можете установить CUDA_VISIBLE_DEVICES=2,3 (или любой другой список) перед запуском команды, если вы предпочитаете контролировать видимость устройства с помощью переменных окружения.

Используйте определенные GPU (нажмите, чтобы развернуть) Вы можете сделать это, просто передав `--device`, за которым следуют ваши конкретные GPU. Например, в коде ниже мы будем использовать GPU `2,3`.
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3
Используйте SyncBatchNorm (нажмите, чтобы развернуть) [SyncBatchNorm](https://docs.pytorch.org/docs/master/generated/torch.nn.SyncBatchNorm.html) could increase [accuracy](https://www.ultralytics.com/glossary/accuracy) for multiple GPU training, however, it will slow down training by a significant factor. It is **only** available for Multiple GPU DistributedDataParallel training. It is best used when the batch-size on **each** GPU is small (<= 8). To use SyncBatchNorm, simply pass `--sync-bn` to the command like below:
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
Используйте несколько машин (нажмите, чтобы развернуть) Это **единственно** доступно для тренировки Multiple GPU DistributedDataParallel. Прежде чем продолжить, убедитесь, что файлы на всех машинах одинаковые: набор данных, кодовая база и т. д. После этого убедитесь, что машины могут взаимодействовать друг с другом. Вам нужно будет выбрать главную машину (машину, с которой будут общаться остальные). Запишите ее адрес (`master_addr`) и выберите порт (`master_port`). В примере ниже я буду использовать `master_addr = 192.168.1.1` и `master_port = 1234`. Чтобы использовать его, вы можете сделать следующее:
# On master machine 0
python -m torch.distributed.run --nproc_per_node G --nnodes N --node_rank 0 --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights ''
# On machine R
python -m torch.distributed.run --nproc_per_node G --nnodes N --node_rank R --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights ''
где `G` - количество GPU на машине, `N` - количество машин, а `R` - номер машины из `0...(N-1)`. Допустим, у меня есть две машины с двумя GPU на каждой, тогда `G = 2`, `N = 2`, и `R = 1` для вышеуказанного. Обучение не начнется, пока не будут подключены **все** `N` машин. Результаты будут отображаться только на главной машине!

Примечания

  • Поддержка Windows не тестировалась, рекомендуется Linux.
  • --batch должно быть кратно количеству GPU.
  • GPU 0 будет занимать немного больше памяти, чем другие GPU, поскольку он поддерживает EMA и отвечает за контрольные точки и т. д.
  • Если вы получите RuntimeError: Address already in use, это может быть связано с тем, что вы запускаете несколько процессов обучения одновременно. Чтобы это исправить, просто используйте другой номер порта, добавив --master_port как показано ниже:

    python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...
    

Results

Результаты профилирования DDP на экземпляре AWS EC2 P4d с 8x A100 SXM4-40GB для YOLOv5l для 1эпохи COCO .

Профилирование кода
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --runtime=nvidia --ipc=host --gpus all -v "$(pwd)"/coco:/usr/src/coco $t
pip3 install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html
cd .. && rm -rf app && git clone https://github.com/ultralytics/yolov5 -b master app && cd app
cp data/coco.yaml data/coco_profile.yaml

# profile
python train.py --batch-size 16 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0
python -m torch.distributed.run --nproc_per_node 2 train.py --batch-size 32 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1
python -m torch.distributed.run --nproc_per_node 4 train.py --batch-size 64 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1,2,3
python -m torch.distributed.run --nproc_per_node 8 train.py --batch-size 128 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1,2,3,4,5,6,7
GPU
A100
Размер пакета (batch-size)CUDA_mem
device0 (G)
COCO
поезд
COCO
вэл
1x1626 ГБ20:390:55
2x3226 ГБ11:430:57
4x6426 ГБ5:570:55
8x12826 ГБ3:090:57

Как показывают результаты, использование DistributedDataParallel с несколькими GPU обеспечивает почти линейное масштабирование скорости обучения. С 8 GPU обучение завершается примерно в 6,5 раз быстрее, чем с одним GPU, при этом сохраняется одинаковое использование памяти на устройство.

Часто задаваемые вопросы

В случае возникновения ошибки, пожалуйста, сначала ознакомьтесь с приведенным ниже списком! (Это может сэкономить ваше время)

Контрольный список (нажмите, чтобы развернуть) - Вы правильно прочитали этот пост? - Вы пытались переклонировать кодовую базу? Код меняется **ежедневно**. - Вы пробовали искать свою ошибку? Возможно, кто-то уже сталкивался с ней в этом или другом репозитории и имеет решение. - Установили ли вы все требования, перечисленные сверху (включая правильные версии Python и PyTorch )? - Пробовали ли вы работать в других средах, перечисленных в разделе "Среды" ниже? - Пробовали ли вы работать с другим набором данных, например coco128 или coco2017? Это облегчит поиск первопричины. Если вы выполнили все вышеперечисленные действия, не стесняйтесь поднять проблему, предоставив как можно больше подробностей в соответствии с шаблоном.

Поддерживаемые среды

Ultralytics предоставляет ряд готовых к использованию сред, каждая из которых предварительно установлена с необходимыми зависимостями, такими как CUDA, CUDNN, Python и PyTorch, чтобы дать старт вашим проектам.

Статус проекта

YOLOv5 CI

Этот значок указывает на то, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти тесты CI тщательно проверяют функциональность и производительность YOLOv5 по различным ключевым аспектам: обучение, валидация, вывод, экспорт и бенчмарки. Они обеспечивают стабильную и надежную работу в macOS, Windows и Ubuntu, при этом тесты проводятся каждые 24 часа и при каждом новом коммите.

Авторы

Мы хотели бы поблагодарить @MagicFrogSJTU, который проделал всю тяжелую работу, и @glenn-jocher за руководство на этом пути.

См. также



📅 Создано 2 года назад ✏️ Обновлено 1 день назад
glenn.jocher@ultralytics.comUltralyticsAssistantonuralp@ultralytics.comLaughing-qRizwanMunawarBurhan-Q

Комментарии