brightmart/roberta_zh

请问应该如何转成pyTorch格式?

Dongfeng-He opened this issue · 21 comments

感谢作者开源,请问目前支持tensorflow模型转pyTorch模型吗?尝试使用pytorch-transformer的转换工具进行模型转换并不成功。

报什么错误呢?

跟加载bert模型一样,可以转换成功,不过bert模型的参数设置需要根据roberta更改

好的,roberta没有特别的参数,参数和bert是一样的,只有跟加载词汇表(vocab.txt)和配置文件(bert_config_xxx.json)

能否把转PyTorch的代码在这里的方法在这里贴一下,稍后新的模型我也转一下。

可参考https://github.com/guoday/CCF-BDCI-Sentiment-Analysis-Baseline 转化该项目的tf模型为pytorch模型

创建模型时,config和开源的roberta一致就可以

from pytorch_transformers import RobertaConfig, RobertaModel, load_tf_weights_in_bert
config = RobertaConfig(num_hidden_layers=24, vocab_size_or_config_json_file=21128)
model = RobertaModel(config)
load_tf_weights_in_bert(model, config, "roeberta_zh_L-24_H-768_A-12")

我用的转换方法:
from pytorch_transformers import convert_roberta_checkpoint_to_pytorch

roberta_checkpoint_path = "/root/roberta/"
pytorch_dump_folder_path = "/root/roberta/output/"
classification_head = False
convert_roberta_checkpoint_to_pytorch.convert_roberta_checkpoint_to_pytorch(roberta_checkpoint_path, pytorch_dump_folder_path, classification_head)

/root/roberta/是存放该项目权重的路径
roberta_checkpoint_path = "/root/roberta/"
报错OSError: Model file not found: /root/roberta/model.pt

roberta_checkpoint_path = "/root/roberta/checkpoint"
报错tarfile.ReadError: truncated header

roberta_checkpoint_path = "/root/roberta/bert_model.data-00000-of-00001"
报错tarfile.CompressionError: unknown compression type 'data-00000-of-00001'

各种方法都试了一下,没有成功。

@guoday,我看到这个项目里对RoBERTa的转换还是沿用BERT的转换脚本,也就是pytorch_transformers.convert_tf_checkpoint_to_pytorch,我试试这个方法是不是可行,非常感谢!

这个是行不通的,pytorch transformer里面的convert_roberta_checkpoint_to_pytorch是提供转换fairseq模型的,不是tensorflow模型的,roberta和bert模型没有变化,所以用转换bert的方法即可。

@zuofeng1997 非常感谢!请问我能沿用BertConfig和BertModel吗?还是必须要用RobertaConfig, RobertaModel?
这个load_tf_weights_in_bert(model, config, "roeberta_zh_L-24_H-768_A-12")是用来代替BertModel.from_pretrained的吗?还是跳过模型转换直接在pyTorch里加载tensorflow的模型?

能用BERTMODEL,模型的转换用的就是load_tf_weights_in_bert方法,所以没有区别

@zuofeng1997 感谢感谢!

这个模型是可以在pytorch里面加载运行的。
用Transformer2.0库,实例化BertTokenizer、BertConfig、BertForSequenceClassification(分类)就可以了。

tokenizer = BertTokenizer.from_pretrained('RoBERTa/vocab.txt')
config = BertConfig.from_pretrained('RoBERTa/config.json')
model = BertForSequenceClassification.from_pretrained('RoBERTa/pytorch_model.bin', config=config)

中文版的RoBERTa模型,不能用Transformer2.0中Roberta相关类进行实例化加载。

这个模型是可以在pytorch里面加载运行的。
用Transformer2.0库,实例化BertTokenizer、BertConfig、BertForSequenceClassification(分类)就可以了。

tokenizer = BertTokenizer.from_pretrained('RoBERTa/vocab.txt')
config = BertConfig.from_pretrained('RoBERTa/config.json')
model = BertForSequenceClassification.from_pretrained('RoBERTa/pytorch_model.bin', config=config)

