Мульти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,Использование нескольких машин (нажмите, чтобы развернуть)
This is **only** available for Multiple GPU DistributedDataParallel training. Before we continue, make sure the files on all machines are the same, dataset, codebase, etc. Afterward, make sure the machines can communicate to each other. You will have to choose a master machine(the machine that the others will talk to). Note down its address(`master_addr`) and choose a port(`master_port`). I will use `master_addr = 192.168.1.1` and `master_port = 1234` for the example below. To use it, you can do as the following, where `G` is number of GPU per machine, `N` is the number of machines, and `R` is the machine number from `0...(N-1)`. Let's say I have two machines with two GPUs each, it would be `G = 2` , `N = 2`, and `R = 1` for the above. Training will not start until все Подключено `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 за то, что направлял нас на этом пути.