МультиGPU тренировка
📚 Это руководство объясняет, как правильно использовать несколько 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
💡 ПроТип! Образ докера рекомендуется для всех тренировок Multi-GPU . Смотри Руководство по быстрому запуску Docker
💡 ПроТип! torch.distributed.run
Заменяет torch.distributed.launch
на сайте PyTorch>=1.9. Смотри docs подробнее.
Тренировка
Выбери предварительно обученную модель, с которой начнешь обучение. Здесь мы выбрали YOLOv5s, самую маленькую и быструю из доступных моделей. Полное сравнение всех моделей смотри в нашей таблице README. Мы будем тренировать эту модель с помощью Multi-GPU на наборе данных COCO.
Одиночка GPU
МультиGPU DataParallel Mode (⚠️ не рекомендуется).
Ты можешь увеличить device
чтобы использовать несколько GPU в режиме DataParallel.
Этот метод медленный и почти не ускоряет тренировку по сравнению с использованием всего 1 GPU.
МультиGPU DistributedDataParallel Mode (✅ рекомендуется).
Тебе придется пройти 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 profiling results on an AWS EC2 P4d instance with 8x A100 SXM4-40GB for YOLOv5l for 1 COCO epoch.
Профилирующий код
# 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 за то, что направлял нас на этом пути.