web-dev-qa-db-ja.com

Pytorch埋め込みRuntimeError:torch.LongTensorタイプのオブジェクトが必要ですが、引数#3'index 'のtorch.cuda.LongTensorタイプが見つかりました

このエラーが発生しました

RuntimeError: Expected object of type torch.LongTensor but found type torch.cuda.LongTensor for argument #3 'index'

しかし、それはargument #3 "index"とはどういう意味ですか? torch.embeddingに "index"引数が見つかりません(ここでソース: https://pytorch.org/docs/stable/_modules/torch/nn/modules/sparse。 html#Embedding )埋め込みに間違ったパラメーターを渡しているようです。

以下のように入力のデータ型を変更しましたが、エラーが解決しません。

batch['doc_tok'] = batch['doc_tok'].long()
batch['query_tok'] = batch['query_tok'].long()

コメント(短いですが!)または見たいキーワードをリストするだけで大​​歓迎です!


これが完全なトレースバックです。

Traceback (most recent call last):
  File "train_v2.py", line 110, in <module>
    main()
  File "train_v2.py", line 81, in main
    model.update(batch)
  File "/home/aerin/Desktop/squad_vteam/src/model.py", line 129, in update
    loss_adv = self.adversarial_loss(batch, loss, self.network.Lexicon_encoder.embedding.weight, y)
  File "/home/aerin/Desktop/squad_vteam/src/model.py", line 104, in adversarial_loss
    start, end, _ = self.network(batch)
  File "/home/aerin/anaconda3/envs/san/lib/python3.6/site-packages/torch/nn/modules/module.py", line 491, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/aerin/Desktop/squad_vteam/src/dreader.py", line 78, in forward
    doc_mask, query_mask = self.Lexicon_encoder(batch)
  File "/home/aerin/anaconda3/envs/san/lib/python3.6/site-packages/torch/nn/modules/module.py", line 491, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/aerin/Desktop/squad_vteam/src/encoder.py", line 116, in forward
    doc_emb, query_emb = emb(doc_tok), emb(query_tok)
  File "/home/aerin/anaconda3/envs/san/lib/python3.6/site-packages/torch/nn/modules/module.py", line 491, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/aerin/anaconda3/envs/san/lib/python3.6/site-packages/torch/nn/modules/sparse.py", line 108, in forward
    self.norm_type, self.scale_grad_by_freq, self.sparse)
  File "/home/aerin/anaconda3/envs/san/lib/python3.6/site-packages/torch/nn/functional.py", line 1076, in embedding
    return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)
RuntimeError: Expected object of type torch.LongTensor but found type torch.cuda.LongTensor for argument #3 'index'

更新:model.network全体をCPUに送信しましたが、それでも同じエラーが発生します。

batch['doc_tok']=batch['doc_tok'].long().cpu()
batch['query_tok']=batch['query_tok'].long().cpu()
self.network.cpu()

print(batch['doc_tok'].dtype,  batch['query_tok'].dtype) # They are both torch.int64 torch.int64

start, end, _ = self.network(batch)

この時点で、これはバグの可能性があると思われます...

model.pyコード: https://github.com/byorxyz/san_mrc/blob/master/src/model.py

定義されたネットワーク: https://github.com/byorxyz/san_mrc/blob/master/src/dreader.py

5
Aerin

入力/ターゲットテンソル(_batch['doc_tok']_など)とネットワークとその変数(indexEmbeddingレイヤーの内部テンソルだと思います)がオンになっているように見えますさまざまなデバイス(データ用のCPU、モデル用のGPU?)。

すべてをGPUで実行する場合は、次の両方が必要です。

  • そこにデータをロードします。 batch['doc_tok'].cuda()
  • そこにモデルをロードします。 model.network.cuda()

CPUで実行する場合も同様で、.cpu()に置き換えます。

3
benjaminplanche

これを試して:

batch['doc_tok']=batch['doc_tok'].long().cpu()
batch['query_tok']=batch['query_tok'].long().cpu()
1
Lakshay Sharma