| @@ -14,6 +14,7 @@ | |||
| # ============================================================================ | |||
| """Profiling api file.""" | |||
| import os | |||
| import re | |||
| import stat | |||
| import time | |||
| import json | |||
| @@ -80,19 +81,7 @@ class Profiler: | |||
| def __init__(self, **kwargs): | |||
| # get device_id and device_target | |||
| self._get_devid_and_devtarget() | |||
| # to avoid get different timestamp between each process in multi-card training, | |||
| # set the timestamp which is divisible by 3 | |||
| format_time = int(time.time() - time.time() % 3) | |||
| output_path = kwargs.pop("output_path", f"data-{format_time}") | |||
| self._output_path = validate_and_normalize_path(output_path) | |||
| self._output_path = os.path.join(self._output_path, f"profiler-{format_time}") | |||
| if not os.path.exists(self._output_path): | |||
| os.makedirs(self._output_path, exist_ok=True) | |||
| os.chmod(self._output_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) | |||
| else: | |||
| logger.warning("The target dir already exists. " | |||
| "There may be some old profiling data, and they will be rewrote in the end.") | |||
| self._get_output_path(kwargs) | |||
| os.environ['PROFILING_MODE'] = 'true' | |||
| os.environ['MINDDATA_PROFILING_DIR'] = self._output_path | |||
| @@ -538,6 +527,49 @@ class Profiler: | |||
| self._dev_id = dev_id | |||
| self._device_target = device_target | |||
| def _get_output_path(self, kwargs): | |||
| """Get output path of profiling data.""" | |||
| current_time = int(time.time()) | |||
| # to avoid getting different timestamp from different process in multi-card training, | |||
| # set the timestamp as exist timestamp if it's difference is less than 6 seconds. | |||
| def _select_timestamp(dir_name, re_pattern, input_time): | |||
| """select the timestamp from current_time and exist timestamp.""" | |||
| timestamp_diff_threshold = 6 | |||
| exist_timestamp_list = [] | |||
| select_time = input_time | |||
| if not os.path.exists(dir_name): | |||
| os.makedirs(dir_name, exist_ok=True) | |||
| for file_name in os.listdir(dir_name): | |||
| match_res = re_pattern.match(file_name) | |||
| if match_res: | |||
| exist_timestamp_list.append(int(match_res.group(1))) | |||
| if exist_timestamp_list: | |||
| time_diff_list = [input_time - timestamp for timestamp in exist_timestamp_list] | |||
| min_time_diff = min(time_diff_list) | |||
| if min_time_diff <= timestamp_diff_threshold: | |||
| select_time = exist_timestamp_list[time_diff_list.index(min_time_diff)] | |||
| return select_time | |||
| if "output_path" not in kwargs: | |||
| selected_timestamp = _select_timestamp(os.getcwd(), re.compile(r'data-(\d+)'), current_time) | |||
| output_path = f"data-{selected_timestamp}" | |||
| self._output_path = validate_and_normalize_path(output_path) | |||
| else: | |||
| output_path = kwargs.pop("output_path") | |||
| self._output_path = validate_and_normalize_path(output_path) | |||
| selected_timestamp = _select_timestamp(self._output_path, | |||
| re.compile(r'profiler-(\d+)'), current_time) | |||
| self._output_path = os.path.join(self._output_path, f"profiler-{selected_timestamp}") | |||
| if not os.path.exists(self._output_path): | |||
| os.makedirs(self._output_path, exist_ok=True) | |||
| os.chmod(self._output_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) | |||
| else: | |||
| logger.warning("The target dir already exists. " | |||
| "There may be some old profiling data, and they will be rewrote in the end.") | |||
| @staticmethod | |||
| def profile(network=None, profile_option=None): | |||
| """ | |||