Skip to content

Commit 50943eb

Browse files
Merge pull request #121 from learningOrchestra/feature-tensorflow-steps-and-architecture-refactoring
Feature tensorflow steps and architecture refactoring
2 parents 2ea32c4 + 2063797 commit 50943eb

47 files changed

Lines changed: 2141 additions & 876 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docker-compose.yml

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ services:
3232
depends_on:
3333
- databaseprimary
3434
- images
35-
deploy: *default-deploy-worker
35+
deploy: *default-deploy-manager
3636
volumes:
37-
- "database_api:/database_api"
37+
- "database_api:/datasets"
3838
networks:
3939
- database
4040
environment: *default-service-database-env
@@ -178,14 +178,14 @@ services:
178178
- spark
179179
environment: *default-service-database-env
180180

181-
modelbuilder:
182-
build: microservices/model_builder_image
183-
image: 127.0.0.1:5050/model_builder
181+
builder:
182+
build: microservices/builder_image
183+
image: 127.0.0.1:5050/builder
184184
ports:
185185
- "5002:5002"
186186
- "41100:41100"
187187
extra_hosts:
188-
- "modelbuilder:0.0.0.0"
188+
- "builder:0.0.0.0"
189189
depends_on:
190190
- databaseprimary
191191
- images
@@ -235,8 +235,9 @@ services:
235235
volumes:
236236
- "database_executor:/explore"
237237
- "database_executor:/transform"
238-
- "default_model:/models"
238+
- "model:/models"
239239
- "binary_executor:/binaries"
240+
- "code_executor:/code_executions"
240241
networks:
241242
- database
242243
environment: *default-service-database-env
@@ -253,9 +254,9 @@ services:
253254
- database
254255
- spark
255256

256-
defaultmodel:
257-
build: microservices/default_model_image
258-
image: 127.0.0.1:5050/default_model
257+
model:
258+
build: microservices/model_image
259+
image: 127.0.0.1:5050/model
259260
ports:
260261
- "5007:5007"
261262
depends_on:
@@ -266,7 +267,11 @@ services:
266267
- database
267268
environment: *default-service-database-env
268269
volumes:
269-
- "default_model:/models"
270+
- "code_executor:/code_executions"
271+
- "database_executor:/explore"
272+
- "database_executor:/transform"
273+
- "model:/models"
274+
- "binary_executor:/binaries"
270275

271276
binaryexecutor:
272277
build: microservices/binary_executor_image
@@ -281,9 +286,10 @@ services:
281286
- database
282287
environment: *default-service-database-env
283288
volumes:
284-
- "default_model:/models"
289+
- "model:/models"
285290
- "binary_executor:/binaries"
286291
- "database_executor:/transform"
292+
- "code_executor:/code_executions"
287293

288294
codexecutor:
289295
build: microservices/code_executor_image
@@ -295,10 +301,12 @@ services:
295301
- images
296302
deploy: *default-deploy-manager
297303
volumes:
304+
- "code_executor:/code_executions"
298305
- "database_executor:/explore"
299306
- "database_executor:/transform"
300-
- "default_model:/models"
307+
- "model:/models"
301308
- "binary_executor:/binaries"
309+
- "database_api:/datasets"
302310
networks:
303311
- database
304312
environment: *default-service-database-env
@@ -313,6 +321,7 @@ volumes:
313321
database:
314322
database_api:
315323
database_executor:
316-
default_model:
324+
code_executor:
325+
model:
317326
binary_executor:
318327
portainer:

microservices/binary_executor_image/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ ENV MICROSERVICE_PORT 5008
99
ENV BINARY_VOLUME_PATH "/binaries"
1010
ENV MODELS_VOLUME_PATH "/models"
1111
ENV TRANSFORM_VOLUME_PATH "/transform"
12+
ENV CODE_EXECUTOR_VOLUME_PATH "/code_executions"
1213

1314
CMD ["python", "server.py"]

microservices/binary_executor_image/binary_execution.py

Lines changed: 63 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
from concurrent.futures import ThreadPoolExecutor
33
from utils import Database, Data, Metadata, ObjectStorage
44
from constants import Constants
5+
import traceback
56

67

78
class Parameters:
89
__DATASET_KEY_CHARACTER = "$"
10+
__CLASS_INSTANCE_CHARACTER = "#"
911
__DATASET_WITH_OBJECT_KEY_CHARACTER = "."
1012
__REMOVE_KEY_CHARACTER = ""
1113

