def deploy(env, model_name, model_type, model_dir, project, url, min_replica, max_replica, cpu_request, memory_request): merlin.set_url(url) target_env = merlin.get_environment(env) resource_request = target_env.default_resource_request if min_replica is not None: resource_request.min_replica = int(min_replica) if max_replica is not None: resource_request.max_replica = int(max_replica) if cpu_request is not None: resource_request.cpu_request = cpu_request if memory_request is not None: resource_request.memory_request = memory_request merlin.set_project(project) merlin.set_model(model_name, ModelType(model_type)) with merlin.new_model_version() as v: merlin.log_model(model_dir=model_dir) try: endpoint = merlin.deploy(v, env, resource_request) if endpoint: print('Model deployed to {}'.format(endpoint)) except Exception as e: print(e)
def test_sklearn(integration_test_url, project_name, use_google_oauth): merlin.set_url(integration_test_url, use_google_oauth=use_google_oauth) merlin.set_project(project_name) merlin.set_model("sklearn-sample", ModelType.SKLEARN) model_dir = "test/sklearn-model" MODEL_FILE = "model.joblib" undeploy_all_version() with merlin.new_model_version() as v: clf = svm.SVC(gamma='scale') iris = load_iris() X, y = iris.data, iris.target clf.fit(X, y) dump(clf, os.path.join(model_dir, MODEL_FILE)) # Upload the serialized model to MLP merlin.log_model(model_dir=model_dir) endpoint = merlin.deploy(v) resp = requests.post(f"{endpoint.url}", json=request_json) assert resp.status_code == 200 assert resp.json() is not None assert len(resp.json()['predictions']) == len(request_json['instances']) merlin.undeploy(v) sleep(5) resp = requests.post(f"{endpoint.url}", json=request_json) assert resp.status_code == 404
def test_model_version_with_labels(integration_test_url, project_name, use_google_oauth): merlin.set_url(integration_test_url, use_google_oauth=use_google_oauth) merlin.set_project(project_name) merlin.set_model("sklearn-labels", ModelType.SKLEARN) model_dir = "test/sklearn-model" MODEL_FILE = "model.joblib" undeploy_all_version() with merlin.new_model_version(labels={"model": "T-800"}) as v: clf = svm.SVC(gamma="scale") iris = load_iris() X, y = iris.data, iris.target clf.fit(X, y) dump(clf, os.path.join(model_dir, MODEL_FILE)) # Upload the serialized model to MLP merlin.log_model(model_dir=model_dir) assert len(v.labels) == 1 assert v.labels["model"] == "T-800" merlin_active_model = merlin.active_model() all_versions = merlin_active_model.list_version( labels={"model": ["T-800"]}) for version in all_versions: assert version.labels["model"] == "T-800" should_not_exist_versions = merlin_active_model.list_version( labels={"model": ["T-1000"]}) assert len(should_not_exist_versions) == 0
def test_tensorflow(integration_test_url, project_name, use_google_oauth): merlin.set_url(integration_test_url, use_google_oauth=use_google_oauth) merlin.set_project(project_name) merlin.set_model("tensorflow-sample", ModelType.TENSORFLOW) model_dir = "test/tensorflow-model" undeploy_all_version() with merlin.new_model_version() as v: merlin.log_model(model_dir=model_dir) endpoint = merlin.deploy(v) request_json = { "signature_name": "predict", "instances": [ {"sepal_length": 2.8, "sepal_width": 1.0, "petal_length": 6.8, "petal_width": 0.4}, {"sepal_length": 0.1, "sepal_width": 0.5, "petal_length": 1.8, "petal_width": 2.4} ] } resp = requests.post(f"{endpoint.url}", json=request_json) assert resp.status_code == 200 assert resp.json() is not None assert len(resp.json()['predictions']) == len(request_json['instances']) merlin.undeploy(v) sleep(5) resp = requests.post(f"{endpoint.url}", json=request_json) assert resp.status_code == 404
def test_resource_request(integration_test_url, project_name, use_google_oauth): merlin.set_url(integration_test_url, use_google_oauth=use_google_oauth) merlin.set_project(project_name) merlin.set_model("resource-request", ModelType.XGBOOST) model_dir = "test/xgboost-model" BST_FILE = "model.bst" envs = merlin.list_environment() assert len(envs) >= 1 default_env = merlin.get_default_environment() assert default_env is not None undeploy_all_version() with merlin.new_model_version() as v: iris = load_iris() y = iris['target'] X = iris['data'] dtrain = xgb.DMatrix(X, label=y) param = { 'max_depth': 6, 'eta': 0.1, 'silent': 1, 'nthread': 4, 'num_class': 10, 'objective': 'multi:softmax' } xgb_model = xgb.train(params=param, dtrain=dtrain) model_file = os.path.join(model_dir, BST_FILE) xgb_model.save_model(model_file) # Upload the serialized model to MLP merlin.log_model(model_dir=model_dir) resource_request = ResourceRequest(1, 1, "100m", "200Mi") endpoint = merlin.deploy(v, environment_name=default_env.name, resource_request=resource_request) sleep(5) resp = requests.post(f"{endpoint.url}", json=request_json) assert resp.status_code == 200 assert resp.json() is not None assert len(resp.json()['predictions']) == len(request_json['instances']) merlin.undeploy(v) sleep(5) resp = requests.post(f"{endpoint.url}", json=request_json) assert resp.status_code == 404
def test_set_traffic(integration_test_url, project_name, use_google_oauth): merlin.set_url(integration_test_url, use_google_oauth=use_google_oauth) merlin.set_project(project_name) merlin.set_model("set-traffic-sample", ModelType.SKLEARN) model_dir = "test/sklearn-model" MODEL_FILE = "model.joblib" undeploy_all_version() with merlin.new_model_version() as v: clf = svm.SVC(gamma='scale') iris = load_iris() X, y = iris.data, iris.target clf.fit(X, y) dump(clf, os.path.join(model_dir, MODEL_FILE)) # Upload the serialized model to MLP merlin.log_model(model_dir=model_dir) endpoint = merlin.deploy(v) sleep(5) resp = requests.post(f"{endpoint.url}", json=request_json) assert resp.status_code == 200 assert resp.json() is not None assert len(resp.json()['predictions']) == len(request_json['instances']) # Undeploy deployed model version merlin.undeploy(v) sleep(5) # Redeploy and set traffic merlin.deploy(v) endpoint = merlin.set_traffic({v: 100}) sleep(5) resp = requests.post(f"{endpoint.url}", json=request_json) assert resp.status_code == 200 assert resp.json() is not None assert len(resp.json()['predictions']) == len(request_json['instances']) # Try to undeploy serving model version. It must be fail with pytest.raises(Exception): assert merlin.undeploy(v) # Undeploy other running model version endpoints undeploy_all_version()
def test_stop_serving_traffic(integration_test_url, project_name, use_google_oauth): merlin.set_url(integration_test_url, use_google_oauth=use_google_oauth) merlin.set_project(project_name) merlin.set_model("stop-serving-traffic", ModelType.SKLEARN) model_dir = "test/sklearn-model" MODEL_FILE = "model.joblib" undeploy_all_version() with merlin.new_model_version() as v: clf = svm.SVC(gamma='scale') iris = load_iris() X, y = iris.data, iris.target clf.fit(X, y) dump(clf, os.path.join(model_dir, MODEL_FILE)) # Upload the serialized model to MLP merlin.log_model(model_dir=model_dir) endpoint = merlin.deploy(v) sleep(5) resp = requests.post(f"{endpoint.url}", json=request_json) assert resp.status_code == 200 assert resp.json() is not None assert len(resp.json()['predictions']) == len(request_json['instances']) model_endpoint = merlin.serve_traffic({endpoint: 100}) sleep(5) resp = requests.post(f"{model_endpoint.url}", json=request_json) assert resp.status_code == 200 assert resp.json() is not None assert len(resp.json()['predictions']) == len(request_json['instances']) merlin.stop_serving_traffic(model_endpoint.environment_name) endpoints = merlin.list_model_endpoints() for endpoint in endpoints: if endpoint.environment_name == model_endpoint.environment_name: assert endpoint.status == Status.TERMINATED # Undeploy other running model version endpoints undeploy_all_version()
def test_xgboost(integration_test_url, project_name, use_google_oauth): merlin.set_url(integration_test_url, use_google_oauth=use_google_oauth) merlin.set_project(project_name) merlin.set_model("xgboost-sample", ModelType.XGBOOST) model_dir = "test/xgboost-model" BST_FILE = "model.bst" undeploy_all_version() with merlin.new_model_version() as v: iris = load_iris() y = iris["target"] X = iris["data"] dtrain = xgb.DMatrix(X, label=y) param = { "max_depth": 6, "eta": 0.1, "silent": 1, "nthread": 4, "num_class": 10, "objective": "multi:softmax", } xgb_model = xgb.train(params=param, dtrain=dtrain) model_file = os.path.join(model_dir, BST_FILE) xgb_model.save_model(model_file) # Upload the serialized model to MLP merlin.log_model(model_dir=model_dir) resource_request = ResourceRequest(1, 1, "100m", "200Mi") endpoint = merlin.deploy(v, resource_request=resource_request) resp = requests.post(f"{endpoint.url}", json=request_json) assert resp.status_code == 200 assert resp.json() is not None assert len(resp.json()["predictions"]) == len(request_json["instances"]) merlin.undeploy(v)