| | |
| | import os |
| | import random |
| | import sys |
| | import time |
| | import warnings |
| | from getpass import getuser |
| | from socket import gethostname |
| |
|
| | import numpy as np |
| | import torch |
| |
|
| | import annotator.uniformer.mmcv as mmcv |
| |
|
| |
|
| | def get_host_info(): |
| | """Get hostname and username. |
| | |
| | Return empty string if exception raised, e.g. ``getpass.getuser()`` will |
| | lead to error in docker container |
| | """ |
| | host = '' |
| | try: |
| | host = f'{getuser()}@{gethostname()}' |
| | except Exception as e: |
| | warnings.warn(f'Host or user not found: {str(e)}') |
| | finally: |
| | return host |
| |
|
| |
|
| | def get_time_str(): |
| | return time.strftime('%Y%m%d_%H%M%S', time.localtime()) |
| |
|
| |
|
| | def obj_from_dict(info, parent=None, default_args=None): |
| | """Initialize an object from dict. |
| | |
| | The dict must contain the key "type", which indicates the object type, it |
| | can be either a string or type, such as "list" or ``list``. Remaining |
| | fields are treated as the arguments for constructing the object. |
| | |
| | Args: |
| | info (dict): Object types and arguments. |
| | parent (:class:`module`): Module which may containing expected object |
| | classes. |
| | default_args (dict, optional): Default arguments for initializing the |
| | object. |
| | |
| | Returns: |
| | any type: Object built from the dict. |
| | """ |
| | assert isinstance(info, dict) and 'type' in info |
| | assert isinstance(default_args, dict) or default_args is None |
| | args = info.copy() |
| | obj_type = args.pop('type') |
| | if mmcv.is_str(obj_type): |
| | if parent is not None: |
| | obj_type = getattr(parent, obj_type) |
| | else: |
| | obj_type = sys.modules[obj_type] |
| | elif not isinstance(obj_type, type): |
| | raise TypeError('type must be a str or valid type, but ' |
| | f'got {type(obj_type)}') |
| | if default_args is not None: |
| | for name, value in default_args.items(): |
| | args.setdefault(name, value) |
| | return obj_type(**args) |
| |
|
| |
|
| | def set_random_seed(seed, deterministic=False, use_rank_shift=False): |
| | """Set random seed. |
| | |
| | Args: |
| | seed (int): Seed to be used. |
| | deterministic (bool): Whether to set the deterministic option for |
| | CUDNN backend, i.e., set `torch.backends.cudnn.deterministic` |
| | to True and `torch.backends.cudnn.benchmark` to False. |
| | Default: False. |
| | rank_shift (bool): Whether to add rank number to the random seed to |
| | have different random seed in different threads. Default: False. |
| | """ |
| | if use_rank_shift: |
| | rank, _ = mmcv.runner.get_dist_info() |
| | seed += rank |
| | random.seed(seed) |
| | np.random.seed(seed) |
| | torch.manual_seed(seed) |
| | torch.cuda.manual_seed(seed) |
| | torch.cuda.manual_seed_all(seed) |
| | os.environ['PYTHONHASHSEED'] = str(seed) |
| | if deterministic: |
| | torch.backends.cudnn.deterministic = True |
| | torch.backends.cudnn.benchmark = False |
| |
|