cuda의 수많은 에러들..
OOM (out of memory)
- 공포의 단어
- 왜 발생했는지 알기 어려움
- 어디서 발생했는지 알기 어려움
- Error backtracking이 이상한 곳으로 감
- 컴퓨터는 거짓말하지 않으나, GPU는 거짓말을 함
해결방법
- Batch size 감소
- GPU claen
- 그래도 안된다면..
GPUtill
- nvidia-smi 처럼 GPU의 상태를 보여주는 모듈
!pip install GPUtil
import GPUtil
GPUtil.showUtilization()
- iteration 마다 넣어서 메모리의 변화를 확인해보자
torch.cuda.empty_cache()
- 사용되지 않은 GPU상 cashe 정리
- del과는 구분이 필요
- reset 대신 쓰기 좋은 함수
- loop 전에 한번 실행해서 메모리를 정리하면 좋음
tensor
- training loop에 tensor로 축적되는 변수는 확인할 것
- 1-d tensor의 경우 python의 기본 객체로 변환하여 처리할 것
(item, float 등)
del
- 필요가 없어진 변수는 적절한 삭제가 필요
- python의 메모리 배치 특성상 loop이 끝나도 메모리를 차지함
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()
에러
- CUDNN_STATUS_NOT_INIT
- device-side-assert
- 해당 에러들도 cuda와 관련하여 OOM의 일종이며, 적절한 코드 처리가 필요함
그 외
- colab에서 너무 큰 사이즈는 실행하지 말 것 (CNN,LSTM 등)
- CNN의 대부분 에러는 크기가 안맞아서 생김 (torchsummary 등으로 사이즈를 맞출 것)
- tensor의 float precision을 16bit로 줄일 수도 있음