@@ -17,23 +19,61 @@ def treat(self, method_parameters: dict) -> dict:
1719
parameters = method_parameters.copy()
1820

1921
for name, value in parameters.items():
20-
if self.__is_dataset(value):
21-
dataset_name = self.__get_dataset_name_from_value(
22-
value)
23-
if self.__has_dot_in_dataset_name(value):
24-
object_name = self.__get_name_after_dot_from_value(value)
22+
if type(value) is list:
23+
new_value = []
24+
for item in value:
25+
new_value.append(self.__treat_value(item))
26+
parameters[name] = new_value
27+
else:
28+
parameters[name] = self.__treat_value(value)
2529

26-
parameters[name] = self.__data.get_object_from_dataset(
27-
dataset_name, object_name)
30+
return parameters
2831

29-
else:
30-
parameters[name] = self.__data.get_dataset_content(
31-
dataset_name)
32+
def __treat_value(self, value: object) -> object:
33+
if self.__is_dataset(value):
34+
dataset_name = self.__get_dataset_name_from_value(
35+
value)
3236

33-
return parameters
37+
if self.__has_dot_in_dataset_name(value):
38+
object_name = self.__get_name_after_dot_from_value(value)
39+
return self.__data.get_object_from_dataset(
40+
dataset_name, object_name)
41+
42+
else:
43+
return self.__data.get_dataset_content(
44+
dataset_name)
45+
46+
elif self.__is_a_class_instance(value):
47+
return self.__get_a_class_instance(value)
48+
49+
else:
50+
return value
51+
52+
def __get_a_class_instance(self, class_code: str) -> object:
53+
class_instance_name = "class_instance"
54+
class_instance = None
55+
context_variables = {}
3456

35-
def __is_dataset(self, value: str) -> bool:
36-
return self.__DATASET_KEY_CHARACTER in value
57+
class_code = class_code.replace(
58+
self.__CLASS_INSTANCE_CHARACTER,
59+
f'{class_instance_name}=')
60+
61+
import tensorflow
62+
exec(class_code, locals(), context_variables)
63+
64+
return context_variables[class_instance_name]
65+
66+
def __is_a_class_instance(self, value: object) -> bool:
67+
if type(value) != str:
68+
return False
69+
else:
70+
return self.__CLASS_INSTANCE_CHARACTER in value
71+
72+
def __is_dataset(self, value: object) -> bool:
73+
if type(value) != str:
74+
return False
75+
else:
76+
return self.__DATASET_KEY_CHARACTER in value
3777

