| @@ -126,7 +126,7 @@ def tensor_comparisons(): | |||||
| Examples: | Examples: | ||||
| >>> Get http://xxxx/v1/mindinsight/debugger/tensor-comparisons? | >>> Get http://xxxx/v1/mindinsight/debugger/tensor-comparisons? | ||||
| name=node_name&detail=data&shape=[0, 0, :, :]&tolerance=0.5 | |||||
| >>> name=node_name&detail=data&shape=[0, 0, :, :]&tolerance=0.5 | |||||
| """ | """ | ||||
| name = request.args.get('name') | name = request.args.get('name') | ||||
| detail = request.args.get('detail', 'data') | detail = request.args.get('detail', 'data') | ||||
| @@ -257,7 +257,6 @@ class DebuggerGrpcServer(grpc_server_base.EventListenerServicer): | |||||
| def SendTensors(self, request_iterator, context): | def SendTensors(self, request_iterator, context): | ||||
| """Send tensors into DebuggerCache.""" | """Send tensors into DebuggerCache.""" | ||||
| log.info("Received tensor.") | log.info("Received tensor.") | ||||
| self._received_view_cmd['wait_for_tensor'] = False | |||||
| tensor_construct = [] | tensor_construct = [] | ||||
| tensor_stream = self._cache_store.get_stream_handler(Streams.TENSOR) | tensor_stream = self._cache_store.get_stream_handler(Streams.TENSOR) | ||||
| metadata_stream = self._cache_store.get_stream_handler(Streams.METADATA) | metadata_stream = self._cache_store.get_stream_handler(Streams.METADATA) | ||||
| @@ -266,6 +265,8 @@ class DebuggerGrpcServer(grpc_server_base.EventListenerServicer): | |||||
| for tensor in request_iterator: | for tensor in request_iterator: | ||||
| tensor_construct.append(tensor) | tensor_construct.append(tensor) | ||||
| if tensor.finished: | if tensor.finished: | ||||
| if self._received_view_cmd.get('wait_for_tensor') and tensor.tensor_content: | |||||
| self._received_view_cmd['wait_for_tensor'] = False | |||||
| tensor_stream.put({'step': step, 'tensor_protos': tensor_construct}) | tensor_stream.put({'step': step, 'tensor_protos': tensor_construct}) | ||||
| tensor_construct = [] | tensor_construct = [] | ||||
| tensor_names.append(':'.join([tensor.node_name, tensor.slot])) | tensor_names.append(':'.join([tensor.node_name, tensor.slot])) | ||||
| @@ -445,8 +445,7 @@ class DebuggerServer: | |||||
| if metadata_stream.state != ServerStatus.WAITING.value: | if metadata_stream.state != ServerStatus.WAITING.value: | ||||
| log.error("Failed to create watchpoint as the MindSpore is not in waiting state.") | log.error("Failed to create watchpoint as the MindSpore is not in waiting state.") | ||||
| raise DebuggerCreateWatchPointError( | raise DebuggerCreateWatchPointError( | ||||
| "Failed to create watchpoint as the MindSpore is not in waiting state." | |||||
| ) | |||||
| "Failed to create watchpoint as the MindSpore is not in waiting state.") | |||||
| if metadata_stream.backend == 'GPU' and watch_condition.get('condition') == 'OVERFLOW': | if metadata_stream.backend == 'GPU' and watch_condition.get('condition') == 'OVERFLOW': | ||||
| log.error("GPU doesn't support OVERFLOW watch condition.") | log.error("GPU doesn't support OVERFLOW watch condition.") | ||||
| raise DebuggerParamValueError("GPU doesn't support OVERFLOW watch condition.") | raise DebuggerParamValueError("GPU doesn't support OVERFLOW watch condition.") | ||||
| @@ -152,7 +152,9 @@ class OpTensor(BaseTensor): | |||||
| statistics = TensorUtils.get_statistics_from_tensor(tensor_value) | statistics = TensorUtils.get_statistics_from_tensor(tensor_value) | ||||
| res['statistics'] = TensorUtils.get_statistics_dict(statistics) | res['statistics'] = TensorUtils.get_statistics_dict(statistics) | ||||
| res['value'] = tensor_value.tolist() | res['value'] = tensor_value.tolist() | ||||
| return res | |||||
| elif isinstance(tensor_value, str): | |||||
| res['value'] = tensor_value | |||||
| return res | return res | ||||
| def get_tensor_value_by_shape(self, shape=None): | def get_tensor_value_by_shape(self, shape=None): | ||||
| @@ -188,6 +190,7 @@ class OpTensor(BaseTensor): | |||||
| value = np.asarray(value) | value = np.asarray(value) | ||||
| return value | return value | ||||
| class ConstTensor(BaseTensor): | class ConstTensor(BaseTensor): | ||||
| """Tensor data structure for Const Node.""" | """Tensor data structure for Const Node.""" | ||||
| @@ -188,6 +188,9 @@ class TensorHandler(StreamHandlerBase): | |||||
| # add `has_prev_step` field to tensor basic info. | # add `has_prev_step` field to tensor basic info. | ||||
| if basic_info: | if basic_info: | ||||
| tensor_info.update(basic_info) | tensor_info.update(basic_info) | ||||
| if not basic_info.get('value'): | |||||
| missed_tensors.append(tensor_info) | |||||
| log.debug("Add view cmd for %s", tensor_name) | |||||
| else: | else: | ||||
| missed_tensors.append(tensor_info) | missed_tensors.append(tensor_info) | ||||
| log.debug("Add view cmd for %s", tensor_name) | log.debug("Add view cmd for %s", tensor_name) | ||||
| @@ -221,13 +224,7 @@ class TensorHandler(StreamHandlerBase): | |||||
| if prev_step < 0: | if prev_step < 0: | ||||
| return flag | return flag | ||||
| tensor = self._get_tensor(tensor_name, step=prev_step) | tensor = self._get_tensor(tensor_name, step=prev_step) | ||||
| if not tensor: | |||||
| # the tensor need to be queried from client | |||||
| flag = False | |||||
| elif tensor.value: | |||||
| flag = True | |||||
| return flag | |||||
| return bool(tensor and tensor.valule) | |||||
| def get_tensor_value_by_name(self, tensor_name, prev=False): | def get_tensor_value_by_name(self, tensor_name, prev=False): | ||||
| """Get tensor value by name in numpy type.""" | """Get tensor value by name in numpy type.""" | ||||
| @@ -283,13 +280,16 @@ class TensorHandler(StreamHandlerBase): | |||||
| curr_tensor_slice = curr_tensor.get_tensor_value_by_shape(shape) | curr_tensor_slice = curr_tensor.get_tensor_value_by_shape(shape) | ||||
| prev_tensor_slice = prev_tensor.get_tensor_value_by_shape(shape) | prev_tensor_slice = prev_tensor.get_tensor_value_by_shape(shape) | ||||
| tensor_info = curr_tensor.get_basic_info() | tensor_info = curr_tensor.get_basic_info() | ||||
| if isinstance(tensor_info, dict): | |||||
| del tensor_info['has_prev_step'] | |||||
| del tensor_info['value'] | |||||
| if isinstance(curr_tensor_slice, np.ndarray) and isinstance(prev_tensor_slice, np.ndarray): | if isinstance(curr_tensor_slice, np.ndarray) and isinstance(prev_tensor_slice, np.ndarray): | ||||
| diff_tensor = TensorUtils.calc_diff_between_two_tensor(curr_tensor_slice, prev_tensor_slice, tolerance) | diff_tensor = TensorUtils.calc_diff_between_two_tensor(curr_tensor_slice, prev_tensor_slice, tolerance) | ||||
| result = np.stack([prev_tensor_slice, curr_tensor_slice, diff_tensor], axis=-1) | result = np.stack([prev_tensor_slice, curr_tensor_slice, diff_tensor], axis=-1) | ||||
| tensor_info['diff'] = result.tolist() | tensor_info['diff'] = result.tolist() | ||||
| stats = TensorUtils.get_statistics_from_tensor(diff_tensor) | stats = TensorUtils.get_statistics_from_tensor(diff_tensor) | ||||
| tensor_info['statistics'] = TensorUtils.get_statistics_dict(stats) | tensor_info['statistics'] = TensorUtils.get_statistics_dict(stats) | ||||
| del tensor_info['has_prev_step'] | |||||
| del tensor_info['value'] | |||||
| elif isinstance(curr_tensor_slice, str): | |||||
| tensor_info['diff'] = curr_tensor_slice | |||||
| reply = {'tensor_value': tensor_info} | reply = {'tensor_value': tensor_info} | ||||
| return reply | return reply | ||||