def get_profile_device_list(): """ Get profile device list. Returns: list, the available device list. Raises: ParamValueError: If the search condition contains some errors. Examples: >>> POST http://xxxx/v1/mindinsight/profile/devices """ profiler_dir = get_profiler_dir(request) train_id = get_train_id(request) if not profiler_dir or not train_id: raise ParamValueError("No profiler_dir or train_id.") profiler_dir_abs = os.path.join(settings.SUMMARY_BASE_DIR, train_id, profiler_dir) try: profiler_dir_abs = validate_and_normalize_path(profiler_dir_abs, "profiler") except ValidationError: raise ParamValueError("Invalid profiler dir") check_train_job_and_profiler_dir(profiler_dir_abs) device_list, _ = analyse_device_list_from_profiler_dir(profiler_dir_abs) return jsonify(device_list)
def get_cluster_flops(): """ Get cluster FLOPs. Returns: str, the cluster FLOPs. Raises: ParamValueError: If the cluster profiler dir is invalid. Examples: >>>GET http://xxx/v1/mindinsight/profile/cluster-flops """ train_id = get_train_id(request) if not train_id: raise ParamValueError('No train id.') cluster_profiler_dir = os.path.join(settings.SUMMARY_BASE_DIR, train_id) cluster_profiler_dir = validate_and_normalize_path(cluster_profiler_dir, 'cluster_profiler') check_train_job_and_profiler_dir(cluster_profiler_dir) analyser = AnalyserFactory.instance().get_analyser('cluster_flops', cluster_profiler_dir) flops = analyser.get_flops() return jsonify(flops)
def query_image(): """ Query image. Returns: bytes, image binary content for UI to demonstrate. """ train_id = get_train_id(request) if train_id is None: raise ParamMissError("train_id") image_path = request.args.get("path") if image_path is None: raise ParamMissError("path") image_type = request.args.get("type") if image_type is None: raise ParamMissError("type") if image_type not in ("original", "overlay", "outcome"): raise ParamValueError( f"type:{image_type}, valid options: 'original' 'overlay' 'outcome'" ) encapsulator = DatafileEncap(EXPLAIN_MANAGER) image = encapsulator.query_image_binary(train_id, image_path, image_type) return image
def get_cluster_link_info(): """ Get cluster link info. Returns: Response, the cluster link info. Raises: ParamValueError: If the search condition contains some errors. Examples: >>>POST http://xxx/v1/mindinsight/profile/search-cluster-link """ train_id = get_train_id(request) cluster_profiler_dir = os.path.join(settings.SUMMARY_BASE_DIR, train_id) try: cluster_profiler_dir = validate_and_normalize_path( cluster_profiler_dir, 'cluster_profiler') except ValidationError: raise ParamValueError('Invalid cluster_profiler dir') condition = request.stream.read() try: condition = json.loads(condition) if condition else {} except (json.JSONDecodeError, ValueError): raise ParamValueError("Json data parse failed.") device_id = condition.get("device_id", "0") to_int(device_id, 'device_id') analyser = AnalyserFactory.instance().get_analyser('cluster_hccl', cluster_profiler_dir, device_id) link_info = analyser.get_cluster_link_info(condition) return jsonify(link_info)
def query_single_train_task(): """Query single train task""" plugin_name = request.args.get('plugin_name') train_id = get_train_id(request) processor = TrainTaskManager(DATA_MANAGER) tasks = processor.get_single_train_task(train_id=train_id, plugin_name=plugin_name) return jsonify(tasks)
def query_explain_job(): """Query explain job meta-data.""" train_id = get_train_id(request) if train_id is None: raise ParamMissError("train_id") encapsulator = ExplainJobEncap(EXPLAIN_MANAGER) metadata = encapsulator.query_meta(train_id) return jsonify(metadata)
def query_plugins(): """Query plugins.""" train_id = get_train_id(request) manual_update = request.args.get('manual_update', default='false') manual_update = str_to_bool(manual_update, "manual_update") processor = TrainTaskManager(DATA_MANAGER) plugins = processor.get_plugins(train_id, manual_update) return jsonify(plugins)
def query_evaluation(): """Query saliency explainer evaluation scores.""" train_id = get_train_id(request) if train_id is None: raise ParamMissError("train_id") encapsulator = EvaluationEncap(EXPLAIN_MANAGER) scores = encapsulator.query_explainer_scores(train_id) return jsonify({ "explainer_scores": scores, })
def histogram(): """ Interface to obtain histogram data. Returns: Response, which contains a JSON object. """ tag = request.args.get("tag", default=None) train_id = get_train_id(request) processor = HistogramProcessor(DATA_MANAGER) response = processor.get_histograms(train_id, tag) return jsonify(response)
def single_image(): """ Interface to fetch raw image data for a particular image. Returns: Response, which contains a byte string of image. """ tag = request.args.get("tag") step = request.args.get("step") train_id = get_train_id(request) processor = ImageProcessor(DATA_MANAGER) img_data = processor.get_single_image(train_id, tag, step) return img_data
def graph_search_single_node(): """ Interface to search single node. Returns: Response, which contains a JSON object. """ name = request.args.get("name") tag = request.args.get("tag", default=None) train_id = get_train_id(request) graph_process = GraphProcessor(train_id, DATA_MANAGER, tag) resp = graph_process.search_single_node(name) return jsonify(resp)
def graph_nodes(): """ Interface to get graph nodes. Returns: Response, which contains a JSON object. """ name = request.args.get('name', default=None) tag = request.args.get("tag", default=None) train_id = get_train_id(request) graph_process = GraphProcessor(train_id, DATA_MANAGER, tag) response = graph_process.list_nodes(scope=name) return jsonify(response)
def image_metadata(): """ Interface to fetch metadata about the images for the particular run,tag, and zero-indexed sample. Returns: Response, which contains a list in JSON containing image events, each one of which is an object containing items wall_time, step, width, height, and query. """ tag = request.args.get("tag") train_id = get_train_id(request) processor = ImageProcessor(DATA_MANAGER) response = processor.get_metadata_list(train_id, tag) return jsonify(response)
def get_profile_summary_proposal(): """ Get summary profiling proposal. Returns: str, the summary profiling proposal. Raises: ParamValueError: If the parameters contain some errors. Examples: >>> GET http://xxxx/v1/mindinsight/profile/summary/propose """ profiler_dir = get_profiler_dir(request) train_id = get_train_id(request) device_id = get_device_id(request) if not profiler_dir or not train_id: raise ParamValueError("No profiler_dir or train_id.") to_int(device_id, 'device_id') profiler_dir_abs = os.path.join(settings.SUMMARY_BASE_DIR, train_id, profiler_dir) try: profiler_dir_abs = validate_and_normalize_path(profiler_dir_abs, "profiler") except ValidationError: raise ParamValueError("Invalid profiler dir") check_train_job_and_profiler_dir(profiler_dir_abs) step_trace_condition = { "filter_condition": { "mode": "proc", "proc_name": "iteration_interval", "step_id": 0 } } options = {'step_trace': {"iter_interval": step_trace_condition}} proposal_type_list = [ 'step_trace', 'minddata', 'minddata_pipeline', 'common' ] proposal_obj = ComposeProposal(profiler_dir_abs, device_id, proposal_type_list) proposal_info = proposal_obj.get_proposal(options) # Use json.dumps for orderly return return CustomResponse(json.dumps(proposal_info), mimetype='application/json')
def graph_node_names(): """ Interface to query node names. Returns: Response, which contains a JSON object. """ search_content = request.args.get("search") offset = request.args.get("offset", default=0) limit = request.args.get("limit", default=100) tag = request.args.get("tag", default=None) train_id = get_train_id(request) graph_process = GraphProcessor(train_id, DATA_MANAGER, tag) resp = graph_process.search_node_names(search_content, offset, limit) return jsonify(resp)
def query_explain_job(): """ Query explain job meta-data. Returns: Response, contains dict that stores metadata of the requested job. Raises: ParamMissError: If train_id info is not in the request. """ train_id = get_train_id(request) if train_id is None: raise ParamMissError("train_id") encapsulator = ExplainJobEncap(EXPLAIN_MANAGER) metadata = encapsulator.query_meta(train_id) return jsonify(metadata)
def get_profile_op_info(): """ Get operation profiling info. Returns: str, the operation profiling information. Raises: ParamValueError: If the search condition contains some errors. Examples: >>> POST http://xxxx/v1/mindinsight/profile/ops/search """ profiler_dir = get_profiler_dir(request) train_id = get_train_id(request) if not profiler_dir or not train_id: raise ParamValueError("No profiler_dir or train_id.") search_condition = request.stream.read() try: search_condition = json.loads( search_condition if search_condition else "{}") except (json.JSONDecodeError, ValueError): raise ParamValueError("Json data parse failed.") validate_condition(search_condition) device_id = search_condition.get("device_id", "0") to_int(device_id, 'device_id') profiler_dir_abs = os.path.join(settings.SUMMARY_BASE_DIR, train_id, profiler_dir) try: profiler_dir_abs = validate_and_normalize_path(profiler_dir_abs, "profiler") except ValidationError: raise ParamValueError("Invalid profiler dir") check_train_job_and_profiler_dir(profiler_dir_abs) op_type = search_condition.get("op_type") analyser = AnalyserFactory.instance().get_analyser(op_type, profiler_dir_abs, device_id) op_info = analyser.query(search_condition) return jsonify(op_info)
def query_evaluation(): """ Query saliency explainer evaluation scores. Returns: Response, contains dict that stores evaluation scores. Raises: ParamMissError: If train_id info is not in the request. """ train_id = get_train_id(request) if train_id is None: raise ParamMissError("train_id") encapsulator = EvaluationEncap(EXPLAIN_MANAGER) scores = encapsulator.query_explainer_scores(train_id) return jsonify({ "explainer_scores": scores, })
def get_dataset_graph(): """ Get dataset graph. Returns: str, the dataset graph information. Raises: MindInsightException: If method fails to be called. ParamValueError: If summary_dir is invalid. Examples: >>> GET http://xxxx/v1/mindinsight/datasets/dataset_graph?train_id=xxx """ summary_base_dir = str(settings.SUMMARY_BASE_DIR) summary_dir = get_train_id(request) if summary_dir.startswith('/'): validate_path(summary_dir) elif summary_dir.startswith('./'): summary_dir = os.path.join(summary_base_dir, summary_dir[2:]) summary_dir = validate_path(summary_dir) else: raise ParamValueError("Summary dir should be absolute path or " "relative path that relate to summary base dir.") try: dataset_graph = get_summary_lineage(summary_dir=summary_dir, keys=['dataset_graph']) except MindInsightException as exception: raise MindInsightException(exception.error, exception.message, http_code=400) if dataset_graph: summary_dir_result = dataset_graph.get('summary_dir') base_dir_len = len(summary_base_dir) if summary_base_dir == summary_dir_result: relative_dir = './' else: relative_dir = os.path.join(os.curdir, summary_dir[base_dir_len + 1:]) dataset_graph['summary_dir'] = relative_dir return jsonify(dataset_graph)
def scalar_metadata(): """ Interface to fetch metadata about the scalars for the particular run and tag. Returns: Response, which contains a list in JSON containing scalar events, each one of which is an object containing items' wall_time, step and value. """ tag = request.args.get("tag") train_id = get_train_id(request) processor = ScalarsProcessor(DATA_MANAGER) response = processor.get_metadata_list(train_id, tag) metadatas = response['metadatas'] for metadata in metadatas: value = metadata.get("value") metadata["value"] = if_nan_inf_to_none('scalar_value', value) return jsonify(response)
def get_minddata_pipeline_op_queue_info(): """ Get minddata pipeline operator info and queue info. Returns: str, the operation information and queue information. Raises: ParamValueError: If the search condition contains some errors. Examples: >>> POST http://xxxx/v1/mindinsight/profile/minddata-pipeline/op-queue """ profiler_dir = get_profiler_dir(request) train_id = get_train_id(request) if not profiler_dir or not train_id: raise ParamValueError("No profiler_dir or train_id.") profiler_dir_abs = os.path.join(settings.SUMMARY_BASE_DIR, train_id, profiler_dir) try: profiler_dir_abs = validate_and_normalize_path(profiler_dir_abs, "profiler") except ValidationError: raise ParamValueError("Invalid profiler dir.") check_train_job_and_profiler_dir(profiler_dir_abs) condition = request.stream.read() try: condition = json.loads(condition) if condition else {} except Exception: raise ParamValueError("Json data parse failed.") validate_minddata_pipeline_condition(condition) device_id = condition.get("device_id", "0") to_int(device_id, 'device_id') analyser = AnalyserFactory.instance().get_analyser('minddata_pipeline', profiler_dir_abs, device_id) op_info = analyser.query(condition) return jsonify(op_info)
def update_lineage(): """ Get lineage. Returns: str, update the lineage information about cache and tag. Raises: MindInsightException: If method fails to be called. Examples: >>> PUT http://xxxx/v1/mindinsight/lineagemgr/lineages?train_id=./run1 """ train_id = get_train_id(request) added_info = request.json if not isinstance(added_info, dict): raise ParamValueError("The request body should be a dict.") update_lineage_object(DATA_MANAGER, train_id, added_info) return jsonify({"status": "success"})
def query_train_jobs(): """Query train jobs.""" offset = request.args.get("offset", default=0) limit = request.args.get("limit", default=10) train_id = get_train_id(request) offset = Validation.check_offset(offset=offset) limit = Validation.check_limit( limit, min_value=1, max_value=SummaryWatcher.MAX_SUMMARY_DIR_COUNT) processor = TrainTaskManager(DATA_MANAGER) total, train_jobs = processor.query_train_jobs(offset, limit, train_id) return jsonify({ 'name': os.path.basename(os.path.realpath(settings.SUMMARY_BASE_DIR)), 'total': total, 'train_jobs': train_jobs, })
def get_minddata_cpu_utilization_info(): """ Get minddata cpu utilization info. Returns: str, the minddata cpu utilization info. Raises: ParamValueError: If the search condition contains some errors. Examples: >>>POST http://xxx/v1/mindinsight/profile/minddata-cpu-utilization-summary """ profiler_dir = get_profiler_dir(request) train_id = get_train_id(request) if not profiler_dir or not train_id: raise ParamValueError("No profiler_dir or train_id.") profiler_dir_abs = os.path.join(settings.SUMMARY_BASE_DIR, train_id, profiler_dir) try: profiler_dir_abs = validate_and_normalize_path(profiler_dir_abs, "profiler") except ValidationError: raise ParamValueError("Invalid profiler dir.") check_train_job_and_profiler_dir(profiler_dir_abs) condition = request.stream.read() try: condition = json.loads(condition) if condition else {} except (json.JSONDecodeError, ValueError): raise ParamValueError("Json data parse failed.") device_id = condition.get("device_id", "0") to_int(device_id, 'device_id') analyser = AnalyserFactory.instance().get_analyser( 'minddata_cpu_utilization', profiler_dir_abs, device_id) cpu_utilization = analyser.query(condition) return jsonify(cpu_utilization)
def get_minddata_pipeline_queue_info(): """ Get the special minddata pipeline queue info. Returns: str, the queue information. Raises: ParamValueError: If the search condition contains some errors. Examples: >>> GET http://xxxx/v1/mindinsight/profile/minddata-pipeline/queue """ profiler_dir = get_profiler_dir(request) train_id = get_train_id(request) if not profiler_dir or not train_id: raise ParamValueError("No profiler_dir or train_id.") profiler_dir_abs = os.path.join(settings.SUMMARY_BASE_DIR, train_id, profiler_dir) try: profiler_dir_abs = validate_and_normalize_path(profiler_dir_abs, "profiler") except ValidationError: raise ParamValueError("Invalid profiler dir.") check_train_job_and_profiler_dir(profiler_dir_abs) device_id = request.args.get('device_id', default='0') to_int(device_id, 'device_id') op_id = request.args.get('op_id', type=int) if op_id is None: raise ParamValueError( "Invalid operator id or operator id does not exist.") analyser = AnalyserFactory.instance().get_analyser('minddata_pipeline', profiler_dir_abs, device_id) op_queue_info = analyser.get_op_and_parent_op_info(op_id) return jsonify(op_queue_info)
def get_dataset_graph(): """ Get dataset graph. Returns: str, the dataset graph information. Raises: MindInsightException: If method fails to be called. ParamValueError: If summary_dir is invalid. Examples: >>> GET http://xxxx/v1/mindinsight/datasets/dataset_graph?train_id=xxx """ train_id = get_train_id(request) validate_train_id(train_id) search_condition = { 'summary_dir': { 'in': [train_id] } } result = {} try: objects = filter_summary_lineage(data_manager=DATA_MANAGER, search_condition=search_condition).get('object') except MindInsightException as exception: raise MindInsightException(exception.error, exception.message, http_code=400) if objects: lineage_obj = objects[0] dataset_graph = lineage_obj.get('dataset_graph') if dataset_graph: result.update({'dataset_graph': dataset_graph}) result.update({'summary_dir': lineage_obj.get('summary_dir')}) return jsonify(result)
def get_dataset_graph(): """ Get dataset graph. Returns: str, the dataset graph information. Raises: MindInsightException: If method fails to be called. ParamValueError: If summary_dir is invalid. Examples: >>> GET http://xxxx/v1/mindinsight/datasets/dataset_graph?train_id=xxx """ summary_base_dir = str(settings.SUMMARY_BASE_DIR) summary_dir = get_train_id(request) try: dataset_graph = general_get_summary_lineage(DATA_MANAGER, summary_dir=summary_dir, keys=['dataset_graph']) except MindInsightException as exception: raise MindInsightException(exception.error, exception.message, http_code=400) if dataset_graph: summary_dir_result = dataset_graph.get('summary_dir') base_dir_len = len(summary_base_dir) if summary_base_dir == summary_dir_result: relative_dir = './' else: relative_dir = os.path.join(os.curdir, summary_dir[base_dir_len + 1:]) dataset_graph['summary_dir'] = relative_dir return jsonify(dataset_graph)
def get_profiler_abs_dir(requests): """ Get interval process summary. Args: requests (LocalProxy): The requests. Returns: str, the profiler abs dir. """ profiler_dir = get_profiler_dir(requests) train_id = get_train_id(requests) if not profiler_dir or not train_id: raise ParamValueError("No profiler_dir or train_id.") profiler_dir_abs = os.path.join(settings.SUMMARY_BASE_DIR, train_id, profiler_dir) try: profiler_dir_abs = validate_and_normalize_path(profiler_dir_abs, "profiler") except ValidationError: raise ParamValueError("Invalid profiler dir") return profiler_dir_abs