Мульти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. См. docs для деталей.
Обучение
Выберите предварительно обученную модель для начала обучения. Здесь мы выбрали 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, simple 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 |
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Если возникла ошибка, пожалуйста, сначала прочитайте приведенный ниже контрольный список! (Это может сэкономить ваше время)
Контрольный список (нажмите, чтобы развернуть)
- Вы правильно прочитали этот пост?
- Вы пытались переклонировать кодовую базу? Код меняется ежедневно.
- Вы пробовали искать ошибку? Возможно, кто-то уже сталкивался с ней в этом или другом репозитории и имеет решение.
- Установлены ли все требования, перечисленные вверху (включая правильные версии 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 за то, что направлял нас на этом пути.