[딥러닝] Pytorch Troubleshooting (GPU)
1. OOM
- Out ouf Memory
- 왜/어디서 발생했는지 알기 어려움/ Error Backtracking이 이상한데로감 / 메모리의 이전 상황의 파악이 어려움
- 이터레이션을 돌면서 문제가 생기는 경우가 많다
2. 해결방안
1) batch size를 줄이기→ GPU clean → Run
2) GPU Util 사용하기
- nvidia-smi처럼 GPU의 상태를 보여주는 모듈
- Colab은 환경에서 GPU 상태 보여주기 편함
- iter마다 메모리가 늘어나는지 확인!!
!pip install GPUtil
import GPUtil
GPUtil.showUtilization()
3) 사용되지 않은 GPU상 cache를 정리
torch.cuda.empty_cache()
- 가용 메모리를 확보
- del 과는 구분이 필요
- reset 대신 쓰기 좋은 함수
4) trainning loop에 tensor로 축적되는 변수는 확인
- 1차원의 경우 python 기본 객체로 변환하여 처리할 것 : .item / .float 사용
5) del 명령어 적절히 사용
- 필요가 없어진 변수는 적절한 삭제가 필요함
- python의 메모리 배치 특성상 loop이 끝나도 메모리를 차지함
6) 학습시 oom이 발생하면 batch 사이즈를 1로 해서 실험해보기
oom = False
try:
run_model(batch_size)
except RuntimeError: # out of memory
oom = True
if oom:
for _ in range(batch_size):
run_model(1)
7) torch.no_grad() 사용하기
- inference 시점에서는 torch.no_grad() 사용: 습관적으로 사용!
- backward pass로 인해 쌓이는 메모리에서 자유로움
with torch.no_grad():
for data, target in test_loader:
output = network(data)
test_loss= += F.nll_loss(output, target, size_average=False).item()
pred = output.data.max(1, keepdim=True)[1]
correct += pred.eq(target.data.view_as(pred)).sum()
3. 그외 문제들
- CUDNN_STATUS_NOT_INIT이나 device-side-assert 등
- 해당 에러도 cuda와 관련하여 oom의 일종으로 생각될 수 있으며, 적절한 코드 처리 필요
4. 주의점
- colab에서 너무 큰 사이즈는 실행하지 말 것 (linear, CNN, LSTM) - 요즘은 transformer를 써서 lstm잘 안씀
- CNN의 대부분의 에러는 크기가 안 맞아서 생기는 경우(torchsummary 등을오 사이즈를 맞출 것)
- tensor의 float precision을 16bit로 줄일 수도 있음
※ 참고자료 : [네이버 부스트코스] 인공지능 기초다지기 (AI Basic)