콘텐츠로 건너뛰기

YOLOv5를 사용한 다중 GPU 훈련

이 가이드는 단일 또는 여러 장비에서 YOLOv5 🚀로 데이터 세트를 훈련하기 위해 여러 GPU를 올바르게 사용하는 방법을 설명합니다.

시작하기 전에

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

ProTip!

Docker 이미지 은 모든 Multi-GPU 학습에 권장됩니다. 다음을 참조하십시오. Docker 빠른 시작 가이드 Docker Pulls

ProTip!

torch.distributed.run 다음으로 대체됩니다. torch.distributed.launch 에서 PyTorch>=1.9. 다음을 참조하십시오. PyTorch 분산 문서 자세한 내용은 참조하십시오.

훈련

학습을 시작할 사전 학습된 모델을 선택합니다. 여기서는 사용 가능한 가장 작고 빠른 모델인 YOLOv5s를 선택합니다. 모든 모델의 전체 비교는 README 를 참조하십시오. COCO 데이터 세트에서 Multi-GPU를 사용하여 이 모델을 학습합니다.

YOLOv5 모델

단일 GPU

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

다음을 늘릴 수 있습니다. device DataParallel 모드에서 여러 GPU를 사용합니다.

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

이 방법은 느리고 GPU 1개만 사용하는 것에 비해 학습 속도가 거의 향상되지 않습니다.

다음을 전달해야 합니다. 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).

특정 GPU 사용 (클릭하여 확장) `--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://docs.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, simply 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
여러 장비 사용 (클릭하여 확장) 이 기능은 다중 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가 2개인 머신이 2대 있는 경우 위에서 `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에 대해 1 COCO epoch 동안 8x A100 SXM4-40GB를 사용하는 AWS EC2 P4d 인스턴스에서 DDP 프로파일링 결과입니다.

프로파일링 코드
# 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
GPU
A100
배치 크기 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

오류가 발생하면 먼저 아래 체크리스트를 확인하십시오! (시간을 절약할 수 있습니다)

체크리스트 (클릭하여 확장) - 이 게시물을 제대로 읽었습니까? - 코드베이스를 다시 복제해 보셨습니까? 코드는 **매일** 변경됩니다. - 오류를 검색해 보셨습니까? 다른 사람이 이미 이 저장소 또는 다른 저장소에서 오류를 발견하고 해결 방법을 찾았을 수 있습니다. - 상단에 나열된 모든 요구 사항(올바른 python 및 PyTorch 버전 포함)을 설치했습니까? - 아래 "환경" 섹션에 나열된 다른 환경에서 시도해 보셨습니까? - coco128 또는 coco2017과 같은 다른 데이터 세트로 시도해 보셨습니까? 근본 원인을 더 쉽게 찾을 수 있습니다. 위의 모든 단계를 거쳤다면 템플릿에 따라 가능한 한 자세한 정보를 제공하여 문제를 제기하십시오.

지원되는 환경

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

프로젝트 상태

YOLOv5 CI

이 배지는 모든 YOLOv5 GitHub Actions 지속적 통합(CI) 테스트가 성공적으로 통과되었음을 나타냅니다. 이러한 CI 테스트는 학습, 유효성 검사, 추론, 내보내기벤치마크와 같은 다양한 주요 측면에서 YOLOv5의 기능과 성능을 엄격하게 검사합니다. macOS, Windows 및 Ubuntu에서 일관되고 안정적인 작동을 보장하며, 테스트는 24시간마다 그리고 새로운 커밋마다 수행됩니다.

제작자

모든 어려운 작업을 수행한 @MagicFrogSJTU와 저희를 지도해주신 @glenn-jocher에게 감사드립니다.

참고



📅 1년 전에 생성됨 ✏️ 2개월 전에 업데이트됨

댓글