def retrieve_tensor_value(self, name, detail, shape, graph_name=None, prev=False): """Retrieve the tensor value.""" log.info("Retrieve tensor value: name: %s, detail: %s, shape: %s", name, detail, shape) self.validate_tensor_param(name, detail) # Limit to query max two dimensions for tensor in table view. parsed_shape = TensorUtils.parse_shape(shape, limit=MAX_DIMENSIONS_FOR_TENSOR) node_type, tensor_name = self._get_tensor_name_and_type_by_ui_name( name, graph_name) reply = self.cache_store.get_stream_handler(Streams.TENSOR).get({ 'name': tensor_name, 'node_type': node_type, 'shape': parsed_shape, 'prev': prev }) reply['tensor_value']['name'] = name return reply
def tensor_comparisons(self, name, shape, detail='data', tolerance='0', rank_id=0, graph_name=None): """ Get tensor comparisons data for given name, detail, shape and tolerance. Args: name (str): The name of tensor for ui. shape (str): Specify concrete dimensions of shape. detail (str): Specify which data to query. Current available value is 'data' which means concrete tensor data. Histogram or unique count can be supported in the future. rank_id (int): The id of rank. Default: 0. tolerance (str): Specify tolerance of difference between current step tensor and previous step tensor. Default value is 0. graph_name (str): The graph name. Default: None. Returns: dict, the retrieved data. """ if self.cache_store.get_stream_handler( Streams.METADATA).state != ServerStatus.WAITING.value: log.error( "Failed to compare tensors as the MindSpore is not in waiting state." ) raise DebuggerCompareTensorError( "Failed to compare tensors as the MindSpore is not in waiting state." ) self.validate_tensor_param(name, detail) # Limit to query max two dimensions for tensor in table view. parsed_shape = TensorUtils.parse_shape(shape, limit=MAX_DIMENSIONS_FOR_TENSOR) node_type, tensor_name, graph_name = self._get_tensor_name_and_type_by_ui_name( name, graph_name, rank_id) tolerance = to_float(tolerance, 'tolerance') tensor_stream = self.cache_store.get_stream_handler( Streams.TENSOR).get_tensor_handler_by_rank_id(rank_id) cur_step = self.cache_store.get_stream_handler(Streams.METADATA).step if node_type == NodeTypeEnum.PARAMETER.value: reply = tensor_stream.get_tensors_diff(tensor_name, parsed_shape, tolerance, cur_step) else: raise DebuggerParamValueError( "The node type must be parameter, but got {}.".format( node_type)) if reply.pop('view_cmd', False): self._send_view_cmd(name, graph_name, rank_id, tensor_name, node_type) return reply
def _get_train_tensors(self, train_id, tags, step, dims, detail): """ Get tensor data for given train_id, tags, step, dims and detail. Args: train_id (str): Specify list of train job ID. tags (list): Specify list of tag. step (int): Specify step of tensor, it's necessary when detail is set to 'data'. dims (str): Specify dims of tensor, it's necessary when detail is set to 'data'. detail (str): Specify which data to query, available values: 'stats', 'histogram' and 'data'. Returns: list[dict], a list of dictionaries containing the `train_id`, `tag`, `values`. Raises: TensorNotExistError, If tensor with specific train_id and tag is not exist in cache. ParamValueError, If the value of detail is not within available values: 'stats', 'histogram' and 'data'. """ tensors_response = [] for tag in tags: try: tensors = self._data_manager.list_tensors(train_id, tag) except ParamValueError as err: raise TensorNotExistError(err.message) if tensors and not isinstance(tensors[0].value, TensorContainer): raise TensorNotExistError( "there is no tensor data in this tag: {}".format(tag)) if detail is None or detail == 'stats': values = self._get_tensors_summary(detail, tensors) elif detail == 'data': Validation.check_param_empty(step=step, dims=dims) # Limit to query max two dimensions for tensor in table view. dims = TensorUtils.parse_shape(dims, limit=MAX_DIMENSIONS_FOR_TENSOR) step = to_int(step, "step") values = self._get_tensors_data(step, dims, tensors) elif detail == 'histogram': values = self._get_tensors_histogram(tensors) else: raise ParamValueError( 'Can not support this value: {} of detail.'.format(detail)) tensor = {"train_id": train_id, "tag": tag, "values": values} tensors_response.append(tensor) return tensors_response