keep-loving-pythonのブログ

Pythonを愛し続けたいです(Pythonが流行っている限りですが。。。)

解決策。RuntimeError: expected scalar type Long but found Int(★多少役立つかも。。。)

エラー

環境

windows10
python3.7

モジュールのバージョン

torch 1.9.0+cpu
transformers 4.30.2

エラー

RuntimeError: expected scalar type Long but found Int

エラー詳細

Traceback (most recent call last):
  File "bert_ner5.py", line 235, in <module>
    attention_mask=b_input_mask, labels=b_labels)
  File "C:\Users\XYZZZ\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\module.py", line 1051, in _call_impl
    return forward_call(*input, **kwargs)
  File "C:\Users\XYZZZ\AppData\Local\Programs\Python\Python37\lib\site-packages\transformers\models\bert\modeling_bert.py", line 1778, in forward
    loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1))
  File "C:\Users\XYZZZ\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\module.py", line 1051, in _call_impl
    return forward_call(*input, **kwargs)
  File "C:\Users\XYZZZ\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\loss.py", line 1121, in forward
    ignore_index=self.ignore_index, reduction=self.reduction)
  File "C:\Users\XYZZZ\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\functional.py", line 2824, in cross_entropy
    return torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
RuntimeError: expected scalar type Long but found Int

予備元の関数

        outputs = model(b_input_ids, token_type_ids=None,
                        attention_mask=b_input_mask, labels=b_labels)

解決策

Long(64ビット)でなく、Int(32ビット)が入力されていることが原因。

以下のように明示的に変換して対処しても良い。

tr_inputs = torch.tensor(tr_inputs).to(torch.int64)

できるだけ、上流で、longになるように改修するのが良いと思う。

なぜこのようなことが起きるのか(留意点)

動作実績のあるコード(GitHubや記事で公開されているコード)で、このような現象が出る理由: GPUで動作するものをCPU環境で動作させていませんか?(このあたりでNGになる可能性があるのでは?これ、想像ですけど。。。)

解決のノウハウ

可能性高:

  • GPU/CPUの差で、そもそもの型の問題が発症 (<--勘、ですが。)

可能性低:

  • モジュールのバージョン

コメント

コメントなどあればお願いします