Fairseq 变换模型不工作浮点数不能转换为长

问题描述

我已经在一台新机器上安装了 python 3.8、pytorch 1.7 和 fairseq 0.10.1,然后从使用 python 3.6、pytorch 1.4 和 fairseq 0.9.0 的机器复制了脚本和模型,它正在工作.

模型加载和准备:

model = TransformerModel.from_pretrained(...)
model.eval()
model.cuda()

然后用于:

inputs = [model.binarize(encode(src,str)) for str in texts]
batched_hypos = model.generate(inputs,beam)

inputs 看起来像例如[tensor([ 116,1864,181,6,2]),tensor([ 5,432,7,2])]

它断言,调用堆栈的最后一位是:

  ...
    batched_hypos = model.generate(inputs,beam)
  File "/path/to/fairseq/hub_utils.py",line 125,in generate
    sample = self._build_sample(tokens)
  File "/path/to/fairseq/hub_utils.py",line 196,in _build_sample
    assert torch.is_tensor(src_tokens)

如果我从命令行使用 fairseq-interactive,它会以 RuntimeError: result type Float can't be cast to the desired output type Long 失败。 (完整的堆栈跟踪如下。)

由于使用 cli 也失败了,我的预感是我使用 fairseq 0.9.x 构建的模型不能与 fairseq 0.10.x 一起使用。如果是这样,有没有办法更新模型(即无需重新训练)。如果没有,可能是什么问题,我该如何解决

顺便说一句,如果我将 --cpu 添加到命令行参数,则完全相同的错误,因此可以消除 GPU 或 cuda 版本作为可能的原因。

$ fairseq-interactive path/to/dicts --path models/big.pt --source-lang ja --target-lang en  --remove-bpe sentencepiece


  File "/path/to/bin/fairseq-interactive",line 11,in <module>
    sys.exit(cli_main())
  File "/path/to/lib/python3.8/site-packages/fairseq_cli/interactive.py",line 190,in cli_main
    main(args)
  File "/path/to/lib/python3.8/site-packages/fairseq_cli/interactive.py",line 149,in main
    translations = task.inference_step(generator,models,sample)
  File "/path/to/lib/python3.8/site-packages/fairseq/tasks/fairseq_task.py",line 265,in inference_step
    return generator.generate(models,sample,prefix_tokens=prefix_tokens)
  File "/path/to/lib/python3.8/site-packages/torch/autograd/grad_mode.py",line 26,in decorate_context
    return func(*args,**kwargs)
  File "/path/to/lib/python3.8/site-packages/fairseq/sequence_generator.py",line 113,in generate
    return self._generate(model,**kwargs)
  File "/path/to/lib/python3.8/site-packages/torch/autograd/grad_mode.py",line 376,in _generate
    cand_scores,cand_indices,cand_beams = self.search.step(
  File "/path/to/lib/python3.8/site-packages/fairseq/search.py",line 81,in step
    torch.div(self.indices_buf,vocab_size,out=self.beams_buf)
RuntimeError: result type Float can't be cast to the desired output type Long

解决方法

(更新:下面的说明在没有 GPU 支持的情况下安装 pytorch。回到使用 pytorch 频道获得 GPU 支持,但 fairseq 再次中断。我还没有破解秘密代码来让一切正常工作。)

通过擦除 conda 并重新开始解决此问题;我决定自行回答,而不是删除问题,因为这些错误信息被证明是无用的(礼貌地说)所以当他们谷歌时它可能会帮助其他人。

首先:我实际上安装了 fairseq 0.9.0。即使 0.10.1 在 conda-forge 上首先列出。这显然意味着我的预感是错误的,还有一些更晦涩的东西在起作用。然后我无法卸载或升级工作。因此我决定彻底清除 anaconda 并重新开始。

其次,我注意到 conda 文档中的一些内容说要一次性安装所有内容,以避免冲突。不是我对包管理器应该如何工作的定义,但无论如何。

第三,我创建了一个“测试”conda 环境,而不是使用“基本”默认值。我怀疑这与让它工作无关,但我提到它以防万一。

所以,我成功的安装命令是:

conda install -c conda-forge pytorch cudatoolkit=11.0 nvidia-apex fairseq==0.10.1 sentencepiece

这给了我 python 3.7.9(不是操作系统安装的 3.8.5)、pytorch 1.7.1、fairseq 0.10.1 和句子 0.1.92。