def extractRow(i: int, requestMsg: prediction_pb2.SeldonMessage, req_datatype: str, req_features: np.ndarray, req_datadef: "prediction_pb2.SeldonMessage.data"): datatyReq = "ndarray" dataType = "tabular" if len(req_features.shape) == 2: dataReq = array_to_grpc_datadef( datatyReq, np.expand_dims(req_features[i], axis=0), req_datadef.names) else: if len(req_features.shape) > 2: dataType = "image" else: dataType = "text" req_features = np.char.decode(req_features.astype('S'), "utf-8") dataReq = array_to_grpc_datadef( datatyReq, np.expand_dims(req_features[i], axis=0), req_datadef.names) requestMsg2 = prediction_pb2.SeldonMessage(data=dataReq, meta=requestMsg.meta) reqJson = {} reqJson["payload"] = seldon_message_to_json(requestMsg2) # setting dataType here temporarily so calling method will be able to access it # don't want to set it at the payload level reqJson["dataType"] = dataType return reqJson
def test_proto_array_to_tftensor(): arr = np.array([[1, 2, 3], [4, 5, 6]]) datadef = scu.array_to_grpc_datadef("tftensor", arr, []) print(datadef) assert datadef.tftensor.tensor_shape.dim[0].size == 2 assert datadef.tftensor.tensor_shape.dim[1].size == 3 assert datadef.tftensor.dtype == 9
def predict_raw(self, request): print("Predict raw") default_data_type = request.data.WhichOneof("data_oneof") print(default_data_type) if default_data_type == "tftensor" and self.grpc: tfrequest = predict_pb2.PredictRequest() tfrequest.model_spec.name = self.model_name tfrequest.model_spec.signature_name = self.signature_name tfrequest.inputs[self.model_input].CopyFrom(request.data.tftensor) result = self.stub.Predict(tfrequest) print(result) datadef = prediction_pb2.DefaultData( tftensor=result.outputs[self.model_output]) return prediction_pb2.SeldonMessage(data=datadef) elif default_data_type == "jsonData": predictions = self.predict(request.jsonData, features_names=[]) return prediction_pb2.SeldonMessage(jsonData=predictions) else: features = get_data_from_proto(request) datadef = request.data data_type = request.WhichOneof("data_oneof") predictions = self.predict(features, datadef.names) predictions = np.array(predictions) if data_type == "data": default_data_type = request.data.WhichOneof("data_oneof") else: default_data_type = "tensor" class_names = [] data = array_to_grpc_datadef(predictions, class_names, default_data_type) return prediction_pb2.SeldonMessage(data=data)
def extractRow(i:int,requestMsg: prediction_pb2.SeldonMessage,req_datatype: str,req_features: np.ndarray,req_datadef: "prediction_pb2.SeldonMessage.data"): datatyReq = "ndarray" dataType = "tabular" if len(req_features.shape) == 2: dataReq = array_to_grpc_datadef(datatyReq, np.expand_dims(req_features[i], axis=0), req_datadef.names) else: if len(req_features.shape) > 2: dataType="image" else: dataType="text" req_features= np.char.decode(req_features.astype('S'),"utf-8") dataReq = array_to_grpc_datadef(datatyReq, req_features, req_datadef.names) requestMsg2 = prediction_pb2.SeldonMessage(data=dataReq, meta=requestMsg.meta) reqJson = seldon_message_to_json(requestMsg2) reqJson["dataType"] = dataType return reqJson
def test_create_grpc_reponse_ndarray(): user_model = UserObject() request_data = np.array([[5, 6, 7]]) datadef = scu.array_to_grpc_datadef("ndarray", request_data) request = prediction_pb2.SeldonMessage(data=datadef) raw_response = np.array([[1, 2, 3]]) sm = scu.construct_response(user_model, True, request, raw_response) assert sm.data.WhichOneof("data_oneof") == "ndarray"
def test_create_grpc_response_strdata(): user_model = UserObject() request_data = np.array([[5, 6, 7]]) datadef = scu.array_to_grpc_datadef("ndarray", request_data) request = prediction_pb2.SeldonMessage(data=datadef) raw_response = "hello world" sm = scu.construct_response(user_model, True, request, raw_response) assert sm.data.WhichOneof("data_oneof") == None assert len(sm.strData) > 0
def extractRow(i: int, requestMsg: prediction_pb2.SeldonMessage, req_datatype: str, req_features: np.ndarray, req_datadef: prediction_pb2.SeldonMessage.data): if req_datatype == "data": datatyReq = requestMsg.data.WhichOneof("data_oneof") else: datatyReq = "ndarray" if len(req_features.shape) == 2: dataReq = array_to_grpc_datadef( datatyReq, np.expand_dims(req_features[i], axis=0), req_datadef.names) else: dataReq = array_to_grpc_datadef(datatyReq, req_features, req_datadef.names) requestMsg2 = prediction_pb2.SeldonMessage(data=dataReq, meta=requestMsg.meta) reqJson = seldon_message_to_json(requestMsg2) return reqJson
def test_create_grpc_reponse_binary(): user_model = UserObject() request_data = np.array([[5, 6, 7]]) datadef = scu.array_to_grpc_datadef("tensor", request_data) request = prediction_pb2.SeldonMessage(data=datadef) raw_response = b"binary" sm = scu.construct_response(user_model, True, request, raw_response) assert sm.data.WhichOneof("data_oneof") == None assert len(sm.strData) == 0 assert len(sm.binData) > 0
def test_create_grpc_response_jsondata(): user_model = UserObject() request_data = np.array([[5, 6, 7]]) datadef = scu.array_to_grpc_datadef("ndarray", request_data) request = prediction_pb2.SeldonMessage(data=datadef) raw_response = {"output": "data"} sm = scu.construct_response(user_model, True, request, raw_response) assert sm.data.WhichOneof("data_oneof") == None emptyValue = Value() assert sm.jsonData != emptyValue
def test_create_grpc_response_customdata(): user_model = UserObject() request_data = np.array([[5, 6, 7]]) datadef = scu.array_to_grpc_datadef("ndarray", request_data) request = prediction_pb2.SeldonMessage(data=datadef) raw_response = any_pb2.Any(value=b"testdata") sm = scu.construct_response(user_model, True, request, raw_response) assert sm.data.WhichOneof("data_oneof") is None emptyValue = Value() assert sm.customData != emptyValue
def test_create_grpc_reponse_text_ndarray(): user_model = UserObject() request_data = np.array([["hello", "world"], ["hello", "another", "world"]]) datadef = scu.array_to_grpc_datadef("ndarray", request_data) request = prediction_pb2.SeldonMessage(data=datadef) (features, meta, datadef, data_type) = scu.extract_request_parts(request) raw_response = np.array([["hello", "world"], ["here", "another"]]) sm = scu.construct_response(user_model, True, request, raw_response) assert sm.data.WhichOneof("data_oneof") == "ndarray" assert type(features[0]) == list assert np.array_equal(sm.data.ndarray, raw_response) assert datadef == request.data assert np.array_equal(features, request_data) assert data_type == "data"
def predict_grpc(self, request): """ predict_grpc will be called only when there is a GRPC call to the server which in this case, the request will be sent to the TFServer directly. """ log.debug("Preprocessing contents for predict function") request_data_type = request.WhichOneof("data_oneof") default_data_type = request.data.WhichOneof("data_oneof") log.debug( f"Request data type: {request_data_type}, Default data type: {default_data_type}" ) if request_data_type != "data": raise Exception("strData, binData and jsonData not supported.") tfrequest = predict_pb2.PredictRequest() tfrequest.model_spec.name = self.model_name tfrequest.model_spec.signature_name = self.signature_name # For GRPC case, if we have a TFTensor message we can pass it directly if default_data_type == "tftensor": tfrequest.inputs[self.model_input].CopyFrom(request.data.tftensor) result = self.stub.Predict(tfrequest) datadef = prediction_pb2.DefaultData( tftensor=result.outputs[self.model_output]) return prediction_pb2.SeldonMessage(data=datadef) else: data_arr = grpc_datadef_to_array(request.data) tfrequest.inputs[self.model_input].CopyFrom( tf.contrib.util.make_tensor_proto(data_arr.tolist(), shape=data_arr.shape)) result = self.stub.Predict(tfrequest) result_arr = numpy.array( result.outputs[self.model_output].float_val) if len(result_arr.shape) == 1: result_arr = numpy.expand_dims(result_arr, axis=0) class_names = [] data = array_to_grpc_datadef(default_data_type, result_arr, class_names) return prediction_pb2.SeldonMessage(data=data)
def predict_raw(self, request): log.debug("Predict raw") request_data_type = request.WhichOneof("data_oneof") default_data_type = request.data.WhichOneof("data_oneof") log.debug(str(request_data_type), str(default_data_type)) if default_data_type == "tftensor" and self.grpc: tfrequest = predict_pb2.PredictRequest() tfrequest.model_spec.name = self.model_name tfrequest.model_spec.signature_name = self.signature_name tfrequest.inputs[self.model_input].CopyFrom(request.data.tftensor) result = self.stub.Predict(tfrequest) log.debug(result) datadef = prediction_pb2.DefaultData( tftensor=result.outputs[self.model_output]) return prediction_pb2.SeldonMessage(data=datadef) elif request_data_type == "jsonData": features = get_data_from_proto(request) predictions = self.predict(features, features_names=[]) try: sm = json_to_seldon_message({"jsonData": predictions}) except ParseError as e: sm = prediction_pb2.SeldonMessage(strData=predictions) return sm else: features = get_data_from_proto(request) datadef = request.data predictions = self.predict(features, datadef.names) predictions = np.array(predictions) if request_data_type is not "data": default_data_type = "tensor" class_names = [] data = array_to_grpc_datadef(predictions, class_names, default_data_type) return prediction_pb2.SeldonMessage(data=data)
def mocked_requests_post_success(url, *args, **kwargs): data = np.random.rand(1, 1) datadef = array_to_grpc_datadef("tensor", data) request = prediction_pb2.SeldonMessage(data=datadef) json = seldon_message_to_json(request) return MockResponse(json, 200, text="{}")