Example #1
0
            def rest_prediction_server():
                app = seldon_microservice.get_rest_microservice(user_object)
                try:
                    user_object.load()
                except (NotImplementedError, AttributeError):
                    pass
                if args.tracing:
                    logger.info('Tracing branch is active')
                    from flask_opentracing import FlaskTracer
                    logger.info('Set JAEGER_EXTRA_TAGS %s', jaeger_extra_tags)
                    tracing = FlaskTracer(tracer, True, app, jaeger_extra_tags)

                app.run(host='0.0.0.0', port=port)
def test_model_bin_data_nparray():
    user_object = UserObject(ret_nparray=True)
    app = get_rest_microservice(user_object)
    client = app.test_client()
    encoded = base64.b64encode(b"1234")
    rv = client.get('/predict?json={"binData":"' + str(encoded) + '"}')
    j = json.loads(rv.data)
    print(j)
    assert rv.status_code == 200
    assert j["data"]["tensor"]["values"] == [1, 2, 3]
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics()[0]["value"]
Example #3
0
 def rest_prediction_server():
     options = {
         'bind': '%s:%s' % ('0.0.0.0', port),
         'access_logfile': '-',
         'loglevel': 'info',
         'timeout': 5000,
         'reload': 'true',
         'workers': args.workers,
         'max_requests': args.max_requests,
         'max_requests_jitter': args.max_requests_jitter,
     }
     app = seldon_microservice.get_rest_microservice(user_object)
     StandaloneApplication(app, user_object, options=options).run()
def test_aggreate_ok_lowlevel():
    user_object = UserObjectLowLevel()
    seldon_metrics = SeldonMetrics()
    app = get_rest_microservice(user_object, seldon_metrics)
    client = app.test_client()
    rv = client.get(
        '/aggregate?json={"seldonMessages":[{"data":{"ndarray":[1]}},{"data":{"ndarray":[2]}}]}'
    )
    logging.info(rv)
    j = json.loads(rv.data)
    logging.info(j)
    assert rv.status_code == 200
    assert j["data"]["ndarray"] == [9, 9]
Example #5
0
def test_aggreate_ok():
    user_object = UserObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get('/aggregate?json={"seldonMessages":[{"data":{"ndarray":[1]}}]}')
    print(rv)
    j = json.loads(rv.data)
    print(j)
    assert rv.status_code == 200
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics()[0]["value"]
    assert j["data"]["ndarray"] == [1]
Example #6
0
def test_model_gets_meta():
    user_object = UserObject(ret_meta=True)
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get(
        '/predict?json={"meta":{"puid": "abc"},"data":{"ndarray":[]}}')
    j = json.loads(rv.data)
    print(j)
    assert rv.status_code == 200
    assert j["meta"]["tags"] == {"inc_meta": {"puid": "abc"}}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics(
    )[0]["value"]
def test_model_ok_with_names():
    user_object = UserObject()
    seldon_metrics = SeldonMetrics()
    app = get_rest_microservice(user_object, seldon_metrics)
    client = app.test_client()
    rv = client.get(
        '/predict?json={"data":{"names":["a","b"],"ndarray":[[1,2]]}}')
    j = json.loads(rv.data)
    assert rv.status_code == 200
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics(
    )[0]["value"]
def test_router_ok():
    user_object = UserObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get('/route?json={"data":{"ndarray":[2]}}')
    j = json.loads(rv.data)
    print(j)
    assert rv.status_code == 200
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics(
    )[0]["value"]
    assert j["data"]["ndarray"] == [[22]]
Example #9
0
def test_model_str_data_identity():
    user_object = UserObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get('/predict?json={"strData":"my data"}')
    j = json.loads(rv.data)
    print(j)
    assert rv.status_code == 200
    assert j["strData"] == "my data"
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics(
    )[0]["value"]
Example #10
0
def test_model_error_status_code():
    class ErrorUserObject:
        def predict(self, X, features_names, **kwargs):
            raise SeldonMicroserviceException("foo", status_code=403)

    user_object = ErrorUserObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    uo = UserObject()
    rv = client.get('/predict?json={"strData":"my data"}')
    j = json.loads(rv.data)
    print(j)
    assert rv.status_code == 403
def test_model_str_data():
    user_object = UserObject(ret_nparray=True)
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get('/predict?json={"strData":"my data"}')
    j = json.loads(rv.data)
    logging.info(j)
    assert rv.status_code == 200
    assert j["data"]["tensor"]["values"] == [1, 2, 3]
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics(
    )[0]["value"]
Example #12
0
 def rest_prediction_server():
     options = {
         "bind": "%s:%s" % ("0.0.0.0", port),
         "access_logfile": "-",
         "loglevel": "info",
         "timeout": 5000,
         "reload": "true",
         "workers": args.workers,
         "max_requests": args.max_requests,
         "max_requests_jitter": args.max_requests_jitter,
     }
     app = seldon_microservice.get_rest_microservice(user_object)
     StandaloneApplication(app, user_object, options=options).run()