3878
def __get_dataset_name_from_value(self, value: str) -> str:
3979
dataset_name = value.replace(self.__DATASET_KEY_CHARACTER,
@@ -121,6 +161,7 @@ def __pipeline(self,
121161
flag=True)
122162

123163
except Exception as exception:
164+
traceback.print_exc()
124165
self.__metadata_creator.create_execution_document(
125166
self.executor_name,
126167
description,
@@ -135,7 +176,14 @@ def __pipeline(self,
135176

136177
def __execute_a_object_method(self, class_instance: object, method: str,
137178
parameters: dict) -> object:
138-
model_method = getattr(class_instance, method)
179+
class_method = getattr(class_instance, method)
139180

140181
treated_parameters = self.__parameters_handler.treat(parameters)
141-
return model_method(**treated_parameters)
182+
method_result = class_method(**treated_parameters)
183+
184+
if self.executor_service_type == Constants.TRAIN_TENSORFLOW_TYPE or \
185+
self.executor_service_type == Constants.TRAIN_SCIKITLEARN_TYPE or \
186+
method_result is None:
187+
return class_instance
188+
189+
return method_result

microservices/binary_executor_image/constants.py

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class Constants:
22
MODULE_PATH_FIELD_NAME = "modulePath"
33
CLASS_FIELD_NAME = "class"
4+
MODEL_NAME_FIELD_NAME = "modelName"
45
PARENT_NAME_FIELD_NAME = "parentName"
56
NAME_FIELD_NAME = "name"
67
FINISHED_FIELD_NAME = "finished"
@@ -13,6 +14,7 @@ class Constants:
1314
MODELS_VOLUME_PATH = "MODELS_VOLUME_PATH"
1415
BINARY_VOLUME_PATH = "BINARY_VOLUME_PATH"
1516
TRANSFORM_VOLUME_PATH = "TRANSFORM_VOLUME_PATH"
17+
CODE_EXECUTOR_VOLUME_PATH = "CODE_EXECUTOR_VOLUME_PATH"
1618

1719
DELETED_MESSAGE = "deleted file"
1820

@@ -33,21 +35,43 @@ class Constants:
3335

3436
MESSAGE_RESULT = "result"
3537

38+
MODEL_SCIKITLEARN_TYPE = "model/scikitlearn"
39+
MODEL_TENSORFLOW_TYPE = "model/tensorflow"
40+
41+
TUNE_SCIKITLEARN_TYPE = "tune/scikitlearn"
42+
TUNE_TENSORFLOW_TYPE = "tune/tensorflow"
43+
44+
TRAIN_SCIKITLEARN_TYPE = "train/scikitlearn"
45+
TRAIN_TENSORFLOW_TYPE = "train/tensorflow"
46+
47+
EVALUATE_SCIKITLEARN_TYPE = "evaluate/scikitlearn"
48+
EVALUATE_TENSORFLOW_TYPE = "evaluate/tensorflow"
49+
50+
PREDICT_SCIKITLEARN_TYPE = "predict/scikitlearn"
51+
PREDICT_TENSORFLOW_TYPE = "predict/tensorflow"
52+
53+
PYTHON_FUNCTION_TYPE = "function/python"
54+
DATASET_TENSORFLOW_TYPE = "dataset/tensorflow"
55+
56+
TRANSFORM_SCIKITLEARN_TYPE = "transform/scikitlearn"
57+
TRANSFORM_TENSORFLOW_TYPE = "transform/tensorflow"
58+
59+
EXPLORE_SCIKITLEARN_TYPE = "explore/scikitlearn"
60+
EXPLORE_TENSORFLOW_TYPE = "explore/tensorflow"
61+
62+
API_PATH = "/api/learningOrchestra/v1/"
63+
3664
MICROSERVICE_URI_SWITCHER = {
37-
"tune": "/api/learningOrchestra/v1/tune/",
38-
"train": "/api/learningOrchestra/v1/train/",
39-
"evaluate": "/api/learningOrchestra/v1/evaluate/",
40-
"predict": "/api/learningOrchestra/v1/predict/"
65+
TUNE_SCIKITLEARN_TYPE: f'{API_PATH}{TUNE_SCIKITLEARN_TYPE}',
66+
TUNE_TENSORFLOW_TYPE: f'{API_PATH}{TUNE_TENSORFLOW_TYPE}',
67+
TRAIN_SCIKITLEARN_TYPE: f'{API_PATH}{TRAIN_SCIKITLEARN_TYPE}',
68+
TRAIN_TENSORFLOW_TYPE: f'{API_PATH}{TRAIN_TENSORFLOW_TYPE}',
69+
EVALUATE_SCIKITLEARN_TYPE: f'{API_PATH}{EVALUATE_SCIKITLEARN_TYPE}',
70+
EVALUATE_TENSORFLOW_TYPE: f'{API_PATH}{EVALUATE_TENSORFLOW_TYPE}',
71+
PREDICT_SCIKITLEARN_TYPE: f'{API_PATH}{PREDICT_SCIKITLEARN_TYPE}',
72+
PREDICT_TENSORFLOW_TYPE: f'{API_PATH}{PREDICT_TENSORFLOW_TYPE}',
4173
}
4274

43-
DEFAULT_MODEL_TYPE = "defaultModel"
44-
TUNE_TYPE = "tune"
45-
TRAIN_TYPE = "train"
46-
EVALUATE_TYPE = "evaluate"
47-
PREDICT_TYPE = "predict"
48-
TRANSFORM_TYPE = "transform"
49-
PYTHON_TRANSFORM_TYPE = "pythonTransform"
50-
5175
MICROSERVICE_URI_PATH = "/binaryExecutor"
5276
MICROSERVICE_URI_GET_PARAMS = "?query={}&limit=20&skip=0"
5377

microservices/binary_executor_image/requirements.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,9 @@ pymongo==3.10.1
22
flask==1.1.2
33
datetime==4.3
44
pytz==2020.1
5-
scikit-learn
5+
dill==0.3.3
66
pandas==1.2.0
7+
# Don't set a specific version in dependencies in bellow,
8+
# they are used directly by user on API request.
9+
scikit-learn
10+
tensorflow

0 commit comments

Comments
 (0)