monologg / DistilKoBERT

Distillation of KoBERT from SKTBrain (Lightweight KoBERT)
Apache License 2.0
187 stars 25 forks source link

Naver NER (F1) 코드 질문 #3

Closed gyunggyung closed 4 years ago

gyunggyung commented 4 years ago

안녕하세요.

작성해주신 DistilKoBERT을 통해서 네이버 감성분석 코드를 구현울 도전하다. 아래와 같은 오류에 직면했습니다. 코드는 사실상 KoBERT에 있는 코드를 사용했습니다.

RuntimeError: Expected object of device type cuda but got device type cpu for argument #1 'self' in call to _th_index_select
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 enumerate(tqdm_notebook(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)
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), max_grad_norm)
        optimizer.step()
        scheduler.step()  # Update learning rate schedule
        train_acc += calc_accuracy(out, label)
        if batch_id % log_interval == 0:
            print("epoch {} batch id {} loss {} train acc {}".format(e+1, batch_id+1, loss.data.cpu().numpy(), train_acc / (batch_id+1)))
    print("epoch {} train acc {}".format(e+1, train_acc / (batch_id+1)))
    model.eval()
    for batch_id, (token_ids, valid_length, segment_ids, label) in enumerate(tqdm_notebook(test_dataloader)):
        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)
        test_acc += calc_accuracy(out, label)
    print("epoch {} test acc {}".format(e+1, test_acc / (batch_id+1)))

혹시 Naver NER (F1) 에 사용한 코드를 공개하실 생각은 없으신가요?

감사합니다.

monologg commented 4 years ago

현재 nsmc, naver ner 모두 공개되어 있습니다. 한번 확인해보시고 문제 생기시면 다시 알려주세요:)

monologg commented 4 years ago

위의 코드는 확실하게 말씀드릴 순 없지만 만약 valid_length도 Tensor이면 valid_length = valid_length.to(device)로 해줘야 할 것 같습니다. (코드 전체를 봐야 확실한 원인을 알 수 있을 것 같습니다)

model.to(device)도 되어있는지도 확인해보셔야 할 것 같습니다:)

gyunggyung commented 4 years ago

감사합니다! 한 번 수정해봐야겠네요 :)