def test_model_multi_form_data_ok():
    user_object = UserObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.post('/predict',data={"data":'{"names":["a","b"],"ndarray":[[1,2]]}'},content_type='multipart/form-data')
    j = json.loads(rv.data)
    print(j)
    assert rv.status_code == 200
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics()[0]["value"]
    assert j["data"]["names"] == ["t:0", "t:1"]
    assert j["data"]["ndarray"] == [[1.0, 2.0]]
def test_model_ok():
    user_object = UserObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get('/predict?json={"data":{"names":["a","b"],"ndarray":[[1,2]]}}')
    j = json.loads(rv.data)
    print(j)
    assert rv.status_code == 200
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics()[0]["value"]
    assert j["data"]["names"] == ["t:0", "t:1"]
    assert j["data"]["ndarray"] == [[1.0, 2.0]]
Example #15
0
def test_seldon_metrics_endpoint(cls, client_gets_metrics):
    def _match_label(line):
        _data, value = line.split()
        name, labels = _data.split()[0].split("{")
        labels = labels[:-1]
        return name, value, eval(f"dict({labels})")

    def _iterate_metrics(text):
        for line in text.split("\n"):
            if not line or line[0] == "#":
                continue
            yield _match_label(line)

    user_object = cls()
    seldon_metrics = SeldonMetrics()

    app = get_rest_microservice(user_object, seldon_metrics)
    client = app.test_client()

    metrics_app = get_metrics_microservice(seldon_metrics)
    metrics_client = metrics_app.test_client()

    rv = metrics_client.get("/metrics")
    assert rv.status_code == 200
    assert rv.data.decode() == ""

    rv = client.get('/predict?json={"data": {"names": ["input"], "ndarray": ["data"]}}')
    assert rv.status_code == 200
    assert ("metrics" in json.loads(rv.data)["meta"]) == client_gets_metrics

    rv = metrics_client.get("/metrics")
    text = rv.data.decode()

    timer_present = False
    for name, value, labels in _iterate_metrics(text):
        if name == "mytimer_bucket":
            timer_present = True

        if name == "mycounter_total":
            assert value == "1.0"
            assert labels["worker_id"] == str(os.getpid())

        if name == "mygauge":
            assert value == "100.0"
            assert labels["worker_id"] == str(os.getpid())

        if name == "customtag":
            assert value == "200.0"
            assert labels["mytag"] == "mytagvalue"

    assert timer_present
def test_aggreate_ok_list():
    user_object = UserObject()
    seldon_metrics = SeldonMetrics()
    app = get_rest_microservice(user_object, seldon_metrics)
    client = app.test_client()
    rv = client.get('/aggregate?json=[{"data":{"ndarray":[1]}}]')
    logging.info(rv)
    j = json.loads(rv.data)
    logging.info(j)
    assert rv.status_code == 200
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics()[0]["value"]
    assert j["data"]["ndarray"] == [1]
Example #17
0
 def rest_prediction_server():
     options = {
         "bind": "%s:%s" % ("0.0.0.0", port),
         "accesslog": accesslog(args.log_level),
         "loglevel": args.log_level.lower(),
         "timeout": 5000,
         "threads": threads(args.threads, args.single_threaded),
         "workers": args.workers,
         "max_requests": args.max_requests,
         "max_requests_jitter": args.max_requests_jitter,
     }
     app = seldon_microservice.get_rest_microservice(
         user_object, seldon_metrics)
     UserModelApplication(app, user_object, options=options).run()
Example #18
0
def test_feedback_v01_ok():
    user_object = UserObject()
    seldon_metrics = SeldonMetrics()
    app = get_rest_microservice(user_object, seldon_metrics)
    client = app.test_client()

    payload = {
        "request": {"data": {"names": ["a", "b"], "ndarray": [[1, 2]]}},
        "reward": 1.0,
    }
    rv = client.post("/api/v0.1/feedback", json=payload)
    j = json.loads(rv.data)
    logging.info(j)
    assert rv.status_code == 200
def test_transformer_output_ok():
    user_object = UserObject()
    seldon_metrics = SeldonMetrics()
    app = get_rest_microservice(user_object, seldon_metrics)
    client = app.test_client()
    rv = client.get('/transform-output?json={"data":{"ndarray":[1]}}')
    j = json.loads(rv.data)
    logging.info(j)
    assert rv.status_code == 200
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics(
    )[0]["value"]
    assert j["data"]["ndarray"] == [1]
def test_transform_input_gets_meta():
    user_object = UserObject(ret_meta=True)
    seldon_metrics = SeldonMetrics()
    app = get_rest_microservice(user_object, seldon_metrics)
    client = app.test_client()
    rv = client.get(
        '/transform-input?json={"meta":{"puid": "abc"},"data":{"ndarray":[]}}')
    j = json.loads(rv.data)
    logging.info(j)
    assert rv.status_code == 200
    assert j["meta"]["tags"] == {"inc_meta": {"puid": "abc"}}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics(
    )[0]["value"]
