개발자가 숫자를 0부터 세야하는 이유 - loss function 사용할때 class는 0부터 시작하기(cuda error)
text classification 모델을 training할려고 하는데.. 익숙한 cuda error를 만났다
경험상 정확한 원인은 알 수 없고 tensor 타입이라든지 gpu cpu 안맞다든지.. 등등 여러가지 이유로 발생하는거고
CUDA_LAUNCH_BLOCKING=1 넣어보라는건 아무 효과도 없음
이런 경우는 가장 좋은건 데이터를 하나만 빼서 model에 넣어봐서 output을 하나만 계산해봐야함
그리고 저 에러만나면 런타임 다시 시작해야함
------------------------------------------------------------------------------
근데 뭐 여러가지 시도해봄
device에 torch.device("cuda:0")냐 torch.device("cuda")
is_cuda = torch.cuda.is_available()
if is_cuda:
#device = torch.device("cuda:0")
device = torch.device("cuda")
print("GPU is available")
else:
device = torch.device("cpu")
print("GPU not available, CPU used")
메모리 부족인가 싶어서 batch size도 줄여보고
#setting
max_len = 128
batch_size = 32
warmup_ratio = 0.1
num_epochs = 5
max_grad_norm = 1
log_interval = 200
learning_rate = 5e-5
그리고 코드에 타입을 long()으로 변경하고.. 그러던데
for e in range(num_epochs):
train_acc = 0.0
test_acc = 0.0
model.train()
for batch_id, (token_ids, valid_length, segment_ids, label) in tqdm(enumerate(train_dataloader), total=len(train_dataloader)):
#optimizer.zero_grad()
token_ids = token_ids.long().to(device)
segment_ids = segment_ids.long().to(device)
#valid_length= valid_length
label = label.long().to(device)
out = model(token_ids, valid_length, segment_ids)
loss = loss_fn(out, label)
optimizer.zero_grad()
그냥 long()빼고 int로도 해보고..
optimizer.zero_grad()를 보통 loss 계산하고 하는데 여기서 loss 계산 전에 하길래.. 이것도 바꿔보고..
torch.zeros_like()가 gpu tensor가 들어가면 안되더라고?
다시해보니까 에러가 안나네?? 왜지
결정적으로는 데이터 하나 빼서 model에 넣어보고 loss도 계산해보니까
for token_ids,valid_length,segment_ids,label in train_dataloader:
print(token_ids)
print(valid_length)
print(segment_ids)
print(label)
break
model 계산은 잘 됐는데.. loss 계산에서 결정적으로 문제가 있더라고
일단 위 그림은 long 타입이 필요한데 int가 들어왔다고 하고
그래서 label을 long으로 바꿔보니
target 5 is out of bounds라고 나오는데.. 여기서 느낌이 왔지
내가 class를 1,2,3,4,5로 설정했는데... 이게 문제구나
혹시 0,1,2,3,4로 바꿔야하나 했는데
이러니까 loss 계산을 잘 해주더라.. 그 뒤로는 training이 문제없이 됐다
괜히 개발자는 숫자를 0부터 세야한다는 말이 나오는게 아니다
'프로그래밍 > Pytorch' 카테고리의 다른 글
pytorch를 이용한 inference process 기본기 완벽하게 이해하기 & pytorch lightning (0) | 2023.04.24 |
---|---|
pytorch를 이용한 training process 기본기 완벽하게 이해하기 (0) | 2023.04.24 |
pytorch tensor 다루기 재활치료 2편 - view, squeeze, unsqueeze, type, cat, stack, ones_like, zeros_like, inplace - (0) | 2023.03.11 |
pytorch tensor 다루기 재활치료 1편 -tensor, broadcasting, max, argmax - (0) | 2023.03.06 |
pytorch 재활훈련 -fine tuning 구현해보기- (0) | 2023.01.08 |