728x90
반응형
딥러닝으로 분류모델 학습도중, validation accuracy가
n epoch =>. "class A" Acc: 98.21%, "class B" Acc: 98.67%
n+1 epoch => "class A" Acc: 28.96%, "class B" Acc: 99.88%
이렇게 데이터가 적은 쪽 클래스의 정확도가 대폭 감소하는 현상이 발생했습니다.
원인을 찾아보니 num_workers의 값이 크면 발생할 수 있는 현상이라고 합니다.
- num_workers란?
num_workers는 PyTorch의 DataLoader가 데이터를 로드할 때 사용할 서브 프로세스(worker)의 개수를 의미합니다.
기본적으로 DataLoader는 데이터를 배치 단위로 불러오는데, num_workers를 늘리면 여러 개의 프로세스가 병렬로 데이터를 로드해서 속도를 높힐 수 있다는 장점이 있습니다.
- num_workers=0 vs num_workers>0
- num_workers=0:
- 싱글 프로세스에서 데이터를 로드 (메인 프로세스가 직접 데이터 로드)
- 데이터가 하나씩 순차적으로 로드됨 → 느림
- 디버깅할 때 사용하기 좋음 (멀티프로세싱 관련 오류 방지)
- num_workers>0:
- 멀티프로세싱을 사용해서 데이터를 병렬로 로드
- 여러 worker가 동시에 데이터를 로드 → 속도 증가
- 단, 너무 많으면 CPU 과부하 및 I/O 병목 발생 가능
- num_workers가 성능에 간접적으로 영향을 줄 수 있는 이유는?
1. data shuffle에서의 문제 발생
- num_workers가 너무 많거나 설정이 잘못되면 DataLoader의 shuffle=True가 제대로 동작하지 않을 수도 있음.
- 이 경우 특정 클래스(개수가 더 많은 클래스) 데이터가 연속으로 쌓여서 모델이 한쪽으로 편향될 수 있음.
- 특히 한 클래스의 데이터가 희소한 경우, 데이터가 고르게 섞이지 않으면 모델이 과적합되면서 데이터 수가 더 많은 클래스의 Accuracy가 낮아질 가능성이 있음.
2. I/O 병목으로 인해 데이터 로딩이 지연됨
- 데이터가 일부 배치에서 누락되거나 DataLoader가 불안정하게 동작하면 모델 성능이 일관되지 않을 수도 있음
3. 특정 클래스 데이터 손실 가능성
- num_workers가 높으면 멀티프로세싱으로 데이터를 병렬 로드하는 과정에서 일부 데이터가 손실될 가능성이 있음.
- 특히 drop_last=True를 설정했다면 데이터수가 적은 클래스의 데이터가 일부 배치에서 빠지는 경우가 생길 수도 있음.
- 이 경우 모델이 작은 데이터를 충분히 학습하지 못해서 데이터가 더 적은 클래스의 Accuracy가 낮아질 가능성이 있음.
보통 적절한 값은 4~8 사이라고 하고,
실제로 num_workers의 값을 16-> 8로 변경했을때 학습이 좀 더 안정적으로 진행되었고 validation accuracy의 변동폭도 감소했습니다.
728x90
반응형
'Pytorch' 카테고리의 다른 글
[Pytorch] 메모리 효율적으로 사용하기 (3) | 2024.08.30 |
---|---|
[Pytorch] Inference Time Check (0) | 2023.02.24 |
[Pytorch] loss nan 해결하기 (0) | 2023.02.24 |
[Pytorch] Tensor Manipulation (0) | 2023.02.24 |
[Pytorch] TorchVision Fine Tuning (0) | 2023.02.05 |