Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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"
Ejemplo n.º 6
0
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
Ejemplo n.º 7
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
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
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
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"
Ejemplo n.º 12
0
    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)
Ejemplo n.º 13
0
    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)
Ejemplo n.º 14
0
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="{}")