# Copyright (c) OpenMMLab. All rights reserved. import multiprocessing as mp import os import platform import time import cv2 import mmcv import torch import torchvision from mmcv import Config import mmpose from mmpose.utils import StopWatch, collect_env, setup_multi_processes def test_collect_env(): env_info = collect_env() assert env_info['PyTorch'] == torch.__version__ assert env_info['TorchVision'] == torchvision.__version__ assert env_info['OpenCV'] == cv2.__version__ assert env_info['MMCV'] == mmcv.__version__ assert '+' in env_info['MMPose'] assert mmpose.__version__ in env_info['MMPose'] def test_stopwatch(): window_size = 5 test_loop = 10 outer_time = 100 inner_time = 100 stop_watch = StopWatch(window=window_size) for _ in range(test_loop): with stop_watch.timeit(): time.sleep(outer_time / 1000.) with stop_watch.timeit('inner'): time.sleep(inner_time / 1000.) _ = stop_watch.report() _ = stop_watch.report_strings() def test_setup_multi_processes(): # temp save system setting sys_start_mehod = mp.get_start_method(allow_none=True) sys_cv_threads = cv2.getNumThreads() # pop and temp save system env vars sys_omp_threads = os.environ.pop('OMP_NUM_THREADS', default=None) sys_mkl_threads = os.environ.pop('MKL_NUM_THREADS', default=None) # test config without setting env config = dict(data=dict(workers_per_gpu=2)) cfg = Config(config) setup_multi_processes(cfg) assert os.getenv('OMP_NUM_THREADS') == '1' assert os.getenv('MKL_NUM_THREADS') == '1' # when set to 0, the num threads will be 1 assert cv2.getNumThreads() == 1 if platform.system() != 'Windows': assert mp.get_start_method() == 'fork' # test num workers <= 1 os.environ.pop('OMP_NUM_THREADS') os.environ.pop('MKL_NUM_THREADS') config = dict(data=dict(workers_per_gpu=0)) cfg = Config(config) setup_multi_processes(cfg) assert 'OMP_NUM_THREADS' not in os.environ assert 'MKL_NUM_THREADS' not in os.environ # test manually set env var os.environ['OMP_NUM_THREADS'] = '4' config = dict(data=dict(workers_per_gpu=2)) cfg = Config(config) setup_multi_processes(cfg) assert os.getenv('OMP_NUM_THREADS') == '4' # test manually set opencv threads and mp start method config = dict( data=dict(workers_per_gpu=2), opencv_num_threads=4, mp_start_method='spawn') cfg = Config(config) setup_multi_processes(cfg) assert cv2.getNumThreads() == 4 assert mp.get_start_method() == 'spawn' # revert setting to avoid affecting other programs if sys_start_mehod: mp.set_start_method(sys_start_mehod, force=True) cv2.setNumThreads(sys_cv_threads) if sys_omp_threads: os.environ['OMP_NUM_THREADS'] = sys_omp_threads else: os.environ.pop('OMP_NUM_THREADS') if sys_mkl_threads: os.environ['MKL_NUM_THREADS'] = sys_mkl_threads else: os.environ.pop('MKL_NUM_THREADS')