Skip to content

Commit 435e4fe

Browse files
committed
functional, feature filled commit
1 parent 09422ca commit 435e4fe

File tree

4 files changed

+41
-65
lines changed

4 files changed

+41
-65
lines changed

adk/ADK.py

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from adk.io import create_exception, format_data, format_response
1111
from adk.modeldata import ModelData
12+
from adk.mlops import MLOps
1213

1314

1415
class ADK(object):
@@ -21,6 +22,7 @@ def __init__(self, apply_func, load_func=None, client=None):
2122
:param client: A Algorithmia Client instance that might be user defined,
2223
and is used for interacting with a model manifest file; if defined.
2324
"""
25+
self.mlops = None
2426
self.FIFO_PATH = "/tmp/algoout"
2527

2628
if client:
@@ -43,10 +45,8 @@ def __init__(self, apply_func, load_func=None, client=None):
4345
self.load_result = None
4446
self.loading_exception = None
4547
self.manifest_path = "model_manifest.json"
46-
self.model_data = self.init_manifest(self.manifest_path)
47-
48-
def init_manifest(self, path):
49-
return ModelData(self.client, path)
48+
self.mlops_path = "mlops.json"
49+
self.model_data = ModelData(self.client, self.manifest_path)
5050

5151
def load(self):
5252
try:
@@ -95,25 +95,18 @@ def write_to_pipe(self, payload, pprint=print):
9595
def process_local(self, local_payload, pprint):
9696
result = self.apply(local_payload)
9797
self.write_to_pipe(result, pprint=pprint)
98-
99-
def mlops_initialize(self):
100-
os.environ["MLOPS_SPOOLER_TYPE"] = "FILESYSTEM"
101-
os.environ["MLOPS_FILESYSTEM_DIRECTORY"] = self.mlops_spool_dir
102-
with open(f'{agents_dir}/conf/mlops.agent.conf.yaml') as f:
103-
documents = yaml.load(f, Loader=yaml.FullLoader)
104-
documents['mlopsUrl'] = DATAROBOT_ENDPOINT
105-
documents['apiToken'] = DATAROBOT_API_TOKEN
106-
with open(f'{agents_dir}/conf/mlops.agent.conf.yaml', 'w') as f:
107-
yaml.dump(documents, f)
108-
subprocess.call(f'{agents_dir}/bin/start-agent.sh')
109-
check = subprocess.Popen([f'{agents_dir}/bin/status-agent.sh'], stdout=subprocess.PIPE)
110-
check.terminate()
111-
112-
98+
99+
def mlops_init(self):
100+
mlops_token = os.environ.get("DATAROBOT_MLOPS_API_TOKEN", None)
101+
if mlops_token:
102+
self.mlops = MLOps(mlops_token, self.mlops_path)
103+
self.mlops.init()
104+
else:
105+
raise Exception("'DATAROBOT_MLOPS_API_TOKEN' was not found, please set to use mlops.")
113106

114107
def init(self, local_payload=None, pprint=print, mlops=False):
115108
if mlops and not self.is_local:
116-
self.mlops_initialize()
109+
self.mlops_init()
117110
self.load()
118111
if self.is_local and local_payload is not None:
119112
if self.loading_exception:

adk/mlops.py

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,44 @@
11
import yaml
2+
import json
23
import os
34
import subprocess
45

56

6-
class MLOps(Object):
7-
def __init__(self, endpoint, api_token, model_id, deployment_id):
7+
class MLOps(object):
8+
spool_dir = "/tmp/ta"
9+
agent_dir = "/opt/mlops-agent/datarobot_mlops_package-8.1.2"
10+
11+
def __init__(self, api_token, path):
812
self.token = api_token
9-
self.endpoint = endpoint
10-
self.model_id = model_id
11-
self.deployment_id = deployment_id
12-
self.spool_dir = "/tmp/ta"
13-
self.agent_dir = "/opt/mlops-agent/datarobot_mlops_package-8.1.2"
13+
if os.path.exists(path):
14+
with open(path) as f:
15+
mlops_config = json.load(f)
16+
else:
17+
raise Exception("'mlops.json' file does not exist, but mlops was requested.")
18+
if not os.path.exists(agent_dir):
19+
raise Exception("environment is not configured for mlops.\nPlease select a valid mlops enabled environment.")
20+
self.endpoint = mlops_config['datarobot_api_endpoint']
21+
self.model_id = mlops_config['model_id']
22+
self.deployment_id = mlops_config['deployment_id']
1423

1524
def init(self):
25+
os.environ['MLOPS_DEPLOYMENT_ID'] = self.deployment_id
26+
os.environ['MLOPS_MODEL_ID'] = self.model_id
27+
os.environ['MLOPS_SPOOLER_TYPE'] = "FILESYSTEM"
28+
os.environ['MLOPS_FILESYSTEM_DIRECTORY'] = "/tmp/ta"
29+
1630
with open(f'{self.agent_dir}/conf/mlops.agent.conf.yaml') as f:
1731
documents = yaml.load(f, Loader=yaml.FullLoader)
1832
documents['mlopsUrl'] = self.endpoint
1933
documents['apiToken'] = self.token
20-
with open(f'{agents_dir}/conf/mlops.agent.conf.yaml', 'w') as f:
34+
with open(f'{self.agent_dir}/conf/mlops.agent.conf.yaml', 'w') as f:
2135
yaml.dump(documents, f)
2236

23-
subprocess.call(f'{agents_dir}/bin/start-agent.sh')
24-
check = subprocess.Popen([f'{agents_dir}/bin/status-agent.sh'], stdout=subprocess.PIPE)
25-
output = check.stdout.readlines()
37+
subprocess.call(f'{self.agent_dir}/bin/start-agent.sh')
38+
check = subprocess.Popen([f'{self.agent_dir}/bin/status-agent.sh'], stdout=subprocess.PIPE)
39+
output = check.stdout.readlines()[0]
2640
check.terminate()
27-
if "DataRobot MLOps-Agent is running as a service." in output:
41+
if b"DataRobot MLOps-Agent is running as a service." in output:
2842
return True
2943
else:
30-
return False
31-
32-
def env_vars(self):
33-
os.environ['MLOPS_DEPLOYMENT_ID'] = self.deployment_id
34-
os.environ['MLOPS_MODEL_ID'] = self.model_id
35-
os.environ['MLOPS_SPOOLER_TYPE'] = "FILESYSTEM"
36-
os.environ['MLOPS_FILESYSTEM_DIRECTORY'] = "/tmp/ta"
44+
raise Exception(output)

adk/modeldata.py

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,17 @@
22
import json
33
import hashlib
44
from adk.classes import FileData
5-
from adk.mlops import MLOps
65

76

87
class ModelData(object):
9-
def __init__(self, client, model_manifest_path, mlops=False):
8+
def __init__(self, client, model_manifest_path):
109
self.manifest_reg_path = model_manifest_path
1110
self.manifest_frozen_path = "{}.freeze".format(self.manifest_reg_path)
1211
self.manifest_data = self.get_manifest()
1312
self.client = client
1413
self.models = {}
1514
self.usr_key = "__user__"
1615
self.using_frozen = True
17-
self.use_mlops = mlops
1816

1917
def __getitem__(self, key):
2018
return getattr(self, self.usr_key + key)
@@ -40,8 +38,6 @@ def available(self):
4038
def initialize(self):
4139
if self.client is None:
4240
raise Exception("Client was not defined, please define a Client when using Model Manifests.")
43-
if self.use_mlops:
44-
self.mlops_init()
4541
for required_file in self.manifest_data['required_files']:
4642
name = required_file['name']
4743
source_uri = required_file['source_uri']
@@ -110,18 +106,6 @@ def get_manifest(self):
110106
else:
111107
return None
112108

113-
def mlops_init(self):
114-
mlops = self.manifest_data['mlops']
115-
model_id = mlops['model_id']
116-
deployment_id = mlops['deployment_id']
117-
datarobot_api_endpoint = mlops['datarobot_api_endpoint']
118-
119-
api_token = os.environ.get('DATAROBOT_MLOPS_API_TOKEN')
120-
if api_token is None:
121-
raise Exception("'DATAROBOT_MLOPS_API_TOKEN' environment variable not found.\nPlease ensure that you have a"
122-
"valid API token and add it as a secret to this algorithm.")
123-
self.mlops = MLOps(datarobot_api_endpoint, api_token, model_id, deployment_id)
124-
125109

126110
def check_lock(manifest_data):
127111
expected_lock_checksum = manifest_data.get('lock_checksum')

tests/manifests/mlops_model_manifest.json

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)