Обучение с использованием нескольких 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
ProTip!
torch.distributed.run заменяет torch.distributed.launch в PyTorch>=1.9. Смотрите Распределенная документация PyTorch для получения подробной информации.
Обучение
Выберите предварительно обученную модель для начала обучения. Здесь мы выбрали YOLOv5s, самую маленькую и быструю из доступных моделей. Полное сравнение всех моделей приведено в нашей таблице README. Мы будем тренировать эту модель с помощью GPU на COCO датасете.

Один GPU
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0
Режим Multi-GPU DataParallel (⚠️ не рекомендуется)
Вы можете увеличить device чтобы использовать несколько GPU в режиме DataParallel.
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1
Этот метод медленный и едва ускоряет обучение по сравнению с использованием только 1 GPU.
Режим Multi-GPU DistributedDataParallel (✅ рекомендуется)
Вам нужно будет передать 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 ''
Примечания
- Поддержка 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 вэл |
|---|---|---|---|---|
| 1x | 16 | 26 ГБ | 20:39 | 0:55 |
| 2x | 32 | 26 ГБ | 11:43 | 0:57 |
| 4x | 64 | 26 ГБ | 5:57 | 0:55 |
| 8x | 128 | 26 ГБ | 3:09 | 0:57 |
Как показывают результаты, использование DistributedDataParallel с несколькими GPU обеспечивает почти линейное масштабирование скорости обучения. С 8 GPU обучение завершается примерно в 6,5 раз быстрее, чем с одним GPU, при этом сохраняется одинаковое использование памяти на устройство.
Часто задаваемые вопросы
В случае возникновения ошибки, пожалуйста, сначала ознакомьтесь с приведенным ниже списком! (Это может сэкономить ваше время)
Контрольный список (нажмите, чтобы развернуть)
- Вы правильно прочитали этот пост? - Вы пытались переклонировать кодовую базу? Код меняется **ежедневно**. - Вы пробовали искать свою ошибку? Возможно, кто-то уже сталкивался с ней в этом или другом репозитории и имеет решение. - Установили ли вы все требования, перечисленные сверху (включая правильные версии Python и PyTorch )? - Пробовали ли вы работать в других средах, перечисленных в разделе "Среды" ниже? - Пробовали ли вы работать с другим набором данных, например coco128 или coco2017? Это облегчит поиск первопричины. Если вы выполнили все вышеперечисленные действия, не стесняйтесь поднять проблему, предоставив как можно больше подробностей в соответствии с шаблоном.Поддерживаемые среды
Ultralytics предоставляет ряд готовых к использованию сред, каждая из которых предварительно установлена с необходимыми зависимостями, такими как CUDA, CUDNN, Python и PyTorch, чтобы дать старт вашим проектам.
- Бесплатные блокноты GPU:
- Google Cloud: Краткое руководство по GCP
- Amazon: Краткое руководство по AWS
- Azure: Краткое руководство по AzureML
- Docker: Краткое руководство по Docker
Статус проекта
Этот значок указывает на то, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти тесты CI тщательно проверяют функциональность и производительность YOLOv5 по различным ключевым аспектам: обучение, валидация, вывод, экспорт и бенчмарки. Они обеспечивают стабильную и надежную работу в macOS, Windows и Ubuntu, при этом тесты проводятся каждые 24 часа и при каждом новом коммите.
Авторы
Мы хотели бы поблагодарить @MagicFrogSJTU, который проделал всю тяжелую работу, и @glenn-jocher за руководство на этом пути.
См. также
- Режим обучения - Узнайте об обучении моделей YOLO с помощью Ultralytics
- Настройка гиперпараметров - Оптимизируйте производительность вашей модели
- Краткое руководство по Docker - Настройте свою среду Docker для обучения