본문 바로가기

미연시리뷰

재현성을 위해 필요한 것

1) torch backends cudnn :

torch.backends.cudnn.benchmark = True
# torch.backends.cudnn.deterministic = True

 

물론 GPU에서 실행할 때 코드 스니펫의 각 설정이 PyTorch 모델의 실행 및 동작에 어떻게 영향을 미치는지 살펴봅시다.

### 1. 'torch.백엔드.cud.determin주의=True'
- **그것이 하는 일**: 이 설정은 동일한 설정(동일한 입력 데이터, 동일한 모델 아키텍처, 동일한 파라미터 초기화)으로 모델을 실행할 때마다 정확히 동일한 결과를 얻을 수 있도록 보장한다. 이것은 모든 GPU 연산이 결정론적 알고리즘을 사용하도록 강제함으로써 달성된다.
- **중요한 이유**: 재현성을 위해서는 매우 중요합니다. 예를 들어, 연구 중이거나 모델을 디버깅해야 하는 경우, 각 실행에서 모델이 동일하게 동작한다는 사실을 알면 문제를 파악하고 개선 사항을 안정적으로 확인할 수 있습니다.
- **부작용**: 결정론적 연산만 사용하면 연산 속도를 줄일 수 있습니다. 연산을 더 빠르게 만들지만 약간 예측할 수 없는 특정 최적화를 허용하지 않기 때문입니다.

**참고**: 코드에서 이 행은 주석 처리되지 않습니다('#torch.backends.cudn.determin주의 =True'). 재현성을 위해 완전한 결정론이 필요하다면 이 행에 주석 처리를 해제해야 합니다.

### 2. 'torch.백엔드.cud.benchmark =True'
- **그것이 하는 일**: 이 설정을 통해 PyTorch는 특정 하드웨어에서 특정 모델에 가장 효율적인 알고리즘을 자동으로 찾을 수 있다. 이는 특히 모델의 입력 크기가 고정되어 있을 때 유용하며, PyTorch는 다양한 알고리즘을 "벤치마크"하고 가장 빠른 알고리즘을 선택할 수 있다.
- **중요한 이유**: 실제 모델과 데이터를 기반으로 계산 경로를 최적화하기 때문에 모델 학습과 추론 속도를 크게 높일 수 있습니다.
- **부작용**: 선택된 알고리즘은 비결정론적일 수 있으며, 이는 동일한 입력 데이터라도 모델을 여러 번 실행하면 약간 다른 결과를 생성할 수 있음을 의미한다.

### 함께 일하기
- **Current setup**: 'torch.backends.cudnn.deterministic'이 주석 처리되고 'torch.backends.cudn.benchmark'가 True로 설정되어 있으므로 재현성보다 성능을 우선시합니다. 이 구성은 훈련 속도가 중요한 시나리오에 적합하며, 실행 간 출력의 사소한 변화도 허용됩니다.
- **잠재적 문제**: 프로젝트에서 비교, 검증 또는 게시에 대한 정확한 재현성이 필요한 경우 선택한 알고리즘의 비결정론적 특성으로 인해 현재 설정에서 실행 간에 약간 다른 결과가 나올 수 있기 때문에 문제가 발생할 수 있습니다.

### 요약
요약하면, 현재 코드 설정(결정론적 주석이 달린 상태에서 벤치마크가 활성화된 상태에서)은 속도에 최적화되어 모델의 작동에 사용할 수 있는 가장 효율적인 GPU 알고리즘을 활용한다. 재현성이 필요한 경우에는 주석을 해제하여 결정론적 설정을 활성화하고 여러 실행에서 일관된 결과를 보장하기 위해 벤치마크를 'False'로 설정하는 것을 고려해야 한다.

 

 

2) worker init

def worker_init_fn(worker_id, num_workers, rank, seed):
    # Set the worker seed to num_workers * rank + worker_id + seed
    worker_seed = num_workers * rank + worker_id + seed
    np.random.seed(worker_seed)
    random.seed(worker_seed)

 

3) seed 고정

def set_random_seed(seed):
    """Set random seeds."""
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)

'미연시리뷰' 카테고리의 다른 글

getattr in HNCT  (0) 2024.03.02
[ViT-PE] RPE  (2) 2023.12.05
[Optical flow] GMFlow  (0) 2023.10.16
[통계 정리] 확통 사이트 및 개념  (0) 2023.06.09
[알고리즘] P & NP  (0) 2023.06.08