부스트캠프 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