| @@ -63,15 +63,16 @@ class SpaceForDialogIntent(Model): | |||
| """return the result by the model | |||
| Args: | |||
| input (Dict[str, Any]): the preprocessed data | |||
| input (Dict[str, Tensor]): the preprocessed data | |||
| Returns: | |||
| Dict[str, np.ndarray]: results | |||
| Dict[str, Tensor]: 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 | |||
| 'pred': array([2.62349960e-03 4.12110658e-03 4.12748595e-05 3.77560973e-05 | |||
| 1.08599677e-04 1.72710388e-05 2.95618793e-05 1.93638436e-04 | |||
| 6.45841064e-05 1.15997791e-04 5.11605394e-05 9.87020373e-01 | |||
| 2.66957268e-05 4.72324500e-05 9.74208378e-05], dtype=float32) | |||
| } | |||
| """ | |||
| import numpy as np | |||
| @@ -62,15 +62,17 @@ class SpaceForDialogModeling(Model): | |||
| """return the result by the model | |||
| Args: | |||
| input (Dict[str, Any]): the preprocessed data | |||
| input (Dict[str, Tensor]): the preprocessed data | |||
| Returns: | |||
| Dict[str, np.ndarray]: results | |||
| Dict[str, Tensor]: 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 | |||
| 'labels': array([1,192,321,12]), # lable | |||
| 'resp': array([293,1023,123,1123]), #vocab label for response | |||
| 'bspn': array([123,321,2,24,1 ]), | |||
| 'aspn': array([47,8345,32,29,1983]), | |||
| 'db': array([19, 24, 20]), | |||
| } | |||
| """ | |||
| @@ -2,6 +2,7 @@ import os | |||
| from typing import Any, Dict | |||
| from modelscope.utils.constant import Tasks | |||
| from ....metainfo import Models | |||
| from ....utils.nlp.space.utils_dst import batch_to_device | |||
| from ...base import Model, Tensor | |||
| from ...builder import MODELS | |||
| @@ -9,7 +10,7 @@ from ...builder import MODELS | |||
| __all__ = ['SpaceForDialogStateTracking'] | |||
| @MODELS.register_module(Tasks.dialog_state_tracking, module_name=r'space') | |||
| @MODELS.register_module(Tasks.dialog_state_tracking, module_name=Models.space) | |||
| class SpaceForDialogStateTracking(Model): | |||
| def __init__(self, model_dir: str, *args, **kwargs): | |||
| @@ -17,8 +18,6 @@ class SpaceForDialogStateTracking(Model): | |||
| 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) | |||
| @@ -27,7 +26,6 @@ class SpaceForDialogStateTracking(Model): | |||
| self.model_dir = model_dir | |||
| self.config = SpaceConfig.from_pretrained(self.model_dir) | |||
| # self.model = SpaceForDST(self.config) | |||
| self.model = SpaceForDST.from_pretrained(self.model_dir) | |||
| self.model.to(self.config.device) | |||
| @@ -35,15 +33,20 @@ class SpaceForDialogStateTracking(Model): | |||
| """return the result by the model | |||
| Args: | |||
| input (Dict[str, Any]): the preprocessed data | |||
| input (Dict[str, Tensor]): the preprocessed data | |||
| Returns: | |||
| Dict[str, np.ndarray]: results | |||
| Dict[str, Tensor]: 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 | |||
| 'inputs': dict(input_ids, input_masks,start_pos), # tracking states | |||
| 'outputs': dict(slots_logits), | |||
| 'unique_ids': str(test-example.json-0), # default value | |||
| 'input_ids_unmasked': array([101, 7632, 1010,0,0,0]) | |||
| 'values': array([{'taxi-leaveAt': 'none', 'taxi-destination': 'none'}]), | |||
| 'inform': array([{'taxi-leaveAt': 'none', 'taxi-destination': 'none'}]), | |||
| 'prefix': str('final'), #default value | |||
| 'ds': array([{'taxi-leaveAt': 'none', 'taxi-destination': 'none'}]) | |||
| } | |||
| """ | |||
| import numpy as np | |||
| @@ -88,8 +91,6 @@ class SpaceForDialogStateTracking(Model): | |||
| if u != 0: | |||
| diag_state[slot][i] = u | |||
| # print(outputs) | |||
| return { | |||
| 'inputs': inputs, | |||
| 'outputs': outputs, | |||
| @@ -41,6 +41,8 @@ DEFAULT_MODEL_FOR_PIPELINE = { | |||
| 'damo/nlp_space_dialog-intent-prediction'), | |||
| Tasks.dialog_modeling: (Pipelines.dialog_modeling, | |||
| 'damo/nlp_space_dialog-modeling'), | |||
| Tasks.dialog_state_tracking: (Pipelines.dialog_state_tracking, | |||
| 'damo/nlp_space_dialog-state-tracking'), | |||
| Tasks.image_captioning: (Pipelines.image_caption, | |||
| 'damo/ofa_image-caption_coco_large_en'), | |||
| Tasks.image_generation: | |||
| @@ -1,8 +1,9 @@ | |||
| # Copyright (c) Alibaba, Inc. and its affiliates. | |||
| from typing import Any, Dict | |||
| from typing import Any, Dict, Union | |||
| from ...metainfo import Pipelines | |||
| from ...models import Model | |||
| from ...models.nlp import SpaceForDialogIntent | |||
| from ...preprocessors import DialogIntentPredictionPreprocessor | |||
| from ...utils.constant import Tasks | |||
| @@ -18,17 +19,22 @@ __all__ = ['DialogIntentPredictionPipeline'] | |||
| module_name=Pipelines.dialog_intent_prediction) | |||
| class DialogIntentPredictionPipeline(Pipeline): | |||
| def __init__(self, model: SpaceForDialogIntent, | |||
| preprocessor: DialogIntentPredictionPreprocessor, **kwargs): | |||
| """use `model` and `preprocessor` to create a nlp text classification pipeline for prediction | |||
| def __init__(self, | |||
| model: Union[SpaceForDialogIntent, str], | |||
| preprocessor: DialogIntentPredictionPreprocessor = None, | |||
| **kwargs): | |||
| """use `model` and `preprocessor` to create a dialog intent prediction pipeline | |||
| Args: | |||
| model (SequenceClassificationModel): a model instance | |||
| preprocessor (SequenceClassificationPreprocessor): a preprocessor instance | |||
| model (SpaceForDialogIntent): a model instance | |||
| preprocessor (DialogIntentPredictionPreprocessor): a preprocessor instance | |||
| """ | |||
| super().__init__(model=model, preprocessor=preprocessor, **kwargs) | |||
| model = model if isinstance( | |||
| model, SpaceForDialogIntent) else Model.from_pretrained(model) | |||
| if preprocessor is None: | |||
| preprocessor = DialogIntentPredictionPreprocessor(model.model_dir) | |||
| self.model = model | |||
| super().__init__(model=model, preprocessor=preprocessor, **kwargs) | |||
| self.categories = preprocessor.categories | |||
| def postprocess(self, inputs: Dict[str, Any]) -> Dict[str, str]: | |||
| @@ -1,8 +1,9 @@ | |||
| # Copyright (c) Alibaba, Inc. and its affiliates. | |||
| from typing import Any, Dict, Optional | |||
| from typing import Any, Dict, Union | |||
| from ...metainfo import Pipelines | |||
| from ...models import Model | |||
| from ...models.nlp import SpaceForDialogModeling | |||
| from ...preprocessors import DialogModelingPreprocessor | |||
| from ...utils.constant import Tasks | |||
| @@ -17,17 +18,22 @@ __all__ = ['DialogModelingPipeline'] | |||
| Tasks.dialog_modeling, module_name=Pipelines.dialog_modeling) | |||
| class DialogModelingPipeline(Pipeline): | |||
| def __init__(self, model: SpaceForDialogModeling, | |||
| preprocessor: DialogModelingPreprocessor, **kwargs): | |||
| """use `model` and `preprocessor` to create a nlp text classification pipeline for prediction | |||
| def __init__(self, | |||
| model: Union[SpaceForDialogModeling, str], | |||
| preprocessor: DialogModelingPreprocessor = None, | |||
| **kwargs): | |||
| """use `model` and `preprocessor` to create a dialog modleing pipeline for dialog response generation | |||
| Args: | |||
| model (SequenceClassificationModel): a model instance | |||
| preprocessor (SequenceClassificationPreprocessor): a preprocessor instance | |||
| model (SpaceForDialogModeling): a model instance | |||
| preprocessor (DialogModelingPreprocessor): a preprocessor instance | |||
| """ | |||
| super().__init__(model=model, preprocessor=preprocessor, **kwargs) | |||
| model = model if isinstance( | |||
| model, SpaceForDialogModeling) else Model.from_pretrained(model) | |||
| self.model = model | |||
| if preprocessor is None: | |||
| preprocessor = DialogModelingPreprocessor(model.model_dir) | |||
| super().__init__(model=model, preprocessor=preprocessor, **kwargs) | |||
| self.preprocessor = preprocessor | |||
| def postprocess(self, inputs: Dict[str, Tensor]) -> Dict[str, str]: | |||
| @@ -1,7 +1,7 @@ | |||
| from typing import Any, Dict | |||
| from typing import Any, Dict, Union | |||
| from ...metainfo import Pipelines | |||
| from ...models import SpaceForDialogStateTracking | |||
| from ...models import Model, SpaceForDialogStateTracking | |||
| from ...preprocessors import DialogStateTrackingPreprocessor | |||
| from ...utils.constant import Tasks | |||
| from ..base import Pipeline | |||
| @@ -15,17 +15,26 @@ __all__ = ['DialogStateTrackingPipeline'] | |||
| Tasks.dialog_state_tracking, module_name=Pipelines.dialog_state_tracking) | |||
| class DialogStateTrackingPipeline(Pipeline): | |||
| def __init__(self, model: SpaceForDialogStateTracking, | |||
| preprocessor: DialogStateTrackingPreprocessor, **kwargs): | |||
| """use `model` and `preprocessor` to create a nlp text classification pipeline for prediction | |||
| def __init__(self, | |||
| model: Union[SpaceForDialogStateTracking, str], | |||
| preprocessor: DialogStateTrackingPreprocessor = None, | |||
| **kwargs): | |||
| """use `model` and `preprocessor` to create a dialog state tracking pipeline for | |||
| observation of dialog states tracking after many turns of open domain dialogue | |||
| Args: | |||
| model (SequenceClassificationModel): a model instance | |||
| preprocessor (SequenceClassificationPreprocessor): a preprocessor instance | |||
| model (SpaceForDialogStateTracking): a model instance | |||
| preprocessor (DialogStateTrackingPreprocessor): a preprocessor instance | |||
| """ | |||
| super().__init__(model=model, preprocessor=preprocessor, **kwargs) | |||
| model = model if isinstance( | |||
| model, | |||
| SpaceForDialogStateTracking) else Model.from_pretrained(model) | |||
| self.model = model | |||
| if preprocessor is None: | |||
| preprocessor = DialogStateTrackingPreprocessor(model.model_dir) | |||
| super().__init__(model=model, preprocessor=preprocessor, **kwargs) | |||
| self.tokenizer = preprocessor.tokenizer | |||
| self.config = preprocessor.config | |||
| @@ -46,9 +55,7 @@ class DialogStateTrackingPipeline(Pipeline): | |||
| values = inputs['values'] | |||
| inform = inputs['inform'] | |||
| prefix = inputs['prefix'] | |||
| # ds = {slot: 'none' for slot in self.config.dst_slot_list} | |||
| ds = inputs['ds'] | |||
| ds = predict_and_format(self.config, self.tokenizer, _inputs, | |||
| _outputs[2], _outputs[3], _outputs[4], | |||
| _outputs[5], unique_ids, input_ids_unmasked, | |||
| @@ -138,13 +138,6 @@ TASK_OUTPUTS = { | |||
| # } | |||
| Tasks.sentiment_classification: [OutputKeys.SCORES, OutputKeys.LABELS], | |||
| # sentiment classification result for single sample | |||
| # { | |||
| # "labels": ["happy", "sad", "calm", "angry"], | |||
| # "scores": [0.9, 0.1, 0.05, 0.05] | |||
| # } | |||
| Tasks.sentiment_classification: ['scores', 'labels'], | |||
| # zero-shot classification result for single sample | |||
| # { | |||
| # "scores": [0.9, 0.1, 0.05, 0.05] | |||
| @@ -18,7 +18,7 @@ class DialogIntentPredictionTest(unittest.TestCase): | |||
| ] | |||
| @unittest.skipUnless(test_level() >= 2, 'skip test in current test level') | |||
| def test_run(self): | |||
| def test_run_by_direct_model_download(self): | |||
| cache_path = snapshot_download(self.model_id) | |||
| preprocessor = DialogIntentPredictionPreprocessor(model_dir=cache_path) | |||
| model = SpaceForDialogIntent( | |||
| @@ -56,6 +56,20 @@ class DialogIntentPredictionTest(unittest.TestCase): | |||
| for my_pipeline, item in list(zip(pipelines, self.test_case)): | |||
| print(my_pipeline(item)) | |||
| @unittest.skipUnless(test_level() >= 0, 'skip test in current test level') | |||
| def test_run_with_model_name(self): | |||
| pipelines = [ | |||
| pipeline(task=Tasks.dialog_intent_prediction, model=self.model_id) | |||
| ] | |||
| for my_pipeline, item in list(zip(pipelines, self.test_case)): | |||
| print(my_pipeline(item)) | |||
| @unittest.skipUnless(test_level() >= 2, 'skip test in current test level') | |||
| def test_run_with_default_model(self): | |||
| pipelines = [pipeline(task=Tasks.dialog_intent_prediction)] | |||
| for my_pipeline, item in list(zip(pipelines, self.test_case)): | |||
| print(my_pipeline(item)) | |||
| if __name__ == '__main__': | |||
| unittest.main() | |||
| @@ -1,5 +1,6 @@ | |||
| # Copyright (c) Alibaba, Inc. and its affiliates. | |||
| import unittest | |||
| from typing import List | |||
| from modelscope.hub.snapshot_download import snapshot_download | |||
| from modelscope.models import Model | |||
| @@ -89,8 +90,22 @@ class DialogModelingTest(unittest.TestCase): | |||
| } | |||
| } | |||
| def generate_and_print_dialog_response( | |||
| self, pipelines: List[DialogModelingPipeline]): | |||
| result = {} | |||
| for step, item in enumerate(self.test_case['sng0073']['log']): | |||
| user = item['user'] | |||
| print('user: {}'.format(user)) | |||
| result = pipelines[step % 2]({ | |||
| 'user_input': user, | |||
| 'history': result | |||
| }) | |||
| print('response : {}'.format(result['response'])) | |||
| @unittest.skipUnless(test_level() >= 2, 'skip test in current test level') | |||
| def test_run(self): | |||
| def test_run_by_direct_model_download(self): | |||
| cache_path = snapshot_download(self.model_id) | |||
| @@ -106,17 +121,7 @@ class DialogModelingTest(unittest.TestCase): | |||
| model=model, | |||
| preprocessor=preprocessor) | |||
| ] | |||
| result = {} | |||
| for step, item in enumerate(self.test_case['sng0073']['log']): | |||
| user = item['user'] | |||
| print('user: {}'.format(user)) | |||
| result = pipelines[step % 2]({ | |||
| 'user_input': user, | |||
| 'history': result | |||
| }) | |||
| print('response : {}'.format(result['response'])) | |||
| self.generate_and_print_dialog_response(pipelines) | |||
| @unittest.skipUnless(test_level() >= 0, 'skip test in current test level') | |||
| def test_run_with_model_from_modelhub(self): | |||
| @@ -131,16 +136,23 @@ class DialogModelingTest(unittest.TestCase): | |||
| preprocessor=preprocessor) | |||
| ] | |||
| result = {} | |||
| for step, item in enumerate(self.test_case['sng0073']['log']): | |||
| user = item['user'] | |||
| print('user: {}'.format(user)) | |||
| self.generate_and_print_dialog_response(pipelines) | |||
| result = pipelines[step % 2]({ | |||
| 'user_input': user, | |||
| 'history': result | |||
| }) | |||
| print('response : {}'.format(result['response'])) | |||
| @unittest.skipUnless(test_level() >= 0, 'skip test in current test level') | |||
| def test_run_with_model_name(self): | |||
| pipelines = [ | |||
| pipeline(task=Tasks.dialog_modeling, model=self.model_id), | |||
| pipeline(task=Tasks.dialog_modeling, model=self.model_id) | |||
| ] | |||
| self.generate_and_print_dialog_response(pipelines) | |||
| @unittest.skipUnless(test_level() >= 2, 'skip test in current test level') | |||
| def test_run_with_default_model(self): | |||
| pipelines = [ | |||
| pipeline(task=Tasks.dialog_modeling), | |||
| pipeline(task=Tasks.dialog_modeling) | |||
| ] | |||
| self.generate_and_print_dialog_response(pipelines) | |||
| if __name__ == '__main__': | |||
| @@ -1,5 +1,6 @@ | |||
| # Copyright (c) Alibaba, Inc. and its affiliates. | |||
| import unittest | |||
| from typing import List | |||
| from modelscope.hub.snapshot_download import snapshot_download | |||
| from modelscope.models import Model, SpaceForDialogStateTracking | |||
| @@ -75,23 +76,10 @@ class DialogStateTrackingTest(unittest.TestCase): | |||
| 'User-8': 'Thank you, goodbye', | |||
| }] | |||
| @unittest.skipUnless(test_level() >= 2, 'skip test in current test level') | |||
| def test_run(self): | |||
| cache_path = snapshot_download(self.model_id) | |||
| model = SpaceForDialogStateTracking(cache_path) | |||
| preprocessor = DialogStateTrackingPreprocessor(model_dir=cache_path) | |||
| pipelines = [ | |||
| DialogStateTrackingPipeline( | |||
| model=model, preprocessor=preprocessor), | |||
| pipeline( | |||
| task=Tasks.dialog_state_tracking, | |||
| model=model, | |||
| preprocessor=preprocessor) | |||
| ] | |||
| pipelines_len = len(pipelines) | |||
| def tracking_and_print_dialog_states( | |||
| self, pipelines: List[DialogStateTrackingPipeline]): | |||
| import json | |||
| pipelines_len = len(pipelines) | |||
| history_states = [{}] | |||
| utter = {} | |||
| for step, item in enumerate(self.test_case): | |||
| @@ -106,6 +94,22 @@ class DialogStateTrackingTest(unittest.TestCase): | |||
| history_states.extend([result['dialog_states'], {}]) | |||
| @unittest.skipUnless(test_level() >= 2, 'skip test in current test level') | |||
| def test_run_by_direct_model_download(self): | |||
| cache_path = snapshot_download(self.model_id) | |||
| model = SpaceForDialogStateTracking(cache_path) | |||
| preprocessor = DialogStateTrackingPreprocessor(model_dir=cache_path) | |||
| pipelines = [ | |||
| DialogStateTrackingPipeline( | |||
| model=model, preprocessor=preprocessor), | |||
| pipeline( | |||
| task=Tasks.dialog_state_tracking, | |||
| model=model, | |||
| preprocessor=preprocessor) | |||
| ] | |||
| self.tracking_and_print_dialog_states(pipelines) | |||
| @unittest.skipUnless(test_level() >= 0, 'skip test in current test level') | |||
| def test_run_with_model_from_modelhub(self): | |||
| model = Model.from_pretrained(self.model_id) | |||
| @@ -120,21 +124,19 @@ class DialogStateTrackingTest(unittest.TestCase): | |||
| preprocessor=preprocessor) | |||
| ] | |||
| pipelines_len = len(pipelines) | |||
| import json | |||
| history_states = [{}] | |||
| utter = {} | |||
| for step, item in enumerate(self.test_case): | |||
| utter.update(item) | |||
| result = pipelines[step % pipelines_len]({ | |||
| 'utter': | |||
| utter, | |||
| 'history_states': | |||
| history_states | |||
| }) | |||
| print(json.dumps(result)) | |||
| self.tracking_and_print_dialog_states(pipelines) | |||
| history_states.extend([result['dialog_states'], {}]) | |||
| @unittest.skipUnless(test_level() >= 0, 'skip test in current test level') | |||
| def test_run_with_model_name(self): | |||
| pipelines = [ | |||
| pipeline(task=Tasks.dialog_state_tracking, model=self.model_id) | |||
| ] | |||
| self.tracking_and_print_dialog_states(pipelines) | |||
| @unittest.skipUnless(test_level() >= 2, 'skip test in current test level') | |||
| def test_run_with_default_model(self): | |||
| pipelines = [pipeline(task=Tasks.dialog_state_tracking)] | |||
| self.tracking_and_print_dialog_states(pipelines) | |||
| if __name__ == '__main__': | |||