YOLOv5를 사용한 멀티 GPU 학습

이 가이드에서는 단일 머신 또는 여러 머신에서 여러 GPU를 사용하여 YOLOv5를 학습하는 방법을 설명합니다.

시작하기 전에

Clone repo and install requirements.txt in a Python>=3.8.0 environment, including PyTorch>=1.8. Models and datasets download automatically from the latest YOLOv5 release.

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Docker 사용

모든 멀티 GPU 학습 실행에는 Ultralytics Docker 이미지를 권장합니다. Docker 시작 가이드를 참조하십시오. Docker Pulls

PyTorch >= 1.9

torch.distributed.run replaces torch.distributed.launch in PyTorch >= 1.9. See the PyTorch distributed documentation for details.

학습

학습을 시작할 사전 학습된 모델을 선택하십시오. 여기에서는 사용 가능한 모델 중 가장 작고 빠른 YOLOv5s를 선택합니다. 모든 모델에 대한 전체 비교는 README 를 참조하십시오. 이 모델을 COCO 데이터셋에서 멀티 GPU로 학습할 것입니다.

YOLOv5 Models

단일 GPU

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

멀티 GPU DataParallel 모드 (⚠️ 권장하지 않음)

DataParallel 모드를 활성화하려면 --device에 여러 GPU ID를 전달하십시오:

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

DataParallel은 속도가 느리며 단일 GPU를 사용하는 것에 비해 학습 속도가 거의 향상되지 않습니다.

멀티 GPU DistributedDataParallel 모드 (✅ 권장)

학습 명령어 앞에 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는 사용할 GPU의 수입니다. 위 예시에서는 2입니다.
  • --batch는 총 배치 크기이며 각 GPU에 균등하게 나누어집니다. 위 예시에서는 GPU당 64 / 2 = 32입니다.

위 명령어는 GPU 0...(N-1)을 사용합니다. 환경 변수를 통해 장치 가시성을 제어하려면 실행 전에 CUDA_VISIBLE_DEVICES=2,3(또는 기타 목록)을 설정하십시오.

Use specific GPUs (click to expand)

--device 다음에 특정 GPU ID를 전달하십시오. 아래 예시는 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
Use SyncBatchNorm (click to expand)

SyncBatchNorm은 멀티 GPU 학습 시 정확도를 높일 수 있지만, 학습 속도가 상당히 느려집니다. 이는 멀티 GPU DistributedDataParallel 학습에서만 사용 가능합니다.

GPU의 배치 크기가 작을 때(<= 8) 가장 효과적입니다.

SyncBatchNorm을 활성화하려면 --sync-bn을 전달하십시오:

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
Use Multiple machines (click to expand)

이는 멀티 GPU DistributedDataParallel 학습에서만 사용 가능합니다.

계속하기 전에 모든 머신에서 데이터셋, 코드베이스 및 기타 종속성이 일치하는지 확인하고, 네트워크를 통해 머신 간 통신이 가능한지 검증하십시오.

마스터 머신(다른 머신들이 연결될 머신)을 선택하고 주소(master_addr)를 기록한 후 포트(master_port)를 정하십시오. 아래 예시는 master_addr = 192.168.1.1master_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은 머신 수, R0...(N-1) 범위 내의 머신 순위입니다. 예를 들어, 두 대의 머신이 있고 각각 두 개의 GPU가 있는 경우, 두 번째 머신에서 G = 2, N = 2, R = 1로 설정하십시오.

모든 N개의 머신이 연결될 때까지 학습이 시작되지 않습니다. 출력은 마스터 머신에만 표시됩니다.

참고 사항

  • Windows 지원은 테스트되지 않았으며 Linux를 권장합니다.

  • --batch는 GPU 수의 배수여야 합니다.

  • GPU 0은 EMA를 유지하고 체크포인트를 처리하기 때문에 다른 GPU보다 메모리를 약간 더 많이 사용합니다.

  • RuntimeError: Address already in use 오류가 발생하면 일반적으로 여러 학습 프로세스가 같은 포트를 사용하고 있음을 의미합니다. --master_port를 사용하여 다른 포트를 지정하십시오:

    python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Results

DDP profiling results on an AWS EC2 P4d instance with 8x A100 SXM4-40GB for YOLOv5l for 1 COCO epoch.

Profiling code
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --runtime=nvidia --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
GPU
A100
batch-sizeCUDA_mem
device0 (G)
COCO
train
COCO
val
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

결과에서 볼 수 있듯이 여러 GPU와 함께 DistributedDataParallel을 사용하면 학습 속도가 거의 선형적으로 확장됩니다. 8개의 GPU를 사용하면 단일 GPU를 사용할 때보다 학습 속도가 약 6.5배 빨라지면서도 장치당 동일한 메모리 사용량을 유지합니다.

FAQ

이슈를 생성하기 전에 아래 체크리스트를 읽어보십시오. 시간을 절약할 수 있습니다.

Checklist (click to expand)
  • 이 가이드를 처음부터 끝까지 읽으셨습니까?
  • 코드베이스를 다시 복제하셨습니까? 코드는 매일 변경됩니다.
  • 오류 메시지를 검색해보셨습니까? 이미 동일한 문제를 겪고 해결책을 공유한 사용자가 있을 수 있습니다.
  • 모든 요구 사항(올바른 Python 및 PyTorch 버전 포함)을 설치하셨습니까?
  • 아래 나열된 지원 환경 중 하나를 시도해보셨습니까?
  • 근본 원인을 파악하기 위해 coco128이나 coco2017과 같은 더 작은 데이터셋을 사용해보셨습니까?

위의 모든 사항을 확인한 후에도 해결되지 않는다면, 템플릿에 따라 최대한 상세한 정보를 포함하여 이슈를 생성해주십시오.

지원되는 환경

Ultralytics는 프로젝트를 빠르게 시작할 수 있도록 CUDA, CUDNN, Python, PyTorch와 같은 필수 종속성이 미리 설치된 다양한 바로 사용 가능한 환경을 제공합니다.

프로젝트 상태

YOLOv5 CI

이 배지는 모든 YOLOv5 GitHub Actions CI(지속적 통합) 테스트가 성공적으로 통과되었음을 나타냅니다. 이러한 CI 테스트는 학습, 검증, 추론, 내보내기벤치마크를 포함한 YOLOv5의 다양한 핵심 기능과 성능을 엄격하게 점검합니다. 테스트는 24시간마다 그리고 새로운 커밋이 있을 때마다 수행되며, macOS, Windows 및 Ubuntu에서 일관되고 안정적인 운영을 보장합니다.

크레딧

힘든 작업을 모두 수행해주신 @MagicFrogSJTU님과, 그 과정에서 저희를 이끌어주신 @glenn-jocher님께 감사드립니다.

참고

댓글