Ultralytics YOLO27:
Get Started

YOLOv5 멀티 GPU 학습#

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

시작하기 전에#

리포지토리를 복제하고 Python>=3.8.0 환경에서 requirements.txt를 설치합니다. 여기에는 PyTorch>=1.8이 포함됩니다. 모델과 데이터셋은 최신 YOLOv5 릴리스에서 자동으로 다운로드됩니다.

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은 PyTorch >= 1.9에서 torch.distributed.launch을 대체합니다. 자세한 내용은 PyTorch 분산 학습 문서를 참조하세요.

학습#

학습을 시작할 사전 학습 모델을 선택합니다. 여기서는 작고 빠른 모델인 YOLOv5s를 선택합니다. 모든 모델을 자세히 비교하려면 README의 표를 참조하세요. 이 모델은 COCO 데이터셋으로 멀티 GPU 학습을 진행합니다.

YOLOv5 Models

단일 GPU#

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

DataParallel 모드를 활성화하려면 여러 GPU ID를 --device에 전달합니다:

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

DataParallel은 느리며 단일 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은 사용할 GPU 수입니다. 위 예시에서는 2입니다.
  • --batch은 전체 배치 크기이며, 각 GPU에 균등하게 분배됩니다. 위 예시에서는 GPU당 64 / 2 = 32입니다.

위 명령은 GPU 0...(N-1)을 사용합니다. 대신 환경 변수를 통해 디바이스 표시 여부를 제어하려면 실행 전에 CUDA_VISIBLE_DEVICES=2,3(또는 다른 목록)을 설정합니다.

특정 GPU 사용(클릭하여 펼치기)

--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
SyncBatchNorm 사용(클릭하여 펼치기)

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
여러 머신 사용(클릭하여 펼치기)

멀티 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 수의 배수여야 합니다.

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

  • RuntimeError: Address already in use 오류가 발생하면 일반적으로 여러 학습 실행이 동일한 포트를 사용하고 있다는 의미입니다. --master_port을 사용해 다른 포트를 지정합니다:

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

결과#

YOLOv5l을 대상으로 COCO 에포크 1회 실행 시, A100 SXM4-40GB 8개가 장착된 AWS EC2 P4d 인스턴스에서 측정한 DDP 프로파일링 결과입니다.

코드 프로파일링
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --ipc=host --device nvidia.com/gpu=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
배치 크기CUDA_mem
device0 (G)
COCO
학습
COCO
검증
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

결과에서 볼 수 있듯이, 여러 GPU에서 DistributedDataParallel을 사용하면 학습 속도가 거의 선형적으로 향상됩니다. GPU 8개를 사용하면 장치당 메모리 사용량은 동일하게 유지하면서 단일 GPU를 사용할 때보다 약 6.5배 빠르게 학습을 완료합니다.

지원 환경#

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

프로젝트 상태#

YOLOv5 CI

이 배지는 모든 YOLOv5 GitHub Actions 지속적 통합(CI) 테스트가 성공적으로 통과했음을 나타냅니다. 이 CI 테스트는 학습, 검증, 추론, 내보내기, 벤치마크 등 여러 주요 측면에서 YOLOv5의 기능과 성능을 철저히 확인합니다. 테스트는 24시간마다 그리고 새 커밋이 있을 때마다 실행되어 macOS, Windows, Ubuntu에서 일관되고 안정적으로 작동하는지 확인합니다.

크레딧#

많은 작업을 맡아 주신 @MagicFrogSJTU와 작업 전반을 안내해 주신 @glenn-jocher에게 감사드립니다.

관련 항목#

자주 묻는 질문#

이슈를 열기 전에 아래 체크리스트를 확인하세요. 확인하면 시간을 절약할 수 있는 경우가 많습니다.

체크리스트(클릭하여 펼치기)
  • 이 가이드를 처음부터 끝까지 읽으셨나요?
  • 코드베이스를 다시 클론하셨나요? 코드는 매일 변경됩니다.
  • 오류 메시지를 검색해 보셨나요? 다른 사용자가 이미 같은 문제를 겪고 해결 방법을 공유했을 수 있습니다.
  • 올바른 Python 및 PyTorch 버전을 포함해 모든 요구 사항을 설치하셨나요?
  • 위에 나열된 지원 환경 중 하나를 사용해 보셨나요?
  • 근본 원인을 파악하기 위해 coco128 또는 coco2017과 같은 표준 데이터셋을 사용해 보셨나요?

위의 항목을 모두 확인했다면 템플릿에 따라 가능한 한 자세한 내용을 포함해 Issue를 여세요.

댓글