mirror of
https://github.com/modelscope/modelscope.git
synced 2025-12-22 19:19:21 +01:00
1.新增支持原始bert模型(非easynlp的 backbone prefix版本)
2.支持bert的在sequence classification/fill mask /token classification上的backbone head形式
3.统一了sequence classification几个任务的pipeline到一个类
4.fill mask 支持backbone head形式
5.token classification的几个子任务(ner,word seg, part of speech)的preprocessor 统一到了一起TokenClassificationPreprocessor
6. sequence classification的几个子任务(single classification, pair classification)的preprocessor 统一到了一起SequenceClassificationPreprocessor
7. 改动register中 cls的group_key 赋值位置,之前的group_key在多个decorators的情况下,会被覆盖,obj_cls的group_key信息不正确
8. 基于backbone head形式将 原本group_key和 module同名的情况尝试做调整,如下在modelscope/pipelines/nlp/sequence_classification_pipeline.py 中
原本
@PIPELINES.register_module(
Tasks.sentiment_classification, module_name=Pipelines.sentiment_classification)
改成
@PIPELINES.register_module(
Tasks.text_classification, module_name=Pipelines.sentiment_classification)
相应的configuration.json也有改动,这样的改动更符合任务和pipline(子任务)的关系。
8. 其他相应改动为支持上述功能
Link: https://code.alibaba-inc.com/Ali-MaaS/MaaS-lib/codereview/10041463
189 lines
8.2 KiB
Python
189 lines
8.2 KiB
Python
# Copyright (c) Alibaba, Inc. and its affiliates.
|
||
import unittest
|
||
|
||
from regex import R
|
||
|
||
from modelscope.hub.snapshot_download import snapshot_download
|
||
from modelscope.models import Model
|
||
from modelscope.models.nlp import (BertForMaskedLM, StructBertForMaskedLM,
|
||
VecoForMaskedLM)
|
||
from modelscope.pipelines import pipeline
|
||
from modelscope.pipelines.nlp import FillMaskPipeline
|
||
from modelscope.preprocessors import NLPPreprocessor
|
||
from modelscope.utils.constant import Tasks
|
||
from modelscope.utils.demo_utils import DemoCompatibilityCheck
|
||
from modelscope.utils.regress_test_utils import MsRegressTool
|
||
from modelscope.utils.test_utils import test_level
|
||
|
||
|
||
class FillMaskTest(unittest.TestCase, DemoCompatibilityCheck):
|
||
|
||
def setUp(self) -> None:
|
||
self.task = Tasks.fill_mask
|
||
self.model_id = 'damo/nlp_veco_fill-mask-large'
|
||
|
||
model_id_sbert = {
|
||
'zh': 'damo/nlp_structbert_fill-mask_chinese-large',
|
||
'en': 'damo/nlp_structbert_fill-mask_english-large'
|
||
}
|
||
model_id_veco = 'damo/nlp_veco_fill-mask-large'
|
||
model_id_bert = 'damo/nlp_bert_fill-mask_chinese-base'
|
||
|
||
ori_texts = {
|
||
'zh':
|
||
'段誉轻挥折扇,摇了摇头,说道:“你师父是你的师父,你师父可不是我的师父。'
|
||
'你师父差得动你,你师父可差不动我。',
|
||
'en':
|
||
'Everything in what you call reality is really just a reflection of your '
|
||
'consciousness. Your whole universe is just a mirror reflection of your story.'
|
||
}
|
||
|
||
test_inputs = {
|
||
'zh':
|
||
'段誉轻[MASK]折扇,摇了摇[MASK],[MASK]道:“你师父是你的[MASK][MASK],你'
|
||
'师父可不是[MASK]的师父。你师父差得动你,你师父可[MASK]不动我。',
|
||
'en':
|
||
'Everything in [MASK] you call reality is really [MASK] a reflection of your '
|
||
'[MASK]. Your [MASK] universe is just a mirror [MASK] of your story.'
|
||
}
|
||
regress_tool = MsRegressTool(baseline=False)
|
||
|
||
@unittest.skipUnless(test_level() >= 2, 'skip test in current test level')
|
||
def test_run_by_direct_model_download(self):
|
||
# sbert
|
||
for language in ['zh']:
|
||
model_dir = snapshot_download(self.model_id_sbert[language])
|
||
preprocessor = NLPPreprocessor(
|
||
model_dir, first_sequence='sentence', second_sequence=None)
|
||
model = StructBertForMaskedLM.from_pretrained(model_dir)
|
||
pipeline1 = FillMaskPipeline(model, preprocessor)
|
||
pipeline2 = pipeline(
|
||
Tasks.fill_mask, model=model, preprocessor=preprocessor)
|
||
ori_text = self.ori_texts[language]
|
||
test_input = self.test_inputs[language]
|
||
print(
|
||
f'\nori_text: {ori_text}\ninput: {test_input}\npipeline1: '
|
||
f'{pipeline1(test_input)}\npipeline2: {pipeline2(test_input)}\n'
|
||
)
|
||
|
||
# veco
|
||
model_dir = snapshot_download(self.model_id_veco)
|
||
preprocessor = NLPPreprocessor(
|
||
model_dir, first_sequence='sentence', second_sequence=None)
|
||
model = VecoForMaskedLM.from_pretrained(model_dir)
|
||
pipeline1 = FillMaskPipeline(model, preprocessor)
|
||
pipeline2 = pipeline(
|
||
Tasks.fill_mask, model=model, preprocessor=preprocessor)
|
||
for language in ['zh', 'en']:
|
||
ori_text = self.ori_texts[language]
|
||
test_input = self.test_inputs[language].replace('[MASK]', '<mask>')
|
||
print(
|
||
f'\nori_text: {ori_text}\ninput: {test_input}\npipeline1: '
|
||
f'{pipeline1(test_input)}\npipeline2: {pipeline2(test_input)}\n'
|
||
)
|
||
|
||
# bert
|
||
language = 'zh'
|
||
model_dir = snapshot_download(self.model_id_bert, revision='beta')
|
||
preprocessor = NLPPreprocessor(
|
||
model_dir, first_sequence='sentence', second_sequence=None)
|
||
model = Model.from_pretrained(model_dir)
|
||
pipeline1 = FillMaskPipeline(model, preprocessor)
|
||
pipeline2 = pipeline(
|
||
Tasks.fill_mask, model=model, preprocessor=preprocessor)
|
||
ori_text = self.ori_texts[language]
|
||
test_input = self.test_inputs[language]
|
||
print(f'\nori_text: {ori_text}\ninput: {test_input}\npipeline1: '
|
||
f'{pipeline1(test_input)}\npipeline2: {pipeline2(test_input)}\n')
|
||
|
||
@unittest.skipUnless(test_level() >= 0, 'skip test in current test level')
|
||
def test_run_with_model_from_modelhub(self):
|
||
|
||
# sbert
|
||
for language in ['zh']:
|
||
print(self.model_id_sbert[language])
|
||
model = Model.from_pretrained(self.model_id_sbert[language])
|
||
preprocessor = NLPPreprocessor(
|
||
model.model_dir,
|
||
first_sequence='sentence',
|
||
second_sequence=None)
|
||
pipeline_ins = pipeline(
|
||
task=Tasks.fill_mask, model=model, preprocessor=preprocessor)
|
||
with self.regress_tool.monitor_module_single_forward(
|
||
pipeline_ins.model, f'fill_mask_sbert_{language}'):
|
||
print(
|
||
f'\nori_text: {self.ori_texts[language]}\ninput: {self.test_inputs[language]}\npipeline: '
|
||
f'{pipeline_ins(self.test_inputs[language])}\n')
|
||
|
||
# veco
|
||
model = Model.from_pretrained(self.model_id_veco)
|
||
preprocessor = NLPPreprocessor(
|
||
model.model_dir, first_sequence='sentence', second_sequence=None)
|
||
pipeline_ins = pipeline(
|
||
Tasks.fill_mask, model=model, preprocessor=preprocessor)
|
||
for language in ['zh', 'en']:
|
||
ori_text = self.ori_texts[language]
|
||
test_input = self.test_inputs[language].replace('[MASK]', '<mask>')
|
||
with self.regress_tool.monitor_module_single_forward(
|
||
pipeline_ins.model, f'fill_mask_veco_{language}'):
|
||
print(
|
||
f'\nori_text: {ori_text}\ninput: {test_input}\npipeline: '
|
||
f'{pipeline_ins(test_input)}\n')
|
||
|
||
# bert
|
||
language = 'zh'
|
||
model = Model.from_pretrained(self.model_id_bert, revision='beta')
|
||
preprocessor = NLPPreprocessor(
|
||
model.model_dir, first_sequence='sentence', second_sequence=None)
|
||
pipeline_ins = pipeline(
|
||
Tasks.fill_mask, model=model, preprocessor=preprocessor)
|
||
pipeline_ins.model, f'fill_mask_bert_{language}'
|
||
print(
|
||
f'\nori_text: {self.ori_texts[language]}\ninput: {self.test_inputs[language]}\npipeline: '
|
||
f'{pipeline_ins(self.test_inputs[language])}\n')
|
||
|
||
@unittest.skipUnless(test_level() >= 0, 'skip test in current test level')
|
||
def test_run_with_model_name(self):
|
||
# veco
|
||
pipeline_ins = pipeline(task=Tasks.fill_mask, model=self.model_id_veco)
|
||
for language in ['zh', 'en']:
|
||
ori_text = self.ori_texts[language]
|
||
test_input = self.test_inputs[language].replace('[MASK]', '<mask>')
|
||
print(f'\nori_text: {ori_text}\ninput: {test_input}\npipeline: '
|
||
f'{pipeline_ins(test_input)}\n')
|
||
|
||
# structBert
|
||
language = 'zh'
|
||
pipeline_ins = pipeline(
|
||
task=Tasks.fill_mask, model=self.model_id_sbert[language])
|
||
print(
|
||
f'\nori_text: {self.ori_texts[language]}\ninput: {self.test_inputs[language]}\npipeline: '
|
||
f'{pipeline_ins(self.test_inputs[language])}\n')
|
||
|
||
# Bert
|
||
language = 'zh'
|
||
pipeline_ins = pipeline(
|
||
task=Tasks.fill_mask,
|
||
model=self.model_id_bert,
|
||
model_revision='beta')
|
||
print(
|
||
f'\nori_text: {self.ori_texts[language]}\ninput: {self.test_inputs[language]}\npipeline: '
|
||
f'{pipeline_ins(self.test_inputs[language])}\n')
|
||
|
||
@unittest.skipUnless(test_level() >= 2, 'skip test in current test level')
|
||
def test_run_with_default_model(self):
|
||
pipeline_ins = pipeline(task=Tasks.fill_mask)
|
||
language = 'en'
|
||
ori_text = self.ori_texts[language]
|
||
test_input = self.test_inputs[language].replace('[MASK]', '<mask>')
|
||
print(f'\nori_text: {ori_text}\ninput: {test_input}\npipeline: '
|
||
f'{pipeline_ins(test_input)}\n')
|
||
|
||
@unittest.skipUnless(test_level() >= 0, 'skip test in current test level')
|
||
def test_demo_compatibility(self):
|
||
self.compatibility_check()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
unittest.main()
|