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모든 멀티 GPU 학습 실행에는 Ultralytics Docker 이미지를 권장합니다. Docker 시작 가이드를 참조하십시오.
torch.distributed.run replaces torch.distributed.launch in PyTorch >= 1.9. See the PyTorch distributed documentation for details.
학습
학습을 시작할 사전 학습된 모델을 선택하십시오. 여기에서는 사용 가능한 모델 중 가장 작고 빠른 YOLOv5s를 선택합니다. 모든 모델에 대한 전체 비교는 README 표를 참조하십시오. 이 모델을 COCO 데이터셋에서 멀티 GPU로 학습할 것입니다.

단일 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,1DataParallel은 속도가 느리며 단일 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,3Use 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-bnUse Multiple machines (click to expand)
이는 멀티 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 ...
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-size | CUDA_mem device0 (G) | COCO train | COCO val |
|---|---|---|---|---|
| 1x | 16 | 26GB | 20:39 | 0:55 |
| 2x | 32 | 26GB | 11:43 | 0:57 |
| 4x | 64 | 26GB | 5:57 | 0:55 |
| 8x | 128 | 26GB | 3:09 | 0:57 |
결과에서 볼 수 있듯이 여러 GPU와 함께 DistributedDataParallel을 사용하면 학습 속도가 거의 선형적으로 확장됩니다. 8개의 GPU를 사용하면 단일 GPU를 사용할 때보다 학습 속도가 약 6.5배 빨라지면서도 장치당 동일한 메모리 사용량을 유지합니다.
FAQ
이슈를 생성하기 전에 아래 체크리스트를 읽어보십시오. 시간을 절약할 수 있습니다.
Checklist (click to expand)
- 이 가이드를 처음부터 끝까지 읽으셨습니까?
- 코드베이스를 다시 복제하셨습니까? 코드는 매일 변경됩니다.
- 오류 메시지를 검색해보셨습니까? 이미 동일한 문제를 겪고 해결책을 공유한 사용자가 있을 수 있습니다.
- 모든 요구 사항(올바른 Python 및 PyTorch 버전 포함)을 설치하셨습니까?
- 아래 나열된 지원 환경 중 하나를 시도해보셨습니까?
- 근본 원인을 파악하기 위해
coco128이나coco2017과 같은 더 작은 데이터셋을 사용해보셨습니까?
위의 모든 사항을 확인한 후에도 해결되지 않는다면, 템플릿에 따라 최대한 상세한 정보를 포함하여 이슈를 생성해주십시오.
지원되는 환경
Ultralytics는 프로젝트를 빠르게 시작할 수 있도록 CUDA, CUDNN, Python, PyTorch와 같은 필수 종속성이 미리 설치된 다양한 바로 사용 가능한 환경을 제공합니다.
- 무료 GPU 노트북:
- Google Cloud: GCP 시작 가이드
- Amazon: AWS 시작 가이드
- Azure: AzureML 시작 가이드
- Docker: Docker 시작 가이드
프로젝트 상태
이 배지는 모든 YOLOv5 GitHub Actions CI(지속적 통합) 테스트가 성공적으로 통과되었음을 나타냅니다. 이러한 CI 테스트는 학습, 검증, 추론, 내보내기 및 벤치마크를 포함한 YOLOv5의 다양한 핵심 기능과 성능을 엄격하게 점검합니다. 테스트는 24시간마다 그리고 새로운 커밋이 있을 때마다 수행되며, macOS, Windows 및 Ubuntu에서 일관되고 안정적인 운영을 보장합니다.
크레딧
힘든 작업을 모두 수행해주신 @MagicFrogSJTU님과, 그 과정에서 저희를 이끌어주신 @glenn-jocher님께 감사드립니다.
참고
- 학습 모드 - Ultralytics로 YOLO 모델을 학습하는 방법 알아보기
- 하이퍼파라미터 튜닝 - 모델의 성능 최적화
- Docker 시작 가이드 - 학습을 위한 Docker 환경 설정