일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Level2_PStage
- 알고리즘스터디
- 주간회고
- 파이썬 3
- 그리디
- 부스트캠프_AITech_3기
- 백준
- 그래프이론
- 개인회고
- 정렬
- python3
- 이진탐색
- dfs
- dp
- 백트랙킹
- 기술면접
- Level1
- 알고리즘_스터디
- 다이나믹프로그래밍
- 최단경로
- 구현
- mrc
- 단계별문제풀이
- Level2
- 부스트캠프_AITech3기
- U_stage
- ODQA
- 이코테
- 다시보기
- 프로그래머스
- Today
- Total
국문과 유목민
Pytorch Trouble Shooting 본문
Pytorch Trouble Shooting
OOM (Out Of Memory)
모델을 학습시킬 때 가장 많이 발생하며, 왜 발생했는지 또 어디서 발생했는지 알기 어려운 에러이다. 에러가 다양한 이유에 의해 발생하기 때문에, 그에 맞는 다양한 해결방법이 존재하기에 내 상황에 맞는 해결방법을 찾기 어려운데, Error Bactracking마저 이상하게 찍히는 경우가 많아 에러를 찾기 어렵다.
일반적인 해결방법으로 Batch사이즈를 줄이고, GPU를 초기화 해서 다시 시작하는 방법을 사용한다. 아래에서는 OOM 발생 시 사용해 볼 수 있는 방법 등에 대해서 간단히 다루겠다.
GPUtil 사용하기
nVidia의 그래픽 카드를 쓰면 nvidia-smi을 통해 GPU의 상태를 확인할 수 있지만, Colab의 경우 GPUtil을 통해 확인이 가능하다. iter마다 메모리의 상태를 확인함으로써 Memory관련 이슈를 해결하는데 사용할 수 있다.
!pip install GPUtil
import GPUtil
GPUTil.showUtilization()
Empty_cache
torch.cuda.empty_cache(): 사용되지 않는 GPU상 cache를 정리해서 가용 메모리를 확보할 수 있다. GPU를 reset하는 대신 활용할 수 있다.
가능한 Batch사이즈 Test
학습 시 OOM이 발생했다면, batch 사이즈를 1로해서 실험해보면서 학습이 가능한 batch 사이즈를 확인해본다. (개인적으로는 해당 코드를 잘 쓴다면 좋아보이는 게, 오랜 시간 동안 모델을 돌린 이후 Test가 안 돌아갔던 경우가 있었기 때문...)
oom = False
try:
run_model(batch_size
except RuntimeError:
oom = True
if oom:
for _ in range(batch_size):
run_model(1)
Trainning loop 확인
Tensor로 처리된 변수는 GPU 상에 메모리를 사용한다. 따라서 Tranning loop 안에 해당 변수가 존재할 경우 GPU에 computational graph를 생성함으로 메모리를 잡게 된다. 따라서 한 번만 사용되는 1-d Tensor객체는 Python 기본객체로 변환해서 처리하면 메모리를 확보할 수 있다. (tensor객체.item 혹은 float(tensor객체) 사용)
적절한 del 사용
필요가 없어진 변수는 del 명령어를 통해 적절하게 삭제를 해준다. Python 메모리 배치 특성상 loop가 끝나도 메모리를 차지하기 때문에 필요없는 변수는 지워준다. [ex) 변수의 값을 모아서 텐서로 만들기 위해 만든 리스트 객체]
torch.no_grad() 사용하기
Inference 시점에서 torch.no_grad() 구문을 사용하면, backward pass로 인해 쌓이는 메모리에서 자유로울 수 있다. (Inference 시점에서 습관적으로 사용하는 것이 좋다고 한다)
with torch.no_grad():
for data, target in test_loder:
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 (CUDNN설치 오류일 경우)이나 device-side-assert 등의 에러도 cuda와 관련한 OOM의 일종이라고 생각할 수 있다.
그 외
- colab에서 너무 큰 사이즈는 실행하지 말 것 (linear, CNN, LSTM 정도)
- CNN의 대부분의 에러는 크기가 안 맞아서 생기는 경우이다. (torchsummary 등으로 사이즈를 맞출 추거나, 레이어 끝단에서 조절 (Pretrained 부분 확인)
- tensor의 float precision을 줄이는 방법도 있기는 하다 (연구 등 특수한 경우).
Trouble Shooting 관련 사이트
'IT 견문록 > 함수 및 코드 (디지털치매 대비)' 카테고리의 다른 글
Seaborn 멀티차트 사용법 (0) | 2022.02.06 |
---|---|
Seaborn API별 사용법 (0) | 2022.02.06 |
[git]Git 기본 명령어 정리 (0) | 2022.01.21 |
Pandas 함수 정리 (0) | 2022.01.21 |
Numpy 함수 정리 (0) | 2022.01.21 |