| @@ -13,8 +13,9 @@ class Models(object): | |||||
| # nlp models | # nlp models | ||||
| bert = 'bert' | bert = 'bert' | ||||
| palm2_0 = 'palm2.0' | |||||
| palm = 'palm_v2' | |||||
| structbert = 'structbert' | structbert = 'structbert' | ||||
| veco = 'veco' | |||||
| # audio models | # audio models | ||||
| sambert_hifi_16k = 'sambert-hifi-16k' | sambert_hifi_16k = 'sambert-hifi-16k' | ||||
| @@ -85,6 +86,9 @@ class Preprocessors(object): | |||||
| bert_seq_cls_tokenizer = 'bert-seq-cls-tokenizer' | bert_seq_cls_tokenizer = 'bert-seq-cls-tokenizer' | ||||
| palm_text_gen_tokenizer = 'palm-text-gen-tokenizer' | palm_text_gen_tokenizer = 'palm-text-gen-tokenizer' | ||||
| sbert_token_cls_tokenizer = 'sbert-token-cls-tokenizer' | sbert_token_cls_tokenizer = 'sbert-token-cls-tokenizer' | ||||
| sbert_nli_tokenizer = 'sbert-nli-tokenizer' | |||||
| sbert_sen_cls_tokenizer = 'sbert-sen-cls-tokenizer' | |||||
| sbert_zero_shot_cls_tokenizer = 'sbert-zero-shot-cls-tokenizer' | |||||
| # audio preprocessor | # audio preprocessor | ||||
| linear_aec_fbank = 'linear-aec-fbank' | linear_aec_fbank = 'linear-aec-fbank' | ||||
| @@ -5,5 +5,13 @@ from .audio.tts.vocoder import Hifigan16k | |||||
| from .base import Model | from .base import Model | ||||
| from .builder import MODELS, build_model | from .builder import MODELS, build_model | ||||
| from .multi_model import OfaForImageCaptioning | from .multi_model import OfaForImageCaptioning | ||||
| from .nlp import (BertForSequenceClassification, SbertForNLI, | |||||
| SbertForSentenceSimilarity) | |||||
| from .nlp import ( | |||||
| BertForSequenceClassification, | |||||
| SbertForNLI, | |||||
| SbertForSentenceSimilarity, | |||||
| SbertForSentimentClassification, | |||||
| SbertForZeroShotClassification, | |||||
| StructBertForMaskedLM, | |||||
| VecoForMaskedLM, | |||||
| StructBertForTokenClassification, | |||||
| ) | |||||
| @@ -1,10 +1,10 @@ | |||||
| from .bert_for_sequence_classification import * # noqa F403 | from .bert_for_sequence_classification import * # noqa F403 | ||||
| from .masked_language_model import * # noqa F403 | from .masked_language_model import * # noqa F403 | ||||
| from .nli_model import * # noqa F403 | |||||
| from .sbert_for_nli import * # noqa F403 | |||||
| from .palm_for_text_generation import * # noqa F403 | from .palm_for_text_generation import * # noqa F403 | ||||
| from .sbert_for_sentence_similarity import * # noqa F403 | from .sbert_for_sentence_similarity import * # noqa F403 | ||||
| from .sbert_for_token_classification import * # noqa F403 | from .sbert_for_token_classification import * # noqa F403 | ||||
| from .sentiment_classification_model import * # noqa F403 | |||||
| from .sbert_for_sentiment_classification import * # noqa F403 | |||||
| from .space.dialog_intent_prediction_model import * # noqa F403 | from .space.dialog_intent_prediction_model import * # noqa F403 | ||||
| from .space.dialog_modeling_model import * # noqa F403 | from .space.dialog_modeling_model import * # noqa F403 | ||||
| from .zero_shot_classification_model import * # noqa F403 | |||||
| from .sbert_for_zero_shot_classification import * # noqa F403 | |||||
| @@ -5,26 +5,25 @@ import numpy as np | |||||
| from ...utils.constant import Tasks | from ...utils.constant import Tasks | ||||
| from ..base import Model, Tensor | from ..base import Model, Tensor | ||||
| from ..builder import MODELS | from ..builder import MODELS | ||||
| from ...metainfo import Models | |||||
| __all__ = ['StructBertForMaskedLM', 'VecoForMaskedLM'] | |||||
| __all__ = ['StructBertForMaskedLM', 'VecoForMaskedLM', 'MaskedLMModelBase'] | |||||
| class AliceMindBaseForMaskedLM(Model): | |||||
| class MaskedLMModelBase(Model): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | def __init__(self, model_dir: str, *args, **kwargs): | ||||
| from sofa.utils.backend import AutoConfig, AutoModelForMaskedLM | |||||
| self.model_dir = model_dir | |||||
| super().__init__(model_dir, *args, **kwargs) | super().__init__(model_dir, *args, **kwargs) | ||||
| self.model = self.build_model() | |||||
| self.config = AutoConfig.from_pretrained(model_dir) | |||||
| self.model = AutoModelForMaskedLM.from_pretrained( | |||||
| model_dir, config=self.config) | |||||
| def build_model(self): | |||||
| raise NotImplementedError() | |||||
| def forward(self, inputs: Dict[str, Tensor]) -> Dict[str, np.ndarray]: | def forward(self, inputs: Dict[str, Tensor]) -> Dict[str, np.ndarray]: | ||||
| """return the result by the model | """return the result by the model | ||||
| Args: | Args: | ||||
| input (Dict[str, Any]): the preprocessed data | |||||
| inputs (Dict[str, Any]): the preprocessed data | |||||
| Returns: | Returns: | ||||
| Dict[str, np.ndarray]: results | Dict[str, np.ndarray]: results | ||||
| @@ -36,15 +35,17 @@ class AliceMindBaseForMaskedLM(Model): | |||||
| return {'logits': rst['logits'], 'input_ids': inputs['input_ids']} | return {'logits': rst['logits'], 'input_ids': inputs['input_ids']} | ||||
| @MODELS.register_module(Tasks.fill_mask, module_name=r'sbert') | |||||
| class StructBertForMaskedLM(AliceMindBaseForMaskedLM): | |||||
| # The StructBert for MaskedLM uses the same underlying model structure | |||||
| # as the base model class. | |||||
| pass | |||||
| @MODELS.register_module(Tasks.fill_mask, module_name=Models.structbert) | |||||
| class StructBertForMaskedLM(MaskedLMModelBase): | |||||
| def build_model(self): | |||||
| from sofa import SbertForMaskedLM | |||||
| return SbertForMaskedLM.from_pretrained(self.model_dir) | |||||
| @MODELS.register_module(Tasks.fill_mask, module_name=r'veco') | |||||
| class VecoForMaskedLM(AliceMindBaseForMaskedLM): | |||||
| # The Veco for MaskedLM uses the same underlying model structure | |||||
| # as the base model class. | |||||
| pass | |||||
| @MODELS.register_module(Tasks.fill_mask, module_name=Models.veco) | |||||
| class VecoForMaskedLM(MaskedLMModelBase): | |||||
| def build_model(self): | |||||
| from sofa import VecoForMaskedLM | |||||
| return VecoForMaskedLM.from_pretrained(self.model_dir) | |||||
| @@ -1,84 +0,0 @@ | |||||
| import os | |||||
| from typing import Any, Dict | |||||
| import numpy as np | |||||
| import torch | |||||
| from sofa import SbertConfig, SbertModel | |||||
| from sofa.models.sbert.modeling_sbert import SbertPreTrainedModel | |||||
| from torch import nn | |||||
| from transformers.activations import ACT2FN, get_activation | |||||
| from transformers.models.bert.modeling_bert import SequenceClassifierOutput | |||||
| from modelscope.utils.constant import Tasks | |||||
| from ..base import Model, Tensor | |||||
| from ..builder import MODELS | |||||
| __all__ = ['SbertForNLI'] | |||||
| class SbertTextClassifier(SbertPreTrainedModel): | |||||
| def __init__(self, config): | |||||
| super().__init__(config) | |||||
| self.num_labels = config.num_labels | |||||
| self.config = config | |||||
| self.encoder = SbertModel(config, add_pooling_layer=True) | |||||
| self.dropout = nn.Dropout(config.hidden_dropout_prob) | |||||
| self.classifier = nn.Linear(config.hidden_size, config.num_labels) | |||||
| def forward(self, input_ids=None, token_type_ids=None): | |||||
| outputs = self.encoder( | |||||
| input_ids, | |||||
| token_type_ids=token_type_ids, | |||||
| return_dict=None, | |||||
| ) | |||||
| pooled_output = outputs[1] | |||||
| pooled_output = self.dropout(pooled_output) | |||||
| logits = self.classifier(pooled_output) | |||||
| return logits | |||||
| @MODELS.register_module( | |||||
| Tasks.nli, module_name=r'nlp_structbert_nli_chinese-base') | |||||
| class SbertForNLI(Model): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | |||||
| """initialize the text generation model from the `model_dir` path. | |||||
| Args: | |||||
| model_dir (str): the model path. | |||||
| model_cls (Optional[Any], optional): model loader, if None, use the | |||||
| default loader to load model weights, by default None. | |||||
| """ | |||||
| super().__init__(model_dir, *args, **kwargs) | |||||
| self.model_dir = model_dir | |||||
| self.model = SbertTextClassifier.from_pretrained( | |||||
| model_dir, num_labels=3) | |||||
| self.model.eval() | |||||
| def forward(self, input: Dict[str, Any]) -> Dict[str, np.ndarray]: | |||||
| """return the result by the model | |||||
| Args: | |||||
| input (Dict[str, Any]): the preprocessed data | |||||
| Returns: | |||||
| Dict[str, np.ndarray]: results | |||||
| Example: | |||||
| { | |||||
| 'predictions': array([1]), # lable 0-negative 1-positive | |||||
| 'probabilities': array([[0.11491239, 0.8850876 ]], dtype=float32), | |||||
| 'logits': array([[-0.53860897, 1.5029076 ]], dtype=float32) # true value | |||||
| } | |||||
| """ | |||||
| input_ids = torch.tensor(input['input_ids'], dtype=torch.long) | |||||
| token_type_ids = torch.tensor( | |||||
| input['token_type_ids'], dtype=torch.long) | |||||
| with torch.no_grad(): | |||||
| logits = self.model(input_ids, token_type_ids) | |||||
| probs = logits.softmax(-1).numpy() | |||||
| pred = logits.argmax(-1).numpy() | |||||
| logits = logits.numpy() | |||||
| res = {'predictions': pred, 'probabilities': probs, 'logits': logits} | |||||
| return res | |||||
| @@ -1,14 +1,14 @@ | |||||
| from typing import Dict | from typing import Dict | ||||
| from modelscope.metainfo import Models | |||||
| from modelscope.utils.constant import Tasks | |||||
| from ...metainfo import Models | |||||
| from ...utils.constant import Tasks | |||||
| from ..base import Model, Tensor | from ..base import Model, Tensor | ||||
| from ..builder import MODELS | from ..builder import MODELS | ||||
| __all__ = ['PalmForTextGeneration'] | __all__ = ['PalmForTextGeneration'] | ||||
| @MODELS.register_module(Tasks.text_generation, module_name=Models.palm2_0) | |||||
| @MODELS.register_module(Tasks.text_generation, module_name=Models.palm) | |||||
| class PalmForTextGeneration(Model): | class PalmForTextGeneration(Model): | ||||
| def __init__(self, model_dir: str, *args, **kwargs): | def __init__(self, model_dir: str, *args, **kwargs): | ||||
| @@ -20,7 +20,6 @@ class PalmForTextGeneration(Model): | |||||
| default loader to load model weights, by default None. | default loader to load model weights, by default None. | ||||
| """ | """ | ||||
| super().__init__(model_dir, *args, **kwargs) | super().__init__(model_dir, *args, **kwargs) | ||||
| self.model_dir = model_dir | |||||
| from sofa.models.palm_v2 import PalmForConditionalGeneration, Translator | from sofa.models.palm_v2 import PalmForConditionalGeneration, Translator | ||||
| model = PalmForConditionalGeneration.from_pretrained(model_dir) | model = PalmForConditionalGeneration.from_pretrained(model_dir) | ||||
| @@ -0,0 +1,21 @@ | |||||
| from modelscope.utils.constant import Tasks | |||||
| from .sbert_for_sequence_classification import SbertForSequenceClassificationBase | |||||
| from ..builder import MODELS | |||||
| from ...metainfo import Models | |||||
| __all__ = ['SbertForNLI'] | |||||
| @MODELS.register_module(Tasks.nli, module_name=Models.structbert) | |||||
| class SbertForNLI(SbertForSequenceClassificationBase): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | |||||
| """initialize the text generation model from the `model_dir` path. | |||||
| Args: | |||||
| model_dir (str): the model path. | |||||
| model_cls (Optional[Any], optional): model loader, if None, use the | |||||
| default loader to load model weights, by default None. | |||||
| """ | |||||
| super().__init__(model_dir, *args, **kwargs) | |||||
| assert self.model.config.num_labels == 3 | |||||
| @@ -1,46 +1,14 @@ | |||||
| import os | |||||
| from typing import Any, Dict | |||||
| import json | |||||
| import numpy as np | |||||
| import torch | |||||
| from sofa import SbertModel | |||||
| from sofa.models.sbert.modeling_sbert import SbertPreTrainedModel | |||||
| from torch import nn | |||||
| from modelscope.metainfo import Models | from modelscope.metainfo import Models | ||||
| from modelscope.utils.constant import Tasks | from modelscope.utils.constant import Tasks | ||||
| from ..base import Model, Tensor | |||||
| from .sbert_for_sequence_classification import SbertForSequenceClassificationBase | |||||
| from ..builder import MODELS | from ..builder import MODELS | ||||
| __all__ = ['SbertForSentenceSimilarity'] | __all__ = ['SbertForSentenceSimilarity'] | ||||
| class SbertTextClassifier(SbertPreTrainedModel): | |||||
| def __init__(self, config): | |||||
| super().__init__(config) | |||||
| self.num_labels = config.num_labels | |||||
| self.config = config | |||||
| self.encoder = SbertModel(config, add_pooling_layer=True) | |||||
| self.dropout = nn.Dropout(config.hidden_dropout_prob) | |||||
| self.classifier = nn.Linear(config.hidden_size, config.num_labels) | |||||
| def forward(self, input_ids=None, token_type_ids=None): | |||||
| outputs = self.encoder( | |||||
| input_ids, | |||||
| token_type_ids=token_type_ids, | |||||
| return_dict=None, | |||||
| ) | |||||
| pooled_output = outputs[1] | |||||
| pooled_output = self.dropout(pooled_output) | |||||
| logits = self.classifier(pooled_output) | |||||
| return logits | |||||
| @MODELS.register_module( | @MODELS.register_module( | ||||
| Tasks.sentence_similarity, module_name=Models.structbert) | Tasks.sentence_similarity, module_name=Models.structbert) | ||||
| class SbertForSentenceSimilarity(Model): | |||||
| class SbertForSentenceSimilarity(SbertForSequenceClassificationBase): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | def __init__(self, model_dir: str, *args, **kwargs): | ||||
| """initialize the sentence similarity model from the `model_dir` path. | """initialize the sentence similarity model from the `model_dir` path. | ||||
| @@ -52,37 +20,4 @@ class SbertForSentenceSimilarity(Model): | |||||
| """ | """ | ||||
| super().__init__(model_dir, *args, **kwargs) | super().__init__(model_dir, *args, **kwargs) | ||||
| self.model_dir = model_dir | self.model_dir = model_dir | ||||
| self.model = SbertTextClassifier.from_pretrained( | |||||
| model_dir, num_labels=2) | |||||
| self.model.eval() | |||||
| self.label_path = os.path.join(self.model_dir, 'label_mapping.json') | |||||
| with open(self.label_path) as f: | |||||
| self.label_mapping = json.load(f) | |||||
| self.id2label = {idx: name for name, idx in self.label_mapping.items()} | |||||
| def forward(self, input: Dict[str, Any]) -> Dict[str, np.ndarray]: | |||||
| """return the result by the model | |||||
| Args: | |||||
| input (Dict[str, Any]): the preprocessed data | |||||
| Returns: | |||||
| Dict[str, np.ndarray]: results | |||||
| Example: | |||||
| { | |||||
| 'predictions': array([1]), # lable 0-negative 1-positive | |||||
| 'probabilities': array([[0.11491239, 0.8850876 ]], dtype=float32), | |||||
| 'logits': array([[-0.53860897, 1.5029076 ]], dtype=float32) # true value | |||||
| } | |||||
| """ | |||||
| input_ids = torch.tensor(input['input_ids'], dtype=torch.long) | |||||
| token_type_ids = torch.tensor( | |||||
| input['token_type_ids'], dtype=torch.long) | |||||
| with torch.no_grad(): | |||||
| logits = self.model(input_ids, token_type_ids) | |||||
| probs = logits.softmax(-1).numpy() | |||||
| pred = logits.argmax(-1).numpy() | |||||
| logits = logits.numpy() | |||||
| res = {'predictions': pred, 'probabilities': probs, 'logits': logits} | |||||
| return res | |||||
| assert self.model.config.num_labels == 2 | |||||
| @@ -0,0 +1,22 @@ | |||||
| from modelscope.utils.constant import Tasks | |||||
| from .sbert_for_sequence_classification import SbertForSequenceClassificationBase | |||||
| from ..builder import MODELS | |||||
| __all__ = ['SbertForSentimentClassification'] | |||||
| @MODELS.register_module( | |||||
| Tasks.sentiment_classification, | |||||
| module_name=r'sbert-sentiment-classification') | |||||
| class SbertForSentimentClassification(SbertForSequenceClassificationBase): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | |||||
| """initialize the text generation model from the `model_dir` path. | |||||
| Args: | |||||
| model_dir (str): the model path. | |||||
| model_cls (Optional[Any], optional): model loader, if None, use the | |||||
| default loader to load model weights, by default None. | |||||
| """ | |||||
| super().__init__(model_dir, *args, **kwargs) | |||||
| assert self.model.config.num_labels == 2 | |||||
| @@ -0,0 +1,55 @@ | |||||
| from torch import nn | |||||
| from typing import Any, Dict | |||||
| from ..base import Model | |||||
| import numpy as np | |||||
| import json | |||||
| import os | |||||
| from sofa.models.sbert.modeling_sbert import SbertPreTrainedModel, SbertModel | |||||
| class SbertTextClassfier(SbertPreTrainedModel): | |||||
| def __init__(self, config): | |||||
| super().__init__(config) | |||||
| self.num_labels = config.num_labels | |||||
| self.config = config | |||||
| self.encoder = SbertModel(config, add_pooling_layer=True) | |||||
| self.dropout = nn.Dropout(config.hidden_dropout_prob) | |||||
| self.classifier = nn.Linear(config.hidden_size, config.num_labels) | |||||
| def forward(self, input_ids=None, token_type_ids=None): | |||||
| outputs = self.encoder( | |||||
| input_ids, | |||||
| token_type_ids=token_type_ids, | |||||
| return_dict=None, | |||||
| ) | |||||
| pooled_output = outputs[1] | |||||
| pooled_output = self.dropout(pooled_output) | |||||
| logits = self.classifier(pooled_output) | |||||
| return { | |||||
| "logits": logits | |||||
| } | |||||
| class SbertForSequenceClassificationBase(Model): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | |||||
| super().__init__(model_dir, *args, **kwargs) | |||||
| self.model = SbertTextClassfier.from_pretrained(model_dir) | |||||
| self.id2label = {} | |||||
| self.label_path = os.path.join(self.model_dir, 'label_mapping.json') | |||||
| if os.path.exists(self.label_path): | |||||
| with open(self.label_path) as f: | |||||
| self.label_mapping = json.load(f) | |||||
| self.id2label = {idx: name for name, idx in self.label_mapping.items()} | |||||
| def forward(self, input: Dict[str, Any]) -> Dict[str, np.ndarray]: | |||||
| return self.model.forward(input) | |||||
| def postprocess(self, input, **kwargs): | |||||
| logits = input["logits"] | |||||
| probs = logits.softmax(-1).numpy() | |||||
| pred = logits.argmax(-1).numpy() | |||||
| logits = logits.numpy() | |||||
| res = {'predictions': pred, 'probabilities': probs, 'logits': logits} | |||||
| return res | |||||
| @@ -46,10 +46,11 @@ class StructBertForTokenClassification(Model): | |||||
| } | } | ||||
| """ | """ | ||||
| input_ids = torch.tensor(input['input_ids']).unsqueeze(0) | input_ids = torch.tensor(input['input_ids']).unsqueeze(0) | ||||
| output = self.model(input_ids) | |||||
| logits = output.logits | |||||
| return self.model(input_ids) | |||||
| def postprocess(self, input: Dict[str, Tensor], **kwargs) -> Dict[str, Tensor]: | |||||
| logits = input["logits"] | |||||
| pred = torch.argmax(logits[0], dim=-1) | pred = torch.argmax(logits[0], dim=-1) | ||||
| pred = pred.numpy() | pred = pred.numpy() | ||||
| rst = {'predictions': pred, 'logits': logits, 'text': input['text']} | rst = {'predictions': pred, 'logits': logits, 'text': input['text']} | ||||
| return rst | return rst | ||||
| @@ -1,19 +1,19 @@ | |||||
| from typing import Any, Dict | from typing import Any, Dict | ||||
| import numpy as np | import numpy as np | ||||
| import torch | |||||
| from modelscope.utils.constant import Tasks | from modelscope.utils.constant import Tasks | ||||
| from ..base import Model | from ..base import Model | ||||
| from ..builder import MODELS | from ..builder import MODELS | ||||
| from ...metainfo import Models | |||||
| __all__ = ['BertForZeroShotClassification'] | |||||
| __all__ = ['SbertForZeroShotClassification'] | |||||
| @MODELS.register_module( | @MODELS.register_module( | ||||
| Tasks.zero_shot_classification, | Tasks.zero_shot_classification, | ||||
| module_name=r'bert-zero-shot-classification') | |||||
| class BertForZeroShotClassification(Model): | |||||
| module_name=Models.structbert) | |||||
| class SbertForZeroShotClassification(Model): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | def __init__(self, model_dir: str, *args, **kwargs): | ||||
| """initialize the zero shot classification model from the `model_dir` path. | """initialize the zero shot classification model from the `model_dir` path. | ||||
| @@ -25,7 +25,6 @@ class BertForZeroShotClassification(Model): | |||||
| super().__init__(model_dir, *args, **kwargs) | super().__init__(model_dir, *args, **kwargs) | ||||
| from sofa import SbertForSequenceClassification | from sofa import SbertForSequenceClassification | ||||
| self.model = SbertForSequenceClassification.from_pretrained(model_dir) | self.model = SbertForSequenceClassification.from_pretrained(model_dir) | ||||
| self.model.eval() | |||||
| def forward(self, input: Dict[str, Any]) -> Dict[str, np.ndarray]: | def forward(self, input: Dict[str, Any]) -> Dict[str, np.ndarray]: | ||||
| """return the result by the model | """return the result by the model | ||||
| @@ -40,8 +39,7 @@ class BertForZeroShotClassification(Model): | |||||
| 'logits': array([[-0.53860897, 1.5029076 ]], dtype=float32) # true value | 'logits': array([[-0.53860897, 1.5029076 ]], dtype=float32) # true value | ||||
| } | } | ||||
| """ | """ | ||||
| with torch.no_grad(): | |||||
| outputs = self.model(**input) | |||||
| outputs = self.model(**input) | |||||
| logits = outputs['logits'].numpy() | logits = outputs['logits'].numpy() | ||||
| res = {'logits': logits} | res = {'logits': logits} | ||||
| return res | return res | ||||
| @@ -1,85 +0,0 @@ | |||||
| import os | |||||
| from typing import Any, Dict | |||||
| import numpy as np | |||||
| import torch | |||||
| from sofa import SbertConfig, SbertModel | |||||
| from sofa.models.sbert.modeling_sbert import SbertPreTrainedModel | |||||
| from torch import nn | |||||
| from transformers.activations import ACT2FN, get_activation | |||||
| from transformers.models.bert.modeling_bert import SequenceClassifierOutput | |||||
| from modelscope.utils.constant import Tasks | |||||
| from ..base import Model, Tensor | |||||
| from ..builder import MODELS | |||||
| __all__ = ['SbertForSentimentClassification'] | |||||
| class SbertTextClassifier(SbertPreTrainedModel): | |||||
| def __init__(self, config): | |||||
| super().__init__(config) | |||||
| self.num_labels = config.num_labels | |||||
| self.config = config | |||||
| self.encoder = SbertModel(config, add_pooling_layer=True) | |||||
| self.dropout = nn.Dropout(config.hidden_dropout_prob) | |||||
| self.classifier = nn.Linear(config.hidden_size, config.num_labels) | |||||
| def forward(self, input_ids=None, token_type_ids=None): | |||||
| outputs = self.encoder( | |||||
| input_ids, | |||||
| token_type_ids=token_type_ids, | |||||
| return_dict=None, | |||||
| ) | |||||
| pooled_output = outputs[1] | |||||
| pooled_output = self.dropout(pooled_output) | |||||
| logits = self.classifier(pooled_output) | |||||
| return logits | |||||
| @MODELS.register_module( | |||||
| Tasks.sentiment_classification, | |||||
| module_name=r'sbert-sentiment-classification') | |||||
| class SbertForSentimentClassification(Model): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | |||||
| """initialize the text generation model from the `model_dir` path. | |||||
| Args: | |||||
| model_dir (str): the model path. | |||||
| model_cls (Optional[Any], optional): model loader, if None, use the | |||||
| default loader to load model weights, by default None. | |||||
| """ | |||||
| super().__init__(model_dir, *args, **kwargs) | |||||
| self.model_dir = model_dir | |||||
| self.model = SbertTextClassifier.from_pretrained( | |||||
| model_dir, num_labels=2) | |||||
| self.model.eval() | |||||
| def forward(self, input: Dict[str, Any]) -> Dict[str, np.ndarray]: | |||||
| """return the result by the model | |||||
| Args: | |||||
| input (Dict[str, Any]): the preprocessed data | |||||
| Returns: | |||||
| Dict[str, np.ndarray]: results | |||||
| Example: | |||||
| { | |||||
| 'predictions': array([1]), # lable 0-negative 1-positive | |||||
| 'probabilities': array([[0.11491239, 0.8850876 ]], dtype=float32), | |||||
| 'logits': array([[-0.53860897, 1.5029076 ]], dtype=float32) # true value | |||||
| } | |||||
| """ | |||||
| input_ids = torch.tensor(input['input_ids'], dtype=torch.long) | |||||
| token_type_ids = torch.tensor( | |||||
| input['token_type_ids'], dtype=torch.long) | |||||
| with torch.no_grad(): | |||||
| logits = self.model(input_ids, token_type_ids) | |||||
| probs = logits.softmax(-1).numpy() | |||||
| pred = logits.argmax(-1).numpy() | |||||
| logits = logits.numpy() | |||||
| res = {'predictions': pred, 'probabilities': probs, 'logits': logits} | |||||
| return res | |||||
| @@ -1,11 +1,11 @@ | |||||
| import os | import os | ||||
| from typing import Any, Dict | from typing import Any, Dict | ||||
| from modelscope.preprocessors.space.fields.intent_field import \ | |||||
| from ....preprocessors.space.fields.intent_field import \ | |||||
| IntentBPETextField | IntentBPETextField | ||||
| from modelscope.trainers.nlp.space.trainers.intent_trainer import IntentTrainer | |||||
| from modelscope.utils.config import Config | |||||
| from modelscope.utils.constant import Tasks | |||||
| from ....trainers.nlp.space.trainers.intent_trainer import IntentTrainer | |||||
| from ....utils.config import Config | |||||
| from ....utils.constant import Tasks | |||||
| from ...base import Model, Tensor | from ...base import Model, Tensor | ||||
| from ...builder import MODELS | from ...builder import MODELS | ||||
| from .model.generator import Generator | from .model.generator import Generator | ||||
| @@ -1,11 +1,11 @@ | |||||
| import os | import os | ||||
| from typing import Any, Dict, Optional | from typing import Any, Dict, Optional | ||||
| from modelscope.preprocessors.space.fields.gen_field import \ | |||||
| from ....preprocessors.space.fields.gen_field import \ | |||||
| MultiWOZBPETextField | MultiWOZBPETextField | ||||
| from modelscope.trainers.nlp.space.trainers.gen_trainer import MultiWOZTrainer | |||||
| from modelscope.utils.config import Config | |||||
| from modelscope.utils.constant import Tasks | |||||
| from ....trainers.nlp.space.trainers.gen_trainer import MultiWOZTrainer | |||||
| from ....utils.config import Config | |||||
| from ....utils.constant import Tasks | |||||
| from ...base import Model, Tensor | from ...base import Model, Tensor | ||||
| from ...builder import MODELS | from ...builder import MODELS | ||||
| from .model.generator import Generator | from .model.generator import Generator | ||||
| @@ -3,7 +3,7 @@ IntentUnifiedTransformer | |||||
| """ | """ | ||||
| import torch | import torch | ||||
| from modelscope.models.nlp.space.model.unified_transformer import \ | |||||
| from .unified_transformer import \ | |||||
| UnifiedTransformer | UnifiedTransformer | ||||
| @@ -5,7 +5,7 @@ import torch | |||||
| import torch.nn as nn | import torch.nn as nn | ||||
| import torch.nn.functional as F | import torch.nn.functional as F | ||||
| from modelscope.utils.nlp.space.criterions import compute_kl_loss | |||||
| from .....utils.nlp.space.criterions import compute_kl_loss | |||||
| from .unified_transformer import UnifiedTransformer | from .unified_transformer import UnifiedTransformer | ||||
| @@ -7,9 +7,9 @@ import torch | |||||
| import torch.nn as nn | import torch.nn as nn | ||||
| import torch.nn.functional as F | import torch.nn.functional as F | ||||
| from modelscope.models.nlp.space.model.model_base import ModelBase | |||||
| from modelscope.models.nlp.space.modules.embedder import Embedder | |||||
| from modelscope.models.nlp.space.modules.transformer_block import \ | |||||
| from .model_base import ModelBase | |||||
| from ..modules.embedder import Embedder | |||||
| from ..modules.transformer_block import \ | |||||
| TransformerBlock | TransformerBlock | ||||
| @@ -5,8 +5,8 @@ TransformerBlock class. | |||||
| import torch | import torch | ||||
| import torch.nn as nn | import torch.nn as nn | ||||
| from modelscope.models.nlp.space.modules.feedforward import FeedForward | |||||
| from modelscope.models.nlp.space.modules.multihead_attention import \ | |||||
| from .feedforward import FeedForward | |||||
| from .multihead_attention import \ | |||||
| MultiheadAttention | MultiheadAttention | ||||
| @@ -2,10 +2,10 @@ from typing import Any, Dict, Union | |||||
| import numpy as np | import numpy as np | ||||
| from modelscope.metainfo import Pipelines | |||||
| from modelscope.models.nlp import SbertForSentenceSimilarity | |||||
| from modelscope.preprocessors import SequenceClassificationPreprocessor | |||||
| from modelscope.utils.constant import Tasks | |||||
| from ...metainfo import Pipelines | |||||
| from ...models.nlp import SbertForSentenceSimilarity | |||||
| from ...preprocessors import SequenceClassificationPreprocessor | |||||
| from ...utils.constant import Tasks | |||||
| from ...models import Model | from ...models import Model | ||||
| from ..base import Input, Pipeline | from ..base import Input, Pipeline | ||||
| from ..builder import PIPELINES | from ..builder import PIPELINES | ||||
| @@ -18,7 +18,7 @@ __all__ = ['SentenceSimilarityPipeline'] | |||||
| class SentenceSimilarityPipeline(Pipeline): | class SentenceSimilarityPipeline(Pipeline): | ||||
| def __init__(self, | def __init__(self, | ||||
| model: Union[SbertForSentenceSimilarity, str], | |||||
| model: Union[Model, str], | |||||
| preprocessor: SequenceClassificationPreprocessor = None, | preprocessor: SequenceClassificationPreprocessor = None, | ||||
| **kwargs): | **kwargs): | ||||
| """use `model` and `preprocessor` to create a nlp sentence similarity pipeline for prediction | """use `model` and `preprocessor` to create a nlp sentence similarity pipeline for prediction | ||||
| @@ -1,10 +1,10 @@ | |||||
| from typing import Any, Dict, Optional | |||||
| from typing import Any, Dict | |||||
| from modelscope.models.nlp import DialogIntentModel | |||||
| from modelscope.preprocessors import DialogIntentPredictionPreprocessor | |||||
| from modelscope.utils.constant import Tasks | |||||
| from ...base import Input, Pipeline | |||||
| from ...base import Pipeline | |||||
| from ...builder import PIPELINES | from ...builder import PIPELINES | ||||
| from ....models.nlp import DialogIntentModel | |||||
| from ....preprocessors import DialogIntentPredictionPreprocessor | |||||
| from ....utils.constant import Tasks | |||||
| __all__ = ['DialogIntentPredictionPipeline'] | __all__ = ['DialogIntentPredictionPipeline'] | ||||
| @@ -6,8 +6,8 @@ import json | |||||
| import numpy as np | import numpy as np | ||||
| from scipy.special import softmax | from scipy.special import softmax | ||||
| from modelscope.models.nlp import BertForZeroShotClassification | |||||
| from modelscope.preprocessors import ZeroShotClassificationPreprocessor | |||||
| from modelscope.models.nlp import SbertForZeroShotClassification | |||||
| from modelscope.preprocessors import SbertZeroShotClassificationPreprocessor | |||||
| from modelscope.utils.constant import Tasks | from modelscope.utils.constant import Tasks | ||||
| from ...models import Model | from ...models import Model | ||||
| from ..base import Input, Pipeline | from ..base import Input, Pipeline | ||||
| @@ -22,8 +22,8 @@ __all__ = ['ZeroShotClassificationPipeline'] | |||||
| class ZeroShotClassificationPipeline(Pipeline): | class ZeroShotClassificationPipeline(Pipeline): | ||||
| def __init__(self, | def __init__(self, | ||||
| model: Union[BertForZeroShotClassification, str], | |||||
| preprocessor: ZeroShotClassificationPreprocessor = None, | |||||
| model: Union[SbertForZeroShotClassification, str], | |||||
| preprocessor: SbertZeroShotClassificationPreprocessor = None, | |||||
| **kwargs): | **kwargs): | ||||
| """use `model` and `preprocessor` to create a nlp text classification pipeline for prediction | """use `model` and `preprocessor` to create a nlp text classification pipeline for prediction | ||||
| @@ -31,11 +31,11 @@ class ZeroShotClassificationPipeline(Pipeline): | |||||
| model (SbertForSentimentClassification): a model instance | model (SbertForSentimentClassification): a model instance | ||||
| preprocessor (SentimentClassificationPreprocessor): a preprocessor instance | preprocessor (SentimentClassificationPreprocessor): a preprocessor instance | ||||
| """ | """ | ||||
| assert isinstance(model, str) or isinstance(model, BertForZeroShotClassification), \ | |||||
| assert isinstance(model, str) or isinstance(model, SbertForZeroShotClassification), \ | |||||
| 'model must be a single str or BertForZeroShotClassification' | 'model must be a single str or BertForZeroShotClassification' | ||||
| sc_model = model if isinstance( | sc_model = model if isinstance( | ||||
| model, | model, | ||||
| BertForZeroShotClassification) else Model.from_pretrained(model) | |||||
| SbertForZeroShotClassification) else Model.from_pretrained(model) | |||||
| self.entailment_id = 0 | self.entailment_id = 0 | ||||
| self.contradiction_id = 2 | self.contradiction_id = 2 | ||||
| @@ -5,17 +5,18 @@ from typing import Any, Dict, Union | |||||
| from transformers import AutoTokenizer | from transformers import AutoTokenizer | ||||
| from modelscope.metainfo import Preprocessors | |||||
| from modelscope.utils.constant import Fields, InputFields | |||||
| from modelscope.utils.type_assert import type_assert | |||||
| from ..metainfo import Preprocessors | |||||
| from ..metainfo import Models | |||||
| from ..utils.constant import Fields, InputFields | |||||
| from ..utils.type_assert import type_assert | |||||
| from .base import Preprocessor | from .base import Preprocessor | ||||
| from .builder import PREPROCESSORS | from .builder import PREPROCESSORS | ||||
| __all__ = [ | __all__ = [ | ||||
| 'Tokenize', 'SequenceClassificationPreprocessor', | 'Tokenize', 'SequenceClassificationPreprocessor', | ||||
| 'TextGenerationPreprocessor', 'ZeroShotClassificationPreprocessor', | |||||
| 'TokenClassifcationPreprocessor', 'NLIPreprocessor', | |||||
| 'SentimentClassificationPreprocessor', 'FillMaskPreprocessor' | |||||
| 'PalmTextGenerationPreprocessor', 'SbertZeroShotClassificationPreprocessor', | |||||
| 'SbertTokenClassifcationPreprocessor', 'SbertNLIPreprocessor', | |||||
| 'SbertSentimentClassificationPreprocessor', 'FillMaskPreprocessor' | |||||
| ] | ] | ||||
| @@ -34,8 +35,8 @@ class Tokenize(Preprocessor): | |||||
| @PREPROCESSORS.register_module( | @PREPROCESSORS.register_module( | ||||
| Fields.nlp, module_name=r'nlp_structbert_nli_chinese-base') | |||||
| class NLIPreprocessor(Preprocessor): | |||||
| Fields.nlp, module_name=Preprocessors.sbert_nli_tokenizer) | |||||
| class SbertNLIPreprocessor(Preprocessor): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | def __init__(self, model_dir: str, *args, **kwargs): | ||||
| """preprocess the data via the vocab.txt from the `model_dir` path | """preprocess the data via the vocab.txt from the `model_dir` path | ||||
| @@ -104,8 +105,8 @@ class NLIPreprocessor(Preprocessor): | |||||
| @PREPROCESSORS.register_module( | @PREPROCESSORS.register_module( | ||||
| Fields.nlp, module_name=r'sbert-sentiment-classification') | |||||
| class SentimentClassificationPreprocessor(Preprocessor): | |||||
| Fields.nlp, module_name=Preprocessors.sbert_sen_cls_tokenizer) | |||||
| class SbertSentimentClassificationPreprocessor(Preprocessor): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | def __init__(self, model_dir: str, *args, **kwargs): | ||||
| """preprocess the data via the vocab.txt from the `model_dir` path | """preprocess the data via the vocab.txt from the `model_dir` path | ||||
| @@ -263,7 +264,7 @@ class SequenceClassificationPreprocessor(Preprocessor): | |||||
| @PREPROCESSORS.register_module( | @PREPROCESSORS.register_module( | ||||
| Fields.nlp, module_name=Preprocessors.palm_text_gen_tokenizer) | Fields.nlp, module_name=Preprocessors.palm_text_gen_tokenizer) | ||||
| class TextGenerationPreprocessor(Preprocessor): | |||||
| class PalmTextGenerationPreprocessor(Preprocessor): | |||||
| def __init__(self, model_dir: str, tokenizer, *args, **kwargs): | def __init__(self, model_dir: str, tokenizer, *args, **kwargs): | ||||
| """preprocess the data using the vocab.txt from the `model_dir` path | """preprocess the data using the vocab.txt from the `model_dir` path | ||||
| @@ -373,8 +374,8 @@ class FillMaskPreprocessor(Preprocessor): | |||||
| @PREPROCESSORS.register_module( | @PREPROCESSORS.register_module( | ||||
| Fields.nlp, module_name=r'bert-zero-shot-classification') | |||||
| class ZeroShotClassificationPreprocessor(Preprocessor): | |||||
| Fields.nlp, module_name=Preprocessors.sbert_zero_shot_cls_tokenizer) | |||||
| class SbertZeroShotClassificationPreprocessor(Preprocessor): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | def __init__(self, model_dir: str, *args, **kwargs): | ||||
| """preprocess the data via the vocab.txt from the `model_dir` path | """preprocess the data via the vocab.txt from the `model_dir` path | ||||
| @@ -418,7 +419,7 @@ class ZeroShotClassificationPreprocessor(Preprocessor): | |||||
| @PREPROCESSORS.register_module( | @PREPROCESSORS.register_module( | ||||
| Fields.nlp, module_name=Preprocessors.sbert_token_cls_tokenizer) | Fields.nlp, module_name=Preprocessors.sbert_token_cls_tokenizer) | ||||
| class TokenClassifcationPreprocessor(Preprocessor): | |||||
| class SbertTokenClassifcationPreprocessor(Preprocessor): | |||||
| def __init__(self, model_dir: str, *args, **kwargs): | def __init__(self, model_dir: str, *args, **kwargs): | ||||
| """preprocess the data via the vocab.txt from the `model_dir` path | """preprocess the data via the vocab.txt from the `model_dir` path | ||||
| @@ -3,11 +3,11 @@ | |||||
| import os | import os | ||||
| from typing import Any, Dict | from typing import Any, Dict | ||||
| from modelscope.preprocessors.space.fields.intent_field import \ | |||||
| from .fields.intent_field import \ | |||||
| IntentBPETextField | IntentBPETextField | ||||
| from modelscope.utils.config import Config | |||||
| from modelscope.utils.constant import Fields | |||||
| from modelscope.utils.type_assert import type_assert | |||||
| from ...utils.config import Config | |||||
| from ...utils.constant import Fields | |||||
| from ...utils.type_assert import type_assert | |||||
| from ..base import Preprocessor | from ..base import Preprocessor | ||||
| from ..builder import PREPROCESSORS | from ..builder import PREPROCESSORS | ||||
| @@ -1,16 +1,15 @@ | |||||
| # Copyright (c) Alibaba, Inc. and its affiliates. | # Copyright (c) Alibaba, Inc. and its affiliates. | ||||
| import os | import os | ||||
| import uuid | |||||
| from typing import Any, Dict, Union | |||||
| from typing import Any, Dict | |||||
| from modelscope.preprocessors.space.fields.gen_field import \ | |||||
| from .fields.gen_field import \ | |||||
| MultiWOZBPETextField | MultiWOZBPETextField | ||||
| from modelscope.utils.config import Config | |||||
| from modelscope.utils.constant import Fields, InputFields | |||||
| from modelscope.utils.type_assert import type_assert | |||||
| from ..base import Preprocessor | from ..base import Preprocessor | ||||
| from ..builder import PREPROCESSORS | from ..builder import PREPROCESSORS | ||||
| from ...utils.config import Config | |||||
| from ...utils.constant import Fields | |||||
| from ...utils.type_assert import type_assert | |||||
| __all__ = ['DialogModelingPreprocessor'] | __all__ = ['DialogModelingPreprocessor'] | ||||
| @@ -8,10 +8,10 @@ from itertools import chain | |||||
| import numpy as np | import numpy as np | ||||
| from modelscope.preprocessors.space.tokenizer import Tokenizer | |||||
| from modelscope.utils.nlp.space import ontology, utils | |||||
| from modelscope.utils.nlp.space.db_ops import MultiWozDB | |||||
| from modelscope.utils.nlp.space.utils import list2np | |||||
| from ..tokenizer import Tokenizer | |||||
| from ....utils.nlp.space import ontology, utils | |||||
| from ....utils.nlp.space.db_ops import MultiWozDB | |||||
| from ....utils.nlp.space.utils import list2np | |||||
| class BPETextField(object): | class BPETextField(object): | ||||
| @@ -14,10 +14,10 @@ import json | |||||
| import numpy as np | import numpy as np | ||||
| from tqdm import tqdm | from tqdm import tqdm | ||||
| from modelscope.preprocessors.space.tokenizer import Tokenizer | |||||
| from modelscope.utils.nlp.space import ontology, utils | |||||
| from modelscope.utils.nlp.space.scores import hierarchical_set_score | |||||
| from modelscope.utils.nlp.space.utils import list2np | |||||
| from ..tokenizer import Tokenizer | |||||
| from ....utils.nlp.space import ontology, utils | |||||
| from ....utils.nlp.space.scores import hierarchical_set_score | |||||
| from ....utils.nlp.space.utils import list2np | |||||
| class BPETextField(object): | class BPETextField(object): | ||||
| @@ -13,7 +13,7 @@ import torch | |||||
| from tqdm import tqdm | from tqdm import tqdm | ||||
| from transformers.optimization import AdamW, get_linear_schedule_with_warmup | from transformers.optimization import AdamW, get_linear_schedule_with_warmup | ||||
| import modelscope.utils.nlp.space.ontology as ontology | |||||
| from .....utils.nlp.space import ontology | |||||
| from ..metrics.metrics_tracker import MetricsTracker | from ..metrics.metrics_tracker import MetricsTracker | ||||
| @@ -14,9 +14,8 @@ import torch | |||||
| from tqdm import tqdm | from tqdm import tqdm | ||||
| from transformers.optimization import AdamW, get_linear_schedule_with_warmup | from transformers.optimization import AdamW, get_linear_schedule_with_warmup | ||||
| from modelscope.trainers.nlp.space.metrics.metrics_tracker import \ | |||||
| from ..metrics.metrics_tracker import \ | |||||
| MetricsTracker | MetricsTracker | ||||
| from modelscope.utils.nlp.space.args import str2bool | |||||
| def get_logger(log_path, name='default'): | def get_logger(log_path, name='default'): | ||||