fastnlp / fastNLP

fastNLP: A Modularized and Extensible NLP Framework. Currently still in incubation.
https://gitee.com/fastnlp/fastNLP
Apache License 2.0
3.06k stars 450 forks source link

提供对HuggingFace的Transformers的支持 #281

Open onebula opened 4 years ago

onebula commented 4 years ago

HuggingFace的Transformers上提供了大量SOTA的NLP预训练模型,包括很多先进的tiny模型。 可以作为fastNLP的embeddings导入(类似已有的BERT),但是目前没有办法直接使用,可否提供相应的API呢?

写了一段代码尝试了Albert的导入,下游任务使用了BertForSentenceMatching:

from torch import nn
from transformers import BertTokenizer, AlbertModel

class AlbertEmbedding(nn.Module):
    def __init__(self, tokenizer, model):
        super(AlbertEmbedding, self).__init__()
        self.tokenizer = tokenizer
        self.model = model
        self.model.include_cls_sep = True
        self.embedding_dim = self.model.config.hidden_size

    def forward(self, words):
        max_len = self.model.config.max_position_embeddings
        truncate_words = words[:, 0:max_len]
        truncate_words[:, -1] = self.tokenizer.sep_token_id
        outputs = self.model(truncate_words)
        hidden = outputs[0]
        return hidden

tokenizer = BertTokenizer.from_pretrained("voidful/albert_chinese_tiny")
albert = AlbertModel.from_pretrained("voidful/albert_chinese_tiny")

embed = AlbertEmbedding(tokenizer, albert)
model = BertForSentenceMatching(embed)
yhcc commented 4 years ago

嗯嗯,我们会加紧解决下这个问题。但是fastNLP的Embedding会比你写的这个稍微复杂一下,不过,我们尽快研究下如何引入更多的Embedding吧

taotao033 commented 3 years ago

嗯嗯,我们会加紧解决下这个问题。但是fastNLP的Embedding会比你写的这个稍微复杂一下,不过,我们尽快研究下如何引入更多的Embedding吧 大佬您好!何时可以支持Albert呢?急急急

yhcc commented 3 years ago

现在fastNLP有提供一个叫做TransformersEmbeddding的类,你可以看看是否可以用上。但是这个Embedding没有针对各种pretrain model做adaptation,性能上不一定能够发挥到模型的最大化。