Перейти к содержанию

Мульти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 Docker Pulls

💡 ПроТип! torch.distributed.run заменяет torch.distributed.launch в PyTorch>=1.9. См. docs для деталей.

Обучение

Выберите предварительно обученную модель для начала обучения. Здесь мы выбрали YOLOv5s, самую маленькую и быструю из доступных моделей. Полное сравнение всех моделей приведено в таблице README. Мы будем обучать эту модель с помощью Multi-GPU на наборе данных COCO.

YOLOv5 Модели

Одиночка GPU

python train.py  --batch 64 --data coco.yaml --weights yolov5s.pt --device 0

Вы можете увеличить device для использования нескольких графических процессоров в режиме DataParallel.

python train.py  --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1

Этот метод медленный и почти не ускоряет обучение по сравнению с использованием только 1 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`.
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://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,
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 ''
где `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 как ниже,
python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Результаты

Результаты профилирования 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для запуска ваших проектов.

Статус проекта

YOLOv5 CI

Этот значок означает, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти CI-тесты тщательно проверяют функциональность и производительность YOLOv5 по различным ключевым аспектам: обучение, валидация, вывод, экспорт и контрольные показатели. Они обеспечивают стабильную и надежную работу на macOS, Windows и Ubuntu, причем тесты проводятся каждые 24 часа и при каждом новом коммите.

Кредиты

Мы хотели бы поблагодарить @MagicFrogSJTU, который сделал всю тяжелую работу, и @glenn-jocher за то, что направлял нас на этом пути.

📅 Создано 1 год назад ✏️ Обновлено 1 месяц назад

Комментарии