中文版的RoBERTa模型,不能用Transformer2.0中Roberta相关类进行实例化加载。

为什么不能用呢.. roberta 中有一个merge.txt文件。但是直接下载的pytorch版本的roberta没有这个文件..不太清楚这个文件时干嘛用的
image

你用transformer加载模型一下,使用名称选BERT.

这个模型是可以在pytorch里面加载运行的。
用Transformer2.0库,实例化BertTokenizer、BertConfig、BertForSequenceClassification(分类)就可以了。
tokenizer = BertTokenizer.from_pretrained('RoBERTa/vocab.txt')
config = BertConfig.from_pretrained('RoBERTa/config.json')
model = BertForSequenceClassification.from_pretrained('RoBERTa/pytorch_model.bin', config=config)
中文版的RoBERTa模型,不能用Transformer2.0中Roberta相关类进行实例化加载。

为什么不能用呢.. roberta 中有一个merge.txt文件。但是直接下载的pytorch版本的roberta没有这个文件..不太清楚这个文件时干嘛用的

你要用加载bert的类去加载RoBerta

这个模型是可以在pytorch里面加载运行的。
用Transformer2.0库,实例化BertTokenizer、BertConfig、BertForSequenceClassification(分类)就可以了。

tokenizer = BertTokenizer.from_pretrained('RoBERTa/vocab.txt')
config = BertConfig.from_pretrained('RoBERTa/config.json')
model = BertForSequenceClassification.from_pretrained('RoBERTa/pytorch_model.bin', config=config)

中文版的RoBERTa模型,不能用Transformer2.0中Roberta相关类进行实例化加载。

我尝试了确实不可以,但是是为什么呢?全网也搜不到相关信息。
@DefuLi
有相关的资料可以推荐阅读吗?

你说的没错。 中文版的roberta是用transformer2.0库中的bert加载模板的。 至于为什么这样,你看一下roberta的官方说明,上面有讲到。

---原始邮件--- 发件人: "Qian Xin"<notifications@github.com> 发送时间: 2020年10月3日(周六) 下午5:15 收件人: "brightmart/roberta_zh"<roberta_zh@noreply.github.com>; 抄送: "Defu Li"<defuli.go@qq.com>;"Comment"<comment@noreply.github.com>; 主题: Re: [brightmart/roberta_zh] 请问应该如何转成pyTorch格式? (#9) 这个模型是可以在pytorch里面加载运行的。 用Transformer2.0库,实例化BertTokenizer、BertConfig、BertForSequenceClassification(分类)就可以了。 tokenizer = BertTokenizer.from_pretrained('RoBERTa/vocab.txt') config = BertConfig.from_pretrained('RoBERTa/config.json') model = BertForSequenceClassification.from_pretrained('RoBERTa/pytorch_model.bin', config=config) 中文版的RoBERTa模型,不能用Transformer2.0中Roberta相关类进行实例化加载。 我尝试了确实不可以,但是是为什么呢?全网也搜不到相关信息。 — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

十分感谢!

查到了,谢谢

这个模型是可以在pytorch里面加载运行的。
用Transformer2.0库,实例化BertTokenizer、BertConfig、BertForSequenceClassification(分类)就可以了。

tokenizer = BertTokenizer.from_pretrained('RoBERTa/vocab.txt')
config = BertConfig.from_pretrained('RoBERTa/config.json')
model = BertForSequenceClassification.from_pretrained('RoBERTa/pytorch_model.bin', config=config)

中文版的RoBERTa模型,不能用Transformer2.0中Roberta相关类进行实例化加载。

查到了,谢谢

请问下您是怎么加载robert的 我没有看懂

这个是行不通的,pytorch transformer里面的convert_roberta_checkpoint_to_pytorch是提供转换fairseq模型的,不是tensorflow模型的,roberta和bert模型没有变化,所以用转换bert的方法即可。

你好,我在用该函数将roberta-base的fairseq模型转为pytorch模型时,出现了一个问题“'RobertaHubInterface' object has no attribute 'args'”,具体如facebookresearch/fairseq#4337,请问您知道怎么解决吗