Перейти к содержимому

Обучение работе с несколькими графическими процессорами

📚 Это руководство объясняет, как правильно использовать несколько 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 Docker Pulls

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

Тренировка

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

YOLOv5 Модели

Одиночный графический процессор

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

Ты можешь увеличить device чтобы использовать несколько GPU в режиме 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 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 за то, что направлял нас на этом пути.



Создано 2023-11-12, Обновлено 2023-12-03
Авторы: glenn-jocher (2)

Комментарии