부스트캠프 AI Tech 4기
[PyTorch] 24. Troubleshooting
StoneSeller
2022. 9. 29. 12:13
1. GPUUtil
- GPU 상태를 보여주는 모듈로 iter마다 메모리 늘어나는지 확인할 수 있다.
$pip install GPUtill
import GPUtil
GPUtil.showUtilization()
2. torch.cuda.empty_cache()
- 사용되지 않는 GPU상 cache를 정리해 가용메모리 확보해준다.
backpropagation을 위한 gradient를 담는 메모리 버퍼에 쌓여 있는 것들을 지워 메모리 공간 확보한다. - del은 변수와 메모리 주소 간의 관계를 끊어주는 것이고
empty_cache()는 메모리에 남아있는 관계가 끊어진 채로 저장되어있는 값을 지우는 것이다.(garbage collecting)
a = torch.randn(1000000000, 10).cuda() torch.cuda.empty_cache()
3. training loop에 tensor로 축적되는 변수 확인
- tensor로 처리된 변수는 GPU 상의 메모리를 차지하기 떄문에 computational graph를 계속해서 생성하게 된다.
- 학습할 때 loss 값 저장 시 자주하는 실수
→ loss 값 같은 1-d tensor의 경우엔 .item() 메서드를 이용해 python 기본 객체로 변환해 처리한다.
또는 flaot()으로 감싸 변환 객체로 만들어 처리하면 된다.
total_loss = 0
for i in range(1000):
optimizer.zero_grad()
output = model(input)
loss = criterion(output)
loss.backward()
optimizer.step()
###### before ######
# total_loss += loss
###### after ######
total_loss += loss.item()
4. del 명령어의 적절한 사용
- 필요없어진 변수는 적절한 시점에 삭제가 필요한다.
특히 loop 문의 i 또는 내부에서 계산한 변수들은 loop이 끝나도 메모리를 차지한다.
5. 가능 batch 사이즈 실험
- 학습 시 OOM이 발생했다면 batch_size를 1로 해서 실행해보기
6. inference 시점에서는 torch.no_grad() 사용
- backward pass의 gradient를 계산 하지 않아 이와 관련된 메모리가 쌓이지 않는다.
728x90