import os
import torch
import torch.distributed as dist
from ultralytics import YOLO
# DDP(Distributed Data Parallel) 환경을 설정하는 함수
def setup_ddp():
dist.init_process_group(
backend='mpi', # Jetson에서는 gloo 또는 mpi 사용 가능, mpi 사용
init_method=f"tcp://{os.environ['MASTER_ADDR']}:{os.environ['MASTER_PORT']}", # 마스터 노드의 주소와 포트
world_size=int(os.environ['WORLD_SIZE']), # 전체 학습 노드 개수
rank=int(os.environ['RANK']) # 현재 노드의 순서 (마스터는 0, 나머지는 1, 2, ...)
)
# 현재 노드에서 사용할 GPU 설정 (각 노드가 1개 GPU 사용하도록 설정)
torch.cuda.set_device(int(os.environ['RANK']) % torch.cuda.device_count())
# DDP 프로세스를 종료하는 함수
def cleanup_ddp():
"""
DDP 프로세스 그룹을 정리하는 함수 (???)
학습이 끝나면 반드시 호출해야 한다고 함...
"""
dist.destroy_process_group()
if __name__ == "__main__":
setup_ddp() # DDP 환경 초기화
# YOLO 모델 로드
model = YOLO('/home/jiayuan/yolom/ultralytics/models/v8/yolov8-bdd-v4-one-dropout-individual-n.yaml', task='multi')
# YOLO 모델 학습 시작
model.train(
data='/home/jiayuan/yolom/ultralytics/datasets/bdd-multi.yaml', # 학습 데이터셋 경로
batch=???, # 배치 크기 (각 노드에서 처리할 이미지 개수)
# 각 노드에서 사용될 배치 크기를 총 배치 크기 ÷ 노드 개수로 설정하면 됨
epochs=300,
imgsz=(640, 640),
device=[0], # 각 노드에서 사용할 GPU (RANK에 따라 자동 분배됨)
name='yolopm',
val=True,
task='multi',
classes=[2, 3, 4, 9, 10, 11],
combine_class=[2, 3, 4, 9],
single_cls=True
)
cleanup_ddp() # DDP 정리