Example #21
0
def test_model_metadata_ok():
    user_object = UserObject()
    seldon_metrics = SeldonMetrics()

    app = get_rest_microservice(user_object, seldon_metrics)
    client = app.test_client()

    rv = client.get(
        '/predict?json={"data": {"names": ["input"], "ndarray": ["data"]}}')
    assert rv.status_code == 200
    assert json.loads(rv.data)["data"]["ndarray"] == ["data"]

    rv = client.get("/metadata")
    assert rv.status_code == 200
def test_unimplemented_feedback_raw():
    class CustomObject(object):
        def feedback(self, features, feature_names, reward, truth):
            logging.info("Feedback called")

    user_object = CustomObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get(
        '/send-feedback?json={"request":{"data":{"ndarray":[]}},"reward":1.0}')
    j = json.loads(rv.data)

    logging.info(j)
    assert rv.status_code == 200
def test_unimplemented_transform_output_raw():
    class CustomObject(object):
        def transform_output(self, X, features_names, **kwargs):
            return X * 2

    user_object = CustomObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get('/transform-output?json={"data":{"ndarray":[1]}}')
    j = json.loads(rv.data)

    print(j)
    assert rv.status_code == 200
    assert j["data"]["ndarray"] == [2.0]
def test_model_passes_through_tags():
    user_object = UserObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get(
        '/predict?json={"meta":{"tags":{"foo":"bar"}},"data":{"ndarray":[]}}')
    j = json.loads(rv.data)
    logging.info(j)

    assert rv.status_code == 200
    assert j["meta"]["tags"] == {"foo": "bar", "mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics(
    )[0]["value"]
def test_model_bin_data():
    user_object = UserObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    bdata = b"123"
    bdata_base64 = base64.b64encode(bdata).decode("utf-8")
    rv = client.get('/predict?json={"binData":"' + bdata_base64 + '"}')
    j = json.loads(rv.data)
    assert rv.status_code == 200
    assert j["binData"] == bdata_base64
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics(
    )[0]["value"]
def test_unimplemented_transform_input_raw_on_seldon_component():
    class CustomSeldonComponent(SeldonComponent):
        def transform_input(self, X, features_names, **kwargs):
            return X * 2

    user_object = CustomSeldonComponent()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get('/transform-input?json={"data":{"ndarray":[1]}}')
    j = json.loads(rv.data)

    logging.info(j)
    assert rv.status_code == 200
    assert j["data"]["ndarray"] == [2.0]
def test_transformer_output_bin_data_nparray():
    user_object = UserObject(ret_nparray=True)
    app = get_rest_microservice(user_object)
    client = app.test_client()
    bdata = b"123"
    bdata_base64 = base64.b64encode(bdata).decode("utf-8")
    rv = client.get('/transform-output?json={"binData":"' + bdata_base64 + '"}')
    j = json.loads(rv.data)
    logging.info(j)
    assert rv.status_code == 200
    assert j["data"]["tensor"]["values"] == [1, 2, 3]
    assert j["meta"]["tags"] == {"mytag": 1}
    assert j["meta"]["metrics"][0]["key"] == user_object.metrics()[0]["key"]
    assert j["meta"]["metrics"][0]["value"] == user_object.metrics()[0]["value"]
def test_unimplemented_route_raw():
    class CustomObject(object):
        def route(self, X, features_names):
            return 53

    user_object = CustomObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get('/route?json={"data":{"ndarray":[2]}}')
    j = json.loads(rv.data)

    logging.info(j)
    assert rv.status_code == 200
    assert j["data"]["ndarray"] == [[53]]
def test_unimplemented_predict_raw():
    class CustomObject(object):
        def predict(self, X, features_names, **kwargs):
            return X * 2

    user_object = CustomObject()
    app = get_rest_microservice(user_object)
    client = app.test_client()
    rv = client.get(
        '/predict?json={"data":{"names":["a","b"],"ndarray":[[1,2]]}}')
    j = json.loads(rv.data)

    logging.info(j)
    assert rv.status_code == 200
    assert j["data"]["ndarray"] == [[2.0, 4.0]]
def test_requestPath_2nd_node_ok():
    user_object = UserObject()
    seldon_metrics = SeldonMetrics()
    app = get_rest_microservice(user_object, seldon_metrics)
    client = app.test_client()
    rv = client.get(
        '/predict?json={"meta":{"requestPath":{"earlier-node": "earlier-image"}},"data":{"names":["a","b"],"ndarray":[[1,2]]}}'
    )
    j = json.loads(rv.data)
    logging.info(j)
    assert rv.status_code == 200
    assert j["meta"]["requestPath"] == {
        "my-test-model": "my-test-model-image",
        "earlier-node": "earlier-image",
    }