* add self-hosted repo: * add extra requirements for different field and reduce necessary requirements * update docker file with so required by audio * add requirements checker which will be used later when implement lazy import * remove repeated requirements and replace opencv-python-headless with opencv-python example usage: ```shell pip install model_scope[all] -f https://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/maas/repo.html pip install model_scope[cv] -f https://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/maas/repo.html pip install model_scope[nlp] -f https://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/maas/repo.html pip install model_scope[audio] -f https://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/maas/repo.html pip install model_scope[multi-modal] -f https://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/maas/repo.html ``` Link: https://code.alibaba-inc.com/Ali-MaaS/MaaS-lib/codereview/9211383master
| @@ -0,0 +1,7 @@ | |||||
| #sudo docker run --name zwm_maas -v /home/wenmeng.zwm/workspace:/home/wenmeng.zwm/workspace --net host -ti reg.docker.alibaba-inc.com/pai-dlc/tensorflow-training:2.3-gpu-py36-cu101-ubuntu18.04 bash | |||||
| #sudo docker run --name zwm_maas_pytorch -v /home/wenmeng.zwm/workspace:/home/wenmeng.zwm/workspace --net host -ti reg.docker.alibaba-inc.com/pai-dlc/pytorch-training:1.10PAI-gpu-py36-cu113-ubuntu18.04 bash | |||||
| CONTAINER_NAME=modelscope-dev | |||||
| IMAGE_NAME=registry.cn-shanghai.aliyuncs.com/modelscope/modelscope | |||||
| IMAGE_VERSION=v0.1.1-16-g62856fa-devel | |||||
| MOUNT_DIR=/home/wenmeng.zwm/workspace | |||||
| sudo docker run --name $CONTAINER_NAME -v $MOUNT_DIR:$MOUNT_DIR --net host -ti ${IMAGE_NAME}:${IMAGE_VERSION} bash | |||||
| @@ -30,7 +30,8 @@ RUN apt-get update &&\ | |||||
| zip \ | zip \ | ||||
| zlib1g-dev \ | zlib1g-dev \ | ||||
| unzip \ | unzip \ | ||||
| pkg-config | |||||
| pkg-config \ | |||||
| libsndfile1 | |||||
| # install modelscope and its python env | # install modelscope and its python env | ||||
| WORKDIR /opt/modelscope | WORKDIR /opt/modelscope | ||||
| @@ -13,6 +13,7 @@ ModelScope doc | |||||
| quick_start.md | quick_start.md | ||||
| develop.md | develop.md | ||||
| faq.md | |||||
| .. toctree:: | .. toctree:: | ||||
| :maxdepth: 2 | :maxdepth: 2 | ||||
| @@ -20,6 +21,8 @@ ModelScope doc | |||||
| tutorials/index | tutorials/index | ||||
| .. toctree:: | .. toctree:: | ||||
| :maxdepth: 2 | :maxdepth: 2 | ||||
| :caption: Changelog | :caption: Changelog | ||||
| @@ -1,11 +1,26 @@ | |||||
| # Copyright (c) Alibaba, Inc. and its affiliates. | # Copyright (c) Alibaba, Inc. and its affiliates. | ||||
| from .audio.ans.frcrn import FRCRNModel | |||||
| from .audio.kws import GenericKeyWordSpotting | |||||
| from .audio.tts.am import SambertNetHifi16k | |||||
| 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_modal import OfaForImageCaptioning | |||||
| from .nlp import (BertForSequenceClassification, SbertForSentenceSimilarity, | |||||
| SbertForZeroShotClassification) | |||||
| try: | |||||
| from .audio.tts.am import SambertNetHifi16k | |||||
| from .audio.tts.vocoder import Hifigan16k | |||||
| except ModuleNotFoundError as e: | |||||
| if str(e) == "No module named 'tensorflow'": | |||||
| pass | |||||
| else: | |||||
| raise ModuleNotFoundError(e) | |||||
| try: | |||||
| from .audio.kws import GenericKeyWordSpotting | |||||
| from .multi_modal import OfaForImageCaptioning | |||||
| from .nlp import (BertForSequenceClassification, | |||||
| SbertForSentenceSimilarity, | |||||
| SbertForZeroShotClassification) | |||||
| from .audio.ans.frcrn import FRCRNModel | |||||
| except ModuleNotFoundError as e: | |||||
| if str(e) == "No module named 'pytorch'": | |||||
| pass | |||||
| else: | |||||
| raise ModuleNotFoundError(e) | |||||
| @@ -1,3 +1,16 @@ | |||||
| from .kws_kwsbp_pipeline import * # noqa F403 | |||||
| from .linear_aec_pipeline import LinearAECPipeline | |||||
| from .text_to_speech_pipeline import * # noqa F403 | |||||
| try: | |||||
| from .kws_kwsbp_pipeline import * # noqa F403 | |||||
| from .linear_aec_pipeline import LinearAECPipeline | |||||
| except ModuleNotFoundError as e: | |||||
| if str(e) == "No module named 'torch'": | |||||
| pass | |||||
| else: | |||||
| raise ModuleNotFoundError(e) | |||||
| try: | |||||
| from .text_to_speech_pipeline import * # noqa F403 | |||||
| except ModuleNotFoundError as e: | |||||
| if str(e) == "No module named 'tensorflow'": | |||||
| pass | |||||
| else: | |||||
| raise ModuleNotFoundError(e) | |||||
| @@ -1,5 +1,18 @@ | |||||
| from .action_recognition_pipeline import ActionRecognitionPipeline | |||||
| from .animal_recog_pipeline import AnimalRecogPipeline | |||||
| from .image_cartoon_pipeline import ImageCartoonPipeline | |||||
| from .image_matting_pipeline import ImageMattingPipeline | |||||
| from .ocr_detection_pipeline import OCRDetectionPipeline | |||||
| try: | |||||
| from .action_recognition_pipeline import ActionRecognitionPipeline | |||||
| from .animal_recog_pipeline import AnimalRecogPipeline | |||||
| except ModuleNotFoundError as e: | |||||
| if str(e) == "No module named 'torch'": | |||||
| pass | |||||
| else: | |||||
| raise ModuleNotFoundError(e) | |||||
| try: | |||||
| from .image_cartoon_pipeline import ImageCartoonPipeline | |||||
| from .image_matting_pipeline import ImageMattingPipeline | |||||
| from .ocr_detection_pipeline import OCRDetectionPipeline | |||||
| except ModuleNotFoundError as e: | |||||
| if str(e) == "No module named 'tensorflow'": | |||||
| pass | |||||
| else: | |||||
| raise ModuleNotFoundError(e) | |||||
| @@ -1,3 +1,9 @@ | |||||
| from .image_captioning_pipeline import ImageCaptionPipeline | |||||
| from .multi_modal_embedding_pipeline import MultiModalEmbeddingPipeline | |||||
| from .visual_question_answering_pipeline import VisualQuestionAnsweringPipeline | |||||
| try: | |||||
| from .image_captioning_pipeline import ImageCaptionPipeline | |||||
| from .multi_modal_embedding_pipeline import MultiModalEmbeddingPipeline | |||||
| from .visual_question_answering_pipeline import VisualQuestionAnsweringPipeline | |||||
| except ModuleNotFoundError as e: | |||||
| if str(e) == "No module named 'torch'": | |||||
| pass | |||||
| else: | |||||
| raise ModuleNotFoundError(e) | |||||
| @@ -1,6 +1,12 @@ | |||||
| from .fill_mask_pipeline import * # noqa F403 | |||||
| from .sentence_similarity_pipeline import * # noqa F403 | |||||
| from .sequence_classification_pipeline import * # noqa F403 | |||||
| from .text_generation_pipeline import * # noqa F403 | |||||
| from .word_segmentation_pipeline import * # noqa F403 | |||||
| from .zero_shot_classification_pipeline import * # noqa F403 | |||||
| try: | |||||
| from .fill_mask_pipeline import * # noqa F403 | |||||
| from .sentence_similarity_pipeline import * # noqa F403 | |||||
| from .sequence_classification_pipeline import * # noqa F403 | |||||
| from .text_generation_pipeline import * # noqa F403 | |||||
| from .word_segmentation_pipeline import * # noqa F403 | |||||
| from .zero_shot_classification_pipeline import * # noqa F403 | |||||
| except ModuleNotFoundError as e: | |||||
| if str(e) == "No module named 'torch'": | |||||
| pass | |||||
| else: | |||||
| raise ModuleNotFoundError(e) | |||||
| @@ -1,11 +1,18 @@ | |||||
| # Copyright (c) Alibaba, Inc. and its affiliates. | # Copyright (c) Alibaba, Inc. and its affiliates. | ||||
| from .audio import LinearAECAndFbank | |||||
| from .base import Preprocessor | from .base import Preprocessor | ||||
| from .builder import PREPROCESSORS, build_preprocessor | from .builder import PREPROCESSORS, build_preprocessor | ||||
| from .common import Compose | from .common import Compose | ||||
| from .image import LoadImage, load_image | from .image import LoadImage, load_image | ||||
| from .kws import WavToLists | from .kws import WavToLists | ||||
| from .multi_modal import * # noqa F403 | |||||
| from .nlp import * # noqa F403 | |||||
| from .text_to_speech import * # noqa F403 | from .text_to_speech import * # noqa F403 | ||||
| try: | |||||
| from .audio import LinearAECAndFbank | |||||
| from .multi_modal import * # noqa F403 | |||||
| from .nlp import * # noqa F403 | |||||
| except ModuleNotFoundError as e: | |||||
| if str(e) == "No module named 'tensorflow'": | |||||
| pass | |||||
| else: | |||||
| raise ModuleNotFoundError(e) | |||||
| @@ -0,0 +1,79 @@ | |||||
| # Copyright (c) Alibaba, Inc. and its affiliates. | |||||
| from modelscope.utils.constant import Fields, Requirements | |||||
| from modelscope.utils.import_utils import requires | |||||
| def get_msg(field): | |||||
| msg = f'\n{field} requirements not installed, please execute ' \ | |||||
| f'`pip install requirements/{field}.txt` or ' \ | |||||
| f'`pip install modelscope[{field}]`' | |||||
| return msg | |||||
| class NLPModuleNotFoundError(ModuleNotFoundError): | |||||
| def __init__(self, e: ModuleNotFoundError) -> None: | |||||
| e.msg += get_msg(Fields.nlp) | |||||
| super().__init__(e) | |||||
| class CVModuleNotFoundError(ModuleNotFoundError): | |||||
| def __init__(self, e: ModuleNotFoundError) -> None: | |||||
| e.msg += get_msg(Fields.cv) | |||||
| super().__init__(e) | |||||
| class AudioModuleNotFoundError(ModuleNotFoundError): | |||||
| def __init__(self, e: ModuleNotFoundError) -> None: | |||||
| e.msg += get_msg(Fields.audio) | |||||
| super().__init__(e) | |||||
| class MultiModalModuleNotFoundError(ModuleNotFoundError): | |||||
| def __init__(self, e: ModuleNotFoundError) -> None: | |||||
| e.msg += get_msg(Fields.multi_modal) | |||||
| super().__init__(e) | |||||
| def check_nlp(): | |||||
| try: | |||||
| requires('nlp models', ( | |||||
| Requirements.torch, | |||||
| Requirements.tokenizers, | |||||
| )) | |||||
| except ImportError as e: | |||||
| raise NLPModuleNotFoundError(e) | |||||
| def check_cv(): | |||||
| try: | |||||
| requires('cv models', ( | |||||
| Requirements.torch, | |||||
| Requirements.tokenizers, | |||||
| )) | |||||
| except ImportError as e: | |||||
| raise CVModuleNotFoundError(e) | |||||
| def check_audio(): | |||||
| try: | |||||
| requires('audio models', ( | |||||
| Requirements.torch, | |||||
| Requirements.tf, | |||||
| )) | |||||
| except ImportError as e: | |||||
| raise AudioModuleNotFoundError(e) | |||||
| def check_multi_modal(): | |||||
| try: | |||||
| requires('multi-modal models', ( | |||||
| Requirements.torch, | |||||
| Requirements.tokenizers, | |||||
| )) | |||||
| except ImportError as e: | |||||
| raise MultiModalModuleNotFoundError(e) | |||||
| @@ -17,9 +17,10 @@ from typing import Dict | |||||
| import addict | import addict | ||||
| from yapf.yapflib.yapf_api import FormatCode | from yapf.yapflib.yapf_api import FormatCode | ||||
| from modelscope.utils.import_utils import (import_modules, | |||||
| import_modules_from_file, | |||||
| validate_py_syntax) | |||||
| from modelscope.utils.logger import get_logger | from modelscope.utils.logger import get_logger | ||||
| from modelscope.utils.pymod import (import_modules, import_modules_from_file, | |||||
| validate_py_syntax) | |||||
| if platform.system() == 'Windows': | if platform.system() == 'Windows': | ||||
| import regex as re # type: ignore | import regex as re # type: ignore | ||||
| @@ -97,5 +97,18 @@ class ModelFile(object): | |||||
| TORCH_MODEL_BIN_FILE = 'pytorch_model.bin' | TORCH_MODEL_BIN_FILE = 'pytorch_model.bin' | ||||
| class Requirements(object): | |||||
| """Requirement names for each module | |||||
| """ | |||||
| protobuf = 'protobuf' | |||||
| sentencepiece = 'sentencepiece' | |||||
| sklearn = 'sklearn' | |||||
| scipy = 'scipy' | |||||
| timm = 'timm' | |||||
| tokenizers = 'tokenizers' | |||||
| tf = 'tf' | |||||
| torch = 'torch' | |||||
| TENSORFLOW = 'tensorflow' | TENSORFLOW = 'tensorflow' | ||||
| PYTORCH = 'pytorch' | PYTORCH = 'pytorch' | ||||
| @@ -0,0 +1,324 @@ | |||||
| # Copyright (c) Alibaba, Inc. and its affiliates. | |||||
| # Part of the implementation is borrowed from huggingface/transformers. | |||||
| import ast | |||||
| import functools | |||||
| import importlib.util | |||||
| import os | |||||
| import os.path as osp | |||||
| import sys | |||||
| import types | |||||
| from collections import OrderedDict | |||||
| from functools import wraps | |||||
| from importlib import import_module | |||||
| from itertools import chain | |||||
| from types import ModuleType | |||||
| from typing import Any | |||||
| import json | |||||
| from packaging import version | |||||
| from modelscope.utils.constant import Fields | |||||
| from modelscope.utils.logger import get_logger | |||||
| if sys.version_info < (3, 8): | |||||
| import importlib_metadata | |||||
| else: | |||||
| import importlib.metadata as importlib_metadata | |||||
| logger = get_logger() | |||||
| def import_modules_from_file(py_file: str): | |||||
| """ Import module from a certrain file | |||||
| Args: | |||||
| py_file: path to a python file to be imported | |||||
| Return: | |||||
| """ | |||||
| dirname, basefile = os.path.split(py_file) | |||||
| if dirname == '': | |||||
| dirname == './' | |||||
| module_name = osp.splitext(basefile)[0] | |||||
| sys.path.insert(0, dirname) | |||||
| validate_py_syntax(py_file) | |||||
| mod = import_module(module_name) | |||||
| sys.path.pop(0) | |||||
| return module_name, mod | |||||
| def import_modules(imports, allow_failed_imports=False): | |||||
| """Import modules from the given list of strings. | |||||
| Args: | |||||
| imports (list | str | None): The given module names to be imported. | |||||
| allow_failed_imports (bool): If True, the failed imports will return | |||||
| None. Otherwise, an ImportError is raise. Default: False. | |||||
| Returns: | |||||
| list[module] | module | None: The imported modules. | |||||
| Examples: | |||||
| >>> osp, sys = import_modules( | |||||
| ... ['os.path', 'sys']) | |||||
| >>> import os.path as osp_ | |||||
| >>> import sys as sys_ | |||||
| >>> assert osp == osp_ | |||||
| >>> assert sys == sys_ | |||||
| """ | |||||
| if not imports: | |||||
| return | |||||
| single_import = False | |||||
| if isinstance(imports, str): | |||||
| single_import = True | |||||
| imports = [imports] | |||||
| if not isinstance(imports, list): | |||||
| raise TypeError( | |||||
| f'custom_imports must be a list but got type {type(imports)}') | |||||
| imported = [] | |||||
| for imp in imports: | |||||
| if not isinstance(imp, str): | |||||
| raise TypeError( | |||||
| f'{imp} is of type {type(imp)} and cannot be imported.') | |||||
| try: | |||||
| imported_tmp = import_module(imp) | |||||
| except ImportError: | |||||
| if allow_failed_imports: | |||||
| logger.warning(f'{imp} failed to import and is ignored.') | |||||
| imported_tmp = None | |||||
| else: | |||||
| raise ImportError | |||||
| imported.append(imported_tmp) | |||||
| if single_import: | |||||
| imported = imported[0] | |||||
| return imported | |||||
| def validate_py_syntax(filename): | |||||
| with open(filename, 'r', encoding='utf-8') as f: | |||||
| # Setting encoding explicitly to resolve coding issue on windows | |||||
| content = f.read() | |||||
| try: | |||||
| ast.parse(content) | |||||
| except SyntaxError as e: | |||||
| raise SyntaxError('There are syntax errors in config ' | |||||
| f'file {filename}: {e}') | |||||
| # following code borrows implementation from huggingface/transformers | |||||
| ENV_VARS_TRUE_VALUES = {'1', 'ON', 'YES', 'TRUE'} | |||||
| ENV_VARS_TRUE_AND_AUTO_VALUES = ENV_VARS_TRUE_VALUES.union({'AUTO'}) | |||||
| USE_TF = os.environ.get('USE_TF', 'AUTO').upper() | |||||
| USE_TORCH = os.environ.get('USE_TORCH', 'AUTO').upper() | |||||
| _torch_version = 'N/A' | |||||
| if USE_TORCH in ENV_VARS_TRUE_AND_AUTO_VALUES and USE_TF not in ENV_VARS_TRUE_VALUES: | |||||
| _torch_available = importlib.util.find_spec('torch') is not None | |||||
| if _torch_available: | |||||
| try: | |||||
| _torch_version = importlib_metadata.version('torch') | |||||
| logger.info(f'PyTorch version {_torch_version} available.') | |||||
| except importlib_metadata.PackageNotFoundError: | |||||
| _torch_available = False | |||||
| else: | |||||
| logger.info('Disabling PyTorch because USE_TF is set') | |||||
| _torch_available = False | |||||
| _tf_version = 'N/A' | |||||
| if USE_TF in ENV_VARS_TRUE_AND_AUTO_VALUES and USE_TORCH not in ENV_VARS_TRUE_VALUES: | |||||
| _tf_available = importlib.util.find_spec('tensorflow') is not None | |||||
| if _tf_available: | |||||
| candidates = ( | |||||
| 'tensorflow', | |||||
| 'tensorflow-cpu', | |||||
| 'tensorflow-gpu', | |||||
| 'tf-nightly', | |||||
| 'tf-nightly-cpu', | |||||
| 'tf-nightly-gpu', | |||||
| 'intel-tensorflow', | |||||
| 'intel-tensorflow-avx512', | |||||
| 'tensorflow-rocm', | |||||
| 'tensorflow-macos', | |||||
| ) | |||||
| _tf_version = None | |||||
| # For the metadata, we have to look for both tensorflow and tensorflow-cpu | |||||
| for pkg in candidates: | |||||
| try: | |||||
| _tf_version = importlib_metadata.version(pkg) | |||||
| break | |||||
| except importlib_metadata.PackageNotFoundError: | |||||
| pass | |||||
| _tf_available = _tf_version is not None | |||||
| if _tf_available: | |||||
| if version.parse(_tf_version) < version.parse('2'): | |||||
| pass | |||||
| else: | |||||
| logger.info(f'TensorFlow version {_tf_version} available.') | |||||
| else: | |||||
| logger.info('Disabling Tensorflow because USE_TORCH is set') | |||||
| _tf_available = False | |||||
| _timm_available = importlib.util.find_spec('timm') is not None | |||||
| try: | |||||
| _timm_version = importlib_metadata.version('timm') | |||||
| logger.debug(f'Successfully imported timm version {_timm_version}') | |||||
| except importlib_metadata.PackageNotFoundError: | |||||
| _timm_available = False | |||||
| def is_scipy_available(): | |||||
| return importlib.util.find_spec('scipy') is not None | |||||
| def is_sklearn_available(): | |||||
| if importlib.util.find_spec('sklearn') is None: | |||||
| return False | |||||
| return is_scipy_available() and importlib.util.find_spec('sklearn.metrics') | |||||
| def is_sentencepiece_available(): | |||||
| return importlib.util.find_spec('sentencepiece') is not None | |||||
| def is_protobuf_available(): | |||||
| if importlib.util.find_spec('google') is None: | |||||
| return False | |||||
| return importlib.util.find_spec('google.protobuf') is not None | |||||
| def is_tokenizers_available(): | |||||
| return importlib.util.find_spec('tokenizers') is not None | |||||
| def is_timm_available(): | |||||
| return _timm_available | |||||
| def is_torch_available(): | |||||
| return _torch_available | |||||
| def is_torch_cuda_available(): | |||||
| if is_torch_available(): | |||||
| import torch | |||||
| return torch.cuda.is_available() | |||||
| else: | |||||
| return False | |||||
| def is_tf_available(): | |||||
| return _tf_available | |||||
| # docstyle-ignore | |||||
| PROTOBUF_IMPORT_ERROR = """ | |||||
| {0} requires the protobuf library but it was not found in your environment. Checkout the instructions on the | |||||
| installation page of its repo: https://github.com/protocolbuffers/protobuf/tree/master/python#installation and | |||||
| follow the ones that match your environment. | |||||
| """ | |||||
| # docstyle-ignore | |||||
| SENTENCEPIECE_IMPORT_ERROR = """ | |||||
| {0} requires the SentencePiece library but it was not found in your environment. Checkout the instructions on the | |||||
| installation page of its repo: https://github.com/google/sentencepiece#installation and follow the ones | |||||
| that match your environment. | |||||
| """ | |||||
| # docstyle-ignore | |||||
| SKLEARN_IMPORT_ERROR = """ | |||||
| {0} requires the scikit-learn library but it was not found in your environment. You can install it with: | |||||
| ``` | |||||
| pip install -U scikit-learn | |||||
| ``` | |||||
| In a notebook or a colab, you can install it by executing a cell with | |||||
| ``` | |||||
| !pip install -U scikit-learn | |||||
| ``` | |||||
| """ | |||||
| # docstyle-ignore | |||||
| TENSORFLOW_IMPORT_ERROR = """ | |||||
| {0} requires the TensorFlow library but it was not found in your environment. Checkout the instructions on the | |||||
| installation page: https://www.tensorflow.org/install and follow the ones that match your environment. | |||||
| """ | |||||
| # docstyle-ignore | |||||
| TIMM_IMPORT_ERROR = """ | |||||
| {0} requires the timm library but it was not found in your environment. You can install it with pip: | |||||
| `pip install timm` | |||||
| """ | |||||
| # docstyle-ignore | |||||
| TOKENIZERS_IMPORT_ERROR = """ | |||||
| {0} requires the 🤗 Tokenizers library but it was not found in your environment. You can install it with: | |||||
| ``` | |||||
| pip install tokenizers | |||||
| ``` | |||||
| In a notebook or a colab, you can install it by executing a cell with | |||||
| ``` | |||||
| !pip install tokenizers | |||||
| ``` | |||||
| """ | |||||
| # docstyle-ignore | |||||
| PYTORCH_IMPORT_ERROR = """ | |||||
| {0} requires the PyTorch library but it was not found in your environment. Checkout the instructions on the | |||||
| installation page: https://pytorch.org/get-started/locally/ and follow the ones that match your environment. | |||||
| """ | |||||
| # docstyle-ignore | |||||
| SCIPY_IMPORT_ERROR = """ | |||||
| {0} requires the scipy library but it was not found in your environment. You can install it with pip: | |||||
| `pip install scipy` | |||||
| """ | |||||
| REQUIREMENTS_MAAPING = OrderedDict([ | |||||
| ('protobuf', (is_protobuf_available, PROTOBUF_IMPORT_ERROR)), | |||||
| ('sentencepiece', (is_sentencepiece_available, | |||||
| SENTENCEPIECE_IMPORT_ERROR)), | |||||
| ('sklearn', (is_sklearn_available, SKLEARN_IMPORT_ERROR)), | |||||
| ('tf', (is_tf_available, TENSORFLOW_IMPORT_ERROR)), | |||||
| ('timm', (is_timm_available, TIMM_IMPORT_ERROR)), | |||||
| ('tokenizers', (is_tokenizers_available, TOKENIZERS_IMPORT_ERROR)), | |||||
| ('torch', (is_torch_available, PYTORCH_IMPORT_ERROR)), | |||||
| ('scipy', (is_scipy_available, SCIPY_IMPORT_ERROR)), | |||||
| ]) | |||||
| def requires(obj, requirements): | |||||
| if not isinstance(requirements, (list, tuple)): | |||||
| requirements = [requirements] | |||||
| if isinstance(obj, str): | |||||
| name = obj | |||||
| else: | |||||
| name = obj.__name__ if hasattr(obj, | |||||
| '__name__') else obj.__class__.__name__ | |||||
| checks = (REQUIREMENTS_MAAPING[req] for req in requirements) | |||||
| failed = [msg.format(name) for available, msg in checks if not available()] | |||||
| if failed: | |||||
| raise ImportError(''.join(failed)) | |||||
| def torch_required(func): | |||||
| # Chose a different decorator name than in tests so it's clear they are not the same. | |||||
| @functools.wraps(func) | |||||
| def wrapper(*args, **kwargs): | |||||
| if is_torch_available(): | |||||
| return func(*args, **kwargs) | |||||
| else: | |||||
| raise ImportError(f'Method `{func.__name__}` requires PyTorch.') | |||||
| return wrapper | |||||
| def tf_required(func): | |||||
| # Chose a different decorator name than in tests so it's clear they are not the same. | |||||
| @functools.wraps(func) | |||||
| def wrapper(*args, **kwargs): | |||||
| if is_tf_available(): | |||||
| return func(*args, **kwargs) | |||||
| else: | |||||
| raise ImportError(f'Method `{func.__name__}` requires TF.') | |||||
| return wrapper | |||||
| @@ -1,90 +0,0 @@ | |||||
| # Copyright (c) Alibaba, Inc. and its affiliates. | |||||
| import ast | |||||
| import os | |||||
| import os.path as osp | |||||
| import sys | |||||
| import types | |||||
| from importlib import import_module | |||||
| from modelscope.utils.logger import get_logger | |||||
| logger = get_logger() | |||||
| def import_modules_from_file(py_file: str): | |||||
| """ Import module from a certrain file | |||||
| Args: | |||||
| py_file: path to a python file to be imported | |||||
| Return: | |||||
| """ | |||||
| dirname, basefile = os.path.split(py_file) | |||||
| if dirname == '': | |||||
| dirname == './' | |||||
| module_name = osp.splitext(basefile)[0] | |||||
| sys.path.insert(0, dirname) | |||||
| validate_py_syntax(py_file) | |||||
| mod = import_module(module_name) | |||||
| sys.path.pop(0) | |||||
| return module_name, mod | |||||
| def import_modules(imports, allow_failed_imports=False): | |||||
| """Import modules from the given list of strings. | |||||
| Args: | |||||
| imports (list | str | None): The given module names to be imported. | |||||
| allow_failed_imports (bool): If True, the failed imports will return | |||||
| None. Otherwise, an ImportError is raise. Default: False. | |||||
| Returns: | |||||
| list[module] | module | None: The imported modules. | |||||
| Examples: | |||||
| >>> osp, sys = import_modules( | |||||
| ... ['os.path', 'sys']) | |||||
| >>> import os.path as osp_ | |||||
| >>> import sys as sys_ | |||||
| >>> assert osp == osp_ | |||||
| >>> assert sys == sys_ | |||||
| """ | |||||
| if not imports: | |||||
| return | |||||
| single_import = False | |||||
| if isinstance(imports, str): | |||||
| single_import = True | |||||
| imports = [imports] | |||||
| if not isinstance(imports, list): | |||||
| raise TypeError( | |||||
| f'custom_imports must be a list but got type {type(imports)}') | |||||
| imported = [] | |||||
| for imp in imports: | |||||
| if not isinstance(imp, str): | |||||
| raise TypeError( | |||||
| f'{imp} is of type {type(imp)} and cannot be imported.') | |||||
| try: | |||||
| imported_tmp = import_module(imp) | |||||
| except ImportError: | |||||
| if allow_failed_imports: | |||||
| logger.warning(f'{imp} failed to import and is ignored.') | |||||
| imported_tmp = None | |||||
| else: | |||||
| raise ImportError | |||||
| imported.append(imported_tmp) | |||||
| if single_import: | |||||
| imported = imported[0] | |||||
| return imported | |||||
| def validate_py_syntax(filename): | |||||
| with open(filename, 'r', encoding='utf-8') as f: | |||||
| # Setting encoding explicitly to resolve coding issue on windows | |||||
| content = f.read() | |||||
| try: | |||||
| ast.parse(content) | |||||
| except SyntaxError as e: | |||||
| raise SyntaxError('There are syntax errors in config ' | |||||
| f'file {filename}: {e}') | |||||
| @@ -1,7 +1,9 @@ | |||||
| # Copyright (c) Alibaba, Inc. and its affiliates. | # Copyright (c) Alibaba, Inc. and its affiliates. | ||||
| import inspect | import inspect | ||||
| from typing import List, Tuple, Union | |||||
| from modelscope.utils.import_utils import requires | |||||
| from modelscope.utils.logger import get_logger | from modelscope.utils.logger import get_logger | ||||
| default_group = 'default' | default_group = 'default' | ||||
| @@ -52,9 +54,14 @@ class Registry(object): | |||||
| def _register_module(self, | def _register_module(self, | ||||
| group_key=default_group, | group_key=default_group, | ||||
| module_name=None, | module_name=None, | ||||
| module_cls=None): | |||||
| module_cls=None, | |||||
| requirements=None): | |||||
| assert isinstance(group_key, | assert isinstance(group_key, | ||||
| str), 'group_key is required and must be str' | str), 'group_key is required and must be str' | ||||
| if requirements is not None: | |||||
| requires(module_cls, requirements) | |||||
| if group_key not in self._modules: | if group_key not in self._modules: | ||||
| self._modules[group_key] = dict() | self._modules[group_key] = dict() | ||||
| @@ -86,7 +93,8 @@ class Registry(object): | |||||
| def register_module(self, | def register_module(self, | ||||
| group_key: str = default_group, | group_key: str = default_group, | ||||
| module_name: str = None, | module_name: str = None, | ||||
| module_cls: type = None): | |||||
| module_cls: type = None, | |||||
| requirements: Union[List, Tuple] = None): | |||||
| """ Register module | """ Register module | ||||
| Example: | Example: | ||||
| @@ -110,17 +118,18 @@ class Registry(object): | |||||
| default group name is 'default' | default group name is 'default' | ||||
| module_name: Module name | module_name: Module name | ||||
| module_cls: Module class object | module_cls: Module class object | ||||
| requirements: Module necessary requirements | |||||
| """ | """ | ||||
| if not (module_name is None or isinstance(module_name, str)): | if not (module_name is None or isinstance(module_name, str)): | ||||
| raise TypeError(f'module_name must be either of None, str,' | raise TypeError(f'module_name must be either of None, str,' | ||||
| f'got {type(module_name)}') | f'got {type(module_name)}') | ||||
| if module_cls is not None: | if module_cls is not None: | ||||
| self._register_module( | self._register_module( | ||||
| group_key=group_key, | group_key=group_key, | ||||
| module_name=module_name, | module_name=module_name, | ||||
| module_cls=module_cls) | |||||
| module_cls=module_cls, | |||||
| requirements=requirements) | |||||
| return module_cls | return module_cls | ||||
| # if module_cls is None, should return a decorator function | # if module_cls is None, should return a decorator function | ||||
| @@ -128,7 +137,8 @@ class Registry(object): | |||||
| self._register_module( | self._register_module( | ||||
| group_key=group_key, | group_key=group_key, | ||||
| module_name=module_name, | module_name=module_name, | ||||
| module_cls=module_cls) | |||||
| module_cls=module_cls, | |||||
| requirements=requirements) | |||||
| return module_cls | return module_cls | ||||
| return _register | return _register | ||||
| @@ -1,6 +1 @@ | |||||
| -r requirements/runtime.txt | -r requirements/runtime.txt | ||||
| -r requirements/pipeline.txt | |||||
| -r requirements/multi-modal.txt | |||||
| -r requirements/nlp.txt | |||||
| -r requirements/audio.txt | |||||
| -r requirements/cv.txt | |||||
| @@ -1,10 +1,5 @@ | |||||
| #tts | #tts | ||||
| h5py | h5py | ||||
| https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/TTS/requirements/pytorch_wavelets-1.3.0-py3-none-any.whl | |||||
| https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/TTS/requirements/ttsfrd-0.0.2-cp36-cp36m-linux_x86_64.whl; python_version=='3.6' | |||||
| https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/TTS/requirements/ttsfrd-0.0.2-cp37-cp37m-linux_x86_64.whl; python_version=='3.7' | |||||
| https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/TTS/requirements/ttsfrd-0.0.2-cp38-cp38-linux_x86_64.whl; python_version=='3.8' | |||||
| https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/TTS/requirements/ttsfrd-0.0.2-cp39-cp39-linux_x86_64.whl; python_version=='3.9' | |||||
| inflect | inflect | ||||
| keras | keras | ||||
| librosa | librosa | ||||
| @@ -14,6 +9,7 @@ nara_wpe | |||||
| numpy | numpy | ||||
| protobuf>3,<=3.20 | protobuf>3,<=3.20 | ||||
| ptflops | ptflops | ||||
| pytorch_wavelets==1.3.0 | |||||
| PyWavelets>=1.0.0 | PyWavelets>=1.0.0 | ||||
| scikit-learn | scikit-learn | ||||
| SoundFile>0.10 | SoundFile>0.10 | ||||
| @@ -24,4 +20,5 @@ torch | |||||
| torchaudio | torchaudio | ||||
| torchvision | torchvision | ||||
| tqdm | tqdm | ||||
| ttsfrd==0.0.2 | |||||
| unidecode | unidecode | ||||
| @@ -1,8 +1,6 @@ | |||||
| datasets | |||||
| einops | |||||
| fairseq==maas | |||||
| ftfy>=6.0.3 | ftfy>=6.0.3 | ||||
| https://jirenmr.oss-cn-zhangjiakou.aliyuncs.com/ofa/fairseq-maas-py3-none-any.whl | |||||
| https://jirenmr.oss-cn-zhangjiakou.aliyuncs.com/ofa/ofa-0.0.2-py3-none-any.whl | |||||
| ofa==0.0.2 | |||||
| pycocoevalcap>=1.2 | pycocoevalcap>=1.2 | ||||
| pycocotools>=2.0.4 | pycocotools>=2.0.4 | ||||
| rouge_score | rouge_score | ||||
| @@ -1 +1 @@ | |||||
| https://alinlp.alibaba-inc.com/pypi/sofa-1.0.4.2-py3-none-any.whl | |||||
| sofa==1.0.4.2 | |||||
| @@ -1,6 +0,0 @@ | |||||
| #https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/package/whl/easynlp-0.0.4-py2.py3-none-any.whl | |||||
| # tensorflow | |||||
| #--find-links https://download.pytorch.org/whl/torch_stable.html | |||||
| # torch<1.10,>=1.8.0 | |||||
| # torchaudio | |||||
| # torchvision | |||||
| @@ -1,16 +1,18 @@ | |||||
| addict | addict | ||||
| datasets | datasets | ||||
| easydict | easydict | ||||
| einops | |||||
| filelock>=3.3.0 | filelock>=3.3.0 | ||||
| numpy | numpy | ||||
| opencv-python-headless | |||||
| opencv-python | |||||
| Pillow>=6.2.0 | Pillow>=6.2.0 | ||||
| protobuf>3,<=3.20 | |||||
| pyyaml | pyyaml | ||||
| requests | requests | ||||
| requests==2.27.1 | |||||
| scipy | scipy | ||||
| setuptools==58.0.4 | |||||
| setuptools | |||||
| tokenizers<=0.10.3 | tokenizers<=0.10.3 | ||||
| torch | |||||
| tqdm>=4.64.0 | tqdm>=4.64.0 | ||||
| transformers<=4.16.2 | |||||
| transformers<=4.16.2,>=4.10.3 | |||||
| yapf | yapf | ||||
| @@ -5,6 +5,8 @@ import shutil | |||||
| import subprocess | import subprocess | ||||
| from setuptools import find_packages, setup | from setuptools import find_packages, setup | ||||
| from modelscope.utils.constant import Fields | |||||
| def readme(): | def readme(): | ||||
| with open('README.md', encoding='utf-8') as f: | with open('README.md', encoding='utf-8') as f: | ||||
| @@ -169,6 +171,16 @@ if __name__ == '__main__': | |||||
| pack_resource() | pack_resource() | ||||
| os.chdir('package') | os.chdir('package') | ||||
| install_requires, deps_link = parse_requirements('requirements.txt') | install_requires, deps_link = parse_requirements('requirements.txt') | ||||
| extra_requires = {} | |||||
| all_requires = [] | |||||
| for field in dir(Fields): | |||||
| if field.startswith('_'): | |||||
| continue | |||||
| extra_requires[field], _ = parse_requirements( | |||||
| f'requirements/{field}.txt') | |||||
| all_requires.append(extra_requires[field]) | |||||
| extra_requires['all'] = all_requires | |||||
| setup( | setup( | ||||
| name='model-scope', | name='model-scope', | ||||
| version=get_version(), | version=get_version(), | ||||
| @@ -193,5 +205,6 @@ if __name__ == '__main__': | |||||
| license='Apache License 2.0', | license='Apache License 2.0', | ||||
| tests_require=parse_requirements('requirements/tests.txt'), | tests_require=parse_requirements('requirements/tests.txt'), | ||||
| install_requires=install_requires, | install_requires=install_requires, | ||||
| extras_require=extra_requires, | |||||
| dependency_links=deps_link, | dependency_links=deps_link, | ||||
| zip_safe=False) | zip_safe=False) | ||||
| @@ -0,0 +1,22 @@ | |||||
| # Copyright (c) Alibaba, Inc. and its affiliates. | |||||
| import unittest | |||||
| from typing import List, Union | |||||
| from modelscope.utils.check_requirements import NLPModuleNotFoundError, get_msg | |||||
| from modelscope.utils.constant import Fields | |||||
| class ImportUtilsTest(unittest.TestCase): | |||||
| def test_type_module_not_found(self): | |||||
| with self.assertRaises(NLPModuleNotFoundError) as ctx: | |||||
| try: | |||||
| import not_found | |||||
| except ModuleNotFoundError as e: | |||||
| raise NLPModuleNotFoundError(e) | |||||
| self.assertTrue(get_msg(Fields.nlp) in ctx.exception.msg.msg) | |||||
| if __name__ == '__main__': | |||||
| unittest.main() | |||||