Обучение на нескольких GPU с помощью YOLOv5
Это руководство объясняет, как правильно использовать несколько GPU для обучения набора данных с помощью 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
Совет!
Образ Docker рекомендуется для всех тренингов Multi-GPU . См. Руководство по быстрому запуску Docker
Совет!
torch.distributed.run
заменяет torch.distributed.launch
в PyTorch>=1.9. См. Распространенная документация PyTorch для деталей.
Обучение
Выберите предварительно обученную модель для начала обучения. Здесь мы выбрали YOLOv5s, самую маленькую и быструю из доступных моделей. Полное сравнение всех моделей приведено в таблице README. Мы будем обучать эту модель с помощью Multi-GPU на наборе данных COCO.
Одиночка GPU
МультиGPU ДанныеПараллельный режим (⚠️ не рекомендуется)
Вы можете увеличить device
для использования нескольких графических процессоров в режиме DataParallel.
Этот метод медленный и почти не ускоряет обучение по сравнению с использованием только 1 GPU.
Мульти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
указывает, сколько графических процессоров вы хотите использовать. В приведенном выше примере это 2.--batch
это общий размер партии. Он будет разделен поровну на каждый GPU. В приведенном выше примере это 64/2=32 на GPU.
Приведенный выше код будет использовать графические процессоры 0... (N-1)
.
Используйте специальные графические процессоры (нажмите, чтобы развернуть)
Для этого достаточно передать `--device`, а затем указать конкретные GPU. Например, в приведенном ниже коде мы будем использовать GPU `2,3`.Используйте SyncBatchNorm (нажмите, чтобы развернуть)
[SyncBatchNorm](https://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:Использование нескольких машин (нажмите, чтобы развернуть)
Это **единственно** доступно для тренировки Multiple GPU DistributedDataParallel. Прежде чем продолжить, убедитесь, что файлы на всех машинах одинаковые: набор данных, кодовая база и т. д. После этого убедитесь, что машины могут взаимодействовать друг с другом. Вам нужно будет выбрать главную машину (машину, с которой будут общаться остальные). Запишите ее адрес (`master_addr`) и выберите порт (`master_port`). В примере ниже я буду использовать `master_addr = 192.168.1.1` и `master_port = 1234`. Чтобы использовать его, вы можете сделать следующее: где `G` - количество GPU на машине, `N` - количество машин, а `R` - номер машины из `0...(N-1)`. Допустим, у меня есть две машины с двумя GPU на каждой, тогда `G = 2`, `N = 2` и `R = 1` для вышесказанного. Обучение не начнется, пока не будут подключены **все** `N` машин. Результаты будут отображаться только на главной машине!Примечания
- Поддержка Windows не проверена, рекомендуется использовать Linux.
--batch
должно быть кратно количеству графических процессоров.- GPU 0 будет занимать немного больше памяти, чем другие GPU, поскольку он поддерживает EMA и отвечает за контрольные точки и т.д.
- Если вы получите
RuntimeError: Address already in use
Это может быть связано с тем, что вы проводите несколько тренировок одновременно. Чтобы исправить это, просто используйте другой номер порта, добавив--master_port
как ниже:
Результаты
Результаты профилирования DDP на экземпляре AWS EC2 P4d с 8x A100 SXM4-40GB для YOLOv5l для 1 эпохи COCO.
Профилирование кода
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --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
Графические процессоры A100 |
размер партии | CUDA_mem device0 (G) |
Поезд COCO |
COCO val |
---|---|---|---|---|
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 Облако: Руководство по быстрому запуску GCP
- Amazon: Руководство по быстрому запуску AWS
- Azure: Руководство по быстрому запуску AzureML
- Docker: Руководство по быстрому запуску Docker
Статус проекта
Этот значок означает, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти CI-тесты тщательно проверяют функциональность и производительность YOLOv5 по различным ключевым аспектам: обучение, валидация, вывод, экспорт и контрольные показатели. Они обеспечивают стабильную и надежную работу на macOS, Windows и Ubuntu, причем тесты проводятся каждые 24 часа и при каждом новом коммите.
Кредиты
Мы хотели бы поблагодарить @MagicFrogSJTU, который сделал всю тяжелую работу, и @glenn-jocher за то, что направлял нас на этом пути.
См. также
- Режим тренировки - узнайте о тренировке моделей YOLO с помощью Ultralytics
- Настройка гиперпараметров - оптимизация производительности вашей модели
- Руководство по быстрому запуску Docker - настройка среды Docker для обучения