0

我尝试使用 allennlp.predictors.Predictor.get_gradients 来获取实例的渐变。

allennlp==0.8.5

主要代码:

for instance in targeted_dev_data: 
    #model is locally trained on GPU
    #instance is from allennlp.data.dataset_readers.reader 
    predictor = Predictor(model,  
                    StanfordSentimentTreeBankDatasetReader(granularity="2-class",
                                                    token_indexers={"tokens": single_id_indexer},
                                                    use_subtrees=True))
    
    input_gradients = predictor.get_gradients([instance])

但我收到以下错误:

File "sst_sememe.py", line 436, in main
    input_gradients = predictor.get_gradients([instance])
File "/home/rui.ye/universal-triggers-master/myenv/lib/python3.7/site-packages/allennlp/predictors/predictor.py", line 110, in get_gradients
    outputs = self._model.decode(self._model.forward(**dataset.as_tensor_dict()))
File "sst_sememe.py", line 59, in forward
    embeddings = self.word_embeddings(tokens)
File "/home/rui.ye/universal-triggers-master/myenv/lib/python3.7/site-packages/torch/nn/modules/module.py", line 493, in __call__
    result = self.forward(*input, **kwargs)
File "/home/rui.ye/universal-triggers-master/myenv/lib/python3.7/site-packages/allennlp/modules/text_field_embedders/basic_text_field_embedder.py", line 131, in forward
    token_vectors = embedder(*tensors, **forward_params_values)
File "/home/rui.ye/universal-triggers-master/myenv/lib/python3.7/site-packages/torch/nn/modules/module.py", line 493, in __call__
    result = self.forward(*input, **kwargs)
File "/home/rui.ye/universal-triggers-master/myenv/lib/python3.7/site-packages/allennlp/modules/token_embedders/embedding.py", line 144, in forward
    sparse=self.sparse)
File "/home/rui.ye/universal-triggers-master/myenv/lib/python3.7/site-packages/torch/nn/functional.py", line 1506, in embedding
    return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)
RuntimeError: Expected object of backend CUDA but got backend CPU for argument #3 'index'

但是,我可以使用以下代码通过 Predictor.predict_instance 测试

for instance in targeted_dev_data: 
    #model is locally trained on GPU
    #instance is from allennlp.data.dataset_readers.reader 
    predictor = Predictor(model,  
                    StanfordSentimentTreeBankDatasetReader(granularity="2-class",
                                                    token_indexers={"tokens": single_id_indexer},
                                                    use_subtrees=True))
    
    input_preds = predictor.predict_instance(instance)

4

1 回答 1

0

我通过将 Predictor(model, *) 替换为 Predictor(model.cpu(), *) 来解决它(部分),其中“模型”是由 GPU 在本地训练的。

for instance in targeted_dev_data: 
    #model is locally trained on GPU
    #instance is from allennlp.data.dataset_readers.reader 
    predictor = Predictor(model.cpu(),  
                    StanfordSentimentTreeBankDatasetReader(granularity="2-class",
                                                    token_indexers={"tokens": single_id_indexer},
                                                    use_subtrees=True))
    
    input_gradients = predictor.get_gradients([instance])

它表明该错误是由预测器(在我的情况下默认为 GPU)和实例(在 CPU 上)之间的设备不匹配引起的。因此,这是我的后续问题,由于 instance.cuda() 不起作用,有谁知道如何将 allennlp 中的实例放入 GPU?

于 2021-01-15T10:44:01.083 回答