개발자가 숫자를 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부터 세야한다는 말이 나오는게 아니다 

 

TAGS.

Comments