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"]
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]
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]
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]]
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"]
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"]
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]]
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]
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()
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"]
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", }