Fairseq 转换模型不起作用(Float 不能转换为 long)
Fairseq Transform model not working (Float can't be cast to long)
我已经在一台新机器上安装了 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, sample, **kwargs)
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 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 并重新启动解决了这个问题;我决定自己回答,而不是删除问题,因为这些错误消息被证明是无用的(礼貌地说)所以也许它会帮助其他人google。
首先:我实际上安装了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(不是 OS 安装的 3.8.5)、pytorch 1.7.1、fairseq 0.10.1 和 sentencepiece 0.1.92。
我已经在一台新机器上安装了 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, sample, **kwargs)
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 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 并重新启动解决了这个问题;我决定自己回答,而不是删除问题,因为这些错误消息被证明是无用的(礼貌地说)所以也许它会帮助其他人google。
首先:我实际上安装了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(不是 OS 安装的 3.8.5)、pytorch 1.7.1、fairseq 0.10.1 和 sentencepiece 0.1.92。