aimodelshare 0.3.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. aimodelshare/README.md +26 -0
  2. aimodelshare/__init__.py +100 -0
  3. aimodelshare/aimsonnx.py +2381 -0
  4. aimodelshare/api.py +836 -0
  5. aimodelshare/auth.py +163 -0
  6. aimodelshare/aws.py +511 -0
  7. aimodelshare/aws_client.py +173 -0
  8. aimodelshare/base_image.py +154 -0
  9. aimodelshare/bucketpolicy.py +106 -0
  10. aimodelshare/color_mappings/color_mapping_keras.csv +121 -0
  11. aimodelshare/color_mappings/color_mapping_pytorch.csv +117 -0
  12. aimodelshare/containerisation.py +244 -0
  13. aimodelshare/containerization.py +712 -0
  14. aimodelshare/containerization_templates/Dockerfile.txt +8 -0
  15. aimodelshare/containerization_templates/Dockerfile_PySpark.txt +23 -0
  16. aimodelshare/containerization_templates/buildspec.txt +14 -0
  17. aimodelshare/containerization_templates/lambda_function.txt +40 -0
  18. aimodelshare/custom_approach/__init__.py +1 -0
  19. aimodelshare/custom_approach/lambda_function.py +17 -0
  20. aimodelshare/custom_eval_metrics.py +103 -0
  21. aimodelshare/data_sharing/__init__.py +0 -0
  22. aimodelshare/data_sharing/data_sharing_templates/Dockerfile.txt +3 -0
  23. aimodelshare/data_sharing/data_sharing_templates/__init__.py +1 -0
  24. aimodelshare/data_sharing/data_sharing_templates/buildspec.txt +15 -0
  25. aimodelshare/data_sharing/data_sharing_templates/codebuild_policies.txt +129 -0
  26. aimodelshare/data_sharing/data_sharing_templates/codebuild_trust_relationship.txt +12 -0
  27. aimodelshare/data_sharing/download_data.py +620 -0
  28. aimodelshare/data_sharing/share_data.py +373 -0
  29. aimodelshare/data_sharing/utils.py +8 -0
  30. aimodelshare/deploy_custom_lambda.py +246 -0
  31. aimodelshare/documentation/Makefile +20 -0
  32. aimodelshare/documentation/karma_sphinx_theme/__init__.py +28 -0
  33. aimodelshare/documentation/karma_sphinx_theme/_version.py +2 -0
  34. aimodelshare/documentation/karma_sphinx_theme/breadcrumbs.html +70 -0
  35. aimodelshare/documentation/karma_sphinx_theme/layout.html +172 -0
  36. aimodelshare/documentation/karma_sphinx_theme/search.html +50 -0
  37. aimodelshare/documentation/karma_sphinx_theme/searchbox.html +14 -0
  38. aimodelshare/documentation/karma_sphinx_theme/static/css/custom.css +2 -0
  39. aimodelshare/documentation/karma_sphinx_theme/static/css/custom.css.map +1 -0
  40. aimodelshare/documentation/karma_sphinx_theme/static/css/theme.css +2751 -0
  41. aimodelshare/documentation/karma_sphinx_theme/static/css/theme.css.map +1 -0
  42. aimodelshare/documentation/karma_sphinx_theme/static/css/theme.min.css +2 -0
  43. aimodelshare/documentation/karma_sphinx_theme/static/css/theme.min.css.map +1 -0
  44. aimodelshare/documentation/karma_sphinx_theme/static/font/fontello.eot +0 -0
  45. aimodelshare/documentation/karma_sphinx_theme/static/font/fontello.svg +32 -0
  46. aimodelshare/documentation/karma_sphinx_theme/static/font/fontello.ttf +0 -0
  47. aimodelshare/documentation/karma_sphinx_theme/static/font/fontello.woff +0 -0
  48. aimodelshare/documentation/karma_sphinx_theme/static/font/fontello.woff2 +0 -0
  49. aimodelshare/documentation/karma_sphinx_theme/static/js/theme.js +68 -0
  50. aimodelshare/documentation/karma_sphinx_theme/theme.conf +9 -0
  51. aimodelshare/documentation/make.bat +35 -0
  52. aimodelshare/documentation/requirements.txt +2 -0
  53. aimodelshare/documentation/source/about.rst +18 -0
  54. aimodelshare/documentation/source/advanced_features.rst +137 -0
  55. aimodelshare/documentation/source/competition.rst +218 -0
  56. aimodelshare/documentation/source/conf.py +58 -0
  57. aimodelshare/documentation/source/create_credentials.rst +86 -0
  58. aimodelshare/documentation/source/example_notebooks.rst +132 -0
  59. aimodelshare/documentation/source/functions.rst +151 -0
  60. aimodelshare/documentation/source/gettingstarted.rst +390 -0
  61. aimodelshare/documentation/source/images/creds1.png +0 -0
  62. aimodelshare/documentation/source/images/creds2.png +0 -0
  63. aimodelshare/documentation/source/images/creds3.png +0 -0
  64. aimodelshare/documentation/source/images/creds4.png +0 -0
  65. aimodelshare/documentation/source/images/creds5.png +0 -0
  66. aimodelshare/documentation/source/images/creds_file_example.png +0 -0
  67. aimodelshare/documentation/source/images/predict_tab.png +0 -0
  68. aimodelshare/documentation/source/index.rst +110 -0
  69. aimodelshare/documentation/source/modelplayground.rst +132 -0
  70. aimodelshare/exceptions.py +11 -0
  71. aimodelshare/generatemodelapi.py +1270 -0
  72. aimodelshare/iam/codebuild_policy.txt +129 -0
  73. aimodelshare/iam/codebuild_trust_relationship.txt +12 -0
  74. aimodelshare/iam/lambda_policy.txt +15 -0
  75. aimodelshare/iam/lambda_trust_relationship.txt +12 -0
  76. aimodelshare/json_templates/__init__.py +1 -0
  77. aimodelshare/json_templates/api_json.txt +155 -0
  78. aimodelshare/json_templates/auth/policy.txt +1 -0
  79. aimodelshare/json_templates/auth/role.txt +1 -0
  80. aimodelshare/json_templates/eval/policy.txt +1 -0
  81. aimodelshare/json_templates/eval/role.txt +1 -0
  82. aimodelshare/json_templates/function/policy.txt +1 -0
  83. aimodelshare/json_templates/function/role.txt +1 -0
  84. aimodelshare/json_templates/integration_response.txt +5 -0
  85. aimodelshare/json_templates/lambda_policy_1.txt +15 -0
  86. aimodelshare/json_templates/lambda_policy_2.txt +8 -0
  87. aimodelshare/json_templates/lambda_role_1.txt +12 -0
  88. aimodelshare/json_templates/lambda_role_2.txt +16 -0
  89. aimodelshare/leaderboard.py +174 -0
  90. aimodelshare/main/1.txt +132 -0
  91. aimodelshare/main/1B.txt +112 -0
  92. aimodelshare/main/2.txt +153 -0
  93. aimodelshare/main/3.txt +134 -0
  94. aimodelshare/main/4.txt +128 -0
  95. aimodelshare/main/5.txt +109 -0
  96. aimodelshare/main/6.txt +105 -0
  97. aimodelshare/main/7.txt +144 -0
  98. aimodelshare/main/8.txt +142 -0
  99. aimodelshare/main/__init__.py +1 -0
  100. aimodelshare/main/authorization.txt +275 -0
  101. aimodelshare/main/eval_classification.txt +79 -0
  102. aimodelshare/main/eval_lambda.txt +1709 -0
  103. aimodelshare/main/eval_regression.txt +80 -0
  104. aimodelshare/main/lambda_function.txt +8 -0
  105. aimodelshare/main/nst.txt +149 -0
  106. aimodelshare/model.py +1543 -0
  107. aimodelshare/modeluser.py +215 -0
  108. aimodelshare/moral_compass/README.md +408 -0
  109. aimodelshare/moral_compass/__init__.py +65 -0
  110. aimodelshare/moral_compass/_version.py +3 -0
  111. aimodelshare/moral_compass/api_client.py +601 -0
  112. aimodelshare/moral_compass/apps/__init__.py +69 -0
  113. aimodelshare/moral_compass/apps/ai_consequences.py +540 -0
  114. aimodelshare/moral_compass/apps/bias_detective.py +714 -0
  115. aimodelshare/moral_compass/apps/ethical_revelation.py +898 -0
  116. aimodelshare/moral_compass/apps/fairness_fixer.py +889 -0
  117. aimodelshare/moral_compass/apps/judge.py +888 -0
  118. aimodelshare/moral_compass/apps/justice_equity_upgrade.py +853 -0
  119. aimodelshare/moral_compass/apps/mc_integration_helpers.py +820 -0
  120. aimodelshare/moral_compass/apps/model_building_game.py +1104 -0
  121. aimodelshare/moral_compass/apps/model_building_game_beginner.py +687 -0
  122. aimodelshare/moral_compass/apps/moral_compass_challenge.py +858 -0
  123. aimodelshare/moral_compass/apps/session_auth.py +254 -0
  124. aimodelshare/moral_compass/apps/shared_activity_styles.css +349 -0
  125. aimodelshare/moral_compass/apps/tutorial.py +481 -0
  126. aimodelshare/moral_compass/apps/what_is_ai.py +853 -0
  127. aimodelshare/moral_compass/challenge.py +365 -0
  128. aimodelshare/moral_compass/config.py +187 -0
  129. aimodelshare/placeholders/model.onnx +0 -0
  130. aimodelshare/placeholders/preprocessor.zip +0 -0
  131. aimodelshare/playground.py +1968 -0
  132. aimodelshare/postprocessormodules.py +157 -0
  133. aimodelshare/preprocessormodules.py +373 -0
  134. aimodelshare/pyspark/1.txt +195 -0
  135. aimodelshare/pyspark/1B.txt +181 -0
  136. aimodelshare/pyspark/2.txt +220 -0
  137. aimodelshare/pyspark/3.txt +204 -0
  138. aimodelshare/pyspark/4.txt +187 -0
  139. aimodelshare/pyspark/5.txt +178 -0
  140. aimodelshare/pyspark/6.txt +174 -0
  141. aimodelshare/pyspark/7.txt +211 -0
  142. aimodelshare/pyspark/8.txt +206 -0
  143. aimodelshare/pyspark/__init__.py +1 -0
  144. aimodelshare/pyspark/authorization.txt +258 -0
  145. aimodelshare/pyspark/eval_classification.txt +79 -0
  146. aimodelshare/pyspark/eval_lambda.txt +1441 -0
  147. aimodelshare/pyspark/eval_regression.txt +80 -0
  148. aimodelshare/pyspark/lambda_function.txt +8 -0
  149. aimodelshare/pyspark/nst.txt +213 -0
  150. aimodelshare/python/my_preprocessor.py +58 -0
  151. aimodelshare/readme.md +26 -0
  152. aimodelshare/reproducibility.py +181 -0
  153. aimodelshare/sam/Dockerfile.txt +8 -0
  154. aimodelshare/sam/Dockerfile_PySpark.txt +24 -0
  155. aimodelshare/sam/__init__.py +1 -0
  156. aimodelshare/sam/buildspec.txt +11 -0
  157. aimodelshare/sam/codebuild_policies.txt +129 -0
  158. aimodelshare/sam/codebuild_trust_relationship.txt +12 -0
  159. aimodelshare/sam/codepipeline_policies.txt +173 -0
  160. aimodelshare/sam/codepipeline_trust_relationship.txt +12 -0
  161. aimodelshare/sam/spark-class.txt +2 -0
  162. aimodelshare/sam/template.txt +54 -0
  163. aimodelshare/tools.py +103 -0
  164. aimodelshare/utils/__init__.py +78 -0
  165. aimodelshare/utils/optional_deps.py +38 -0
  166. aimodelshare/utils.py +57 -0
  167. aimodelshare-0.3.7.dist-info/METADATA +298 -0
  168. aimodelshare-0.3.7.dist-info/RECORD +171 -0
  169. aimodelshare-0.3.7.dist-info/WHEEL +5 -0
  170. aimodelshare-0.3.7.dist-info/licenses/LICENSE +5 -0
  171. aimodelshare-0.3.7.dist-info/top_level.txt +1 -0
@@ -0,0 +1,204 @@
1
+ #Image Regression Prediction Runtime Code
2
+
3
+ import boto3
4
+ import cv2
5
+ import os
6
+ import numpy as np
7
+ import json
8
+ import onnxruntime as rt
9
+ import base64
10
+ import imghdr
11
+ import six
12
+ from functools import partial
13
+ import os.path
14
+ from os import path
15
+ import pandas as pd
16
+
17
+
18
+ def get_model_onnx(runtimemodel_s3_filename="runtime_model.onnx"):
19
+ s3 = boto3.resource('s3')
20
+ obj = s3.Object("$bucket_name", "$unique_model_id" +
21
+ "/runtime_model.onnx")
22
+ model = rt.InferenceSession(obj.get()['Body'].read())
23
+ return model
24
+
25
+ def _get_pyspark_modules():
26
+ import pyspark
27
+ import pyspark.ml
28
+ import re
29
+
30
+ pyspark_modules = ['ml', 'ml.feature', 'ml.classification', 'ml.clustering', 'ml.regression']
31
+
32
+ models_modules_dict = {}
33
+
34
+ for i in pyspark_modules:
35
+ models_list = [j for j in dir(eval('pyspark.'+i, {'pyspark': pyspark})) if callable(getattr(eval('pyspark.'+i, {'pyspark': pyspark}), j))]
36
+ models_list = [j for j in models_list if re.match('^[A-Z]', j)]
37
+
38
+ for k in models_list:
39
+ models_modules_dict[k] = 'pyspark.'+i
40
+
41
+ return models_modules_dict
42
+
43
+ def pyspark_model_from_string(model_type):
44
+ import importlib
45
+
46
+ models_modules_dict = _get_pyspark_modules()
47
+ module = models_modules_dict[model_type]
48
+ model_class = getattr(importlib.import_module(module), model_type)
49
+ return model_class
50
+
51
+ def get_preprocessor(preprocessor_s3_filename="runtime_preprocessor.zip"):
52
+ import os
53
+ import pickle
54
+ import tempfile
55
+ from io import BytesIO
56
+ from pathlib import Path
57
+ from zipfile import ZipFile
58
+
59
+ #create temporary folder
60
+ temp_dir = tempfile.gettempdir()
61
+
62
+ # there are some other zip files on temp_dir that might affect import process
63
+ temp_dir = os.path.join(temp_dir, "$unique_model_id")
64
+ os.makedirs(temp_dir, exist_ok=True)
65
+
66
+ s3 = boto3.resource("s3")
67
+ bucket = s3.Bucket("$bucket_name")
68
+
69
+ zip_obj = s3.Object(bucket_name="$bucket_name",
70
+ key="$unique_model_id/runtime_preprocessor.zip")
71
+ buffer = BytesIO(zip_obj.get()["Body"].read())
72
+ z = ZipFile(buffer)
73
+ # Extract all the contents of zip file in temp directory
74
+ z.extractall(temp_dir)
75
+
76
+ # Then import all pkl files you want from bucket (need to generate this list from
77
+ # function globals
78
+ pickle_file_list = []
79
+ zip_file_list = []
80
+ for file in os.listdir(temp_dir):
81
+ if file.endswith(".pkl"):
82
+ pickle_file_list.append(os.path.join(temp_dir, file))
83
+ if file.endswith(".zip"):
84
+ zip_file_list.append(os.path.join(temp_dir, file))
85
+
86
+ for i in pickle_file_list:
87
+ objectname = str(os.path.basename(i)).replace(".pkl", "")
88
+ objects = { objectname: "" }
89
+ globals()[objectname] = pickle.load(open(str(i), "rb"))
90
+
91
+ # Need spark session and context to instantiate model object
92
+ # zip_file_list is only used by pyspark
93
+ if len(zip_file_list):
94
+ from pyspark.sql import SparkSession
95
+
96
+ spark = SparkSession \
97
+ .builder \
98
+ .appName('Pyspark Model') \
99
+ .getOrCreate()
100
+
101
+ for i in zip_file_list:
102
+ objectnames = str(os.path.basename(i)).replace(".zip", "").split("__")
103
+ dir_path = i.replace(".zip", "")
104
+ Path(dir_path).mkdir(parents=True, exist_ok=True)
105
+
106
+ # Create a ZipFile Object and load module.zip in it
107
+ with ZipFile(i, 'r') as zipObj:
108
+ # Extract all the contents of zip file in current directory
109
+ zipObj.extractall(dir_path)
110
+
111
+ preprocessor_type = objectnames[0].split("_")[0]
112
+ objectname = objectnames[1]
113
+ preprocessor_class = pyspark_model_from_string(preprocessor_type)
114
+ if preprocessor_type == "PipelineModel":
115
+ print(preprocessor_class)
116
+ preprocessor_model = preprocessor_class(stages=None)
117
+ else:
118
+ preprocessor_model = preprocessor_class()
119
+
120
+ preprocessor_model = preprocessor_model.load(dir_path)
121
+ globals()[objectname] = preprocessor_model
122
+
123
+ # First import preprocessor function to session from preprocessor.py
124
+ exec(open(os.path.join(temp_dir, 'preprocessor.py')).read(),globals())
125
+ return preprocessor
126
+
127
+
128
+ def get_runtimedata(runtimedata_s3_filename="runtime_data.json"):
129
+
130
+ s3 = boto3.resource('s3')
131
+ obj = s3.Object("$bucket_name", "$unique_model_id"+"/"+runtimedata_s3_filename)
132
+ runtime_data = json.load(obj.get()['Body'])
133
+
134
+ return runtime_data
135
+
136
+
137
+ runtime_data=get_runtimedata(runtimedata_s3_filename="runtime_data.json")
138
+
139
+ preprocessor_type=runtime_data["runtime_preprocessor"]
140
+
141
+ runtime_model=runtime_data["runtime_model"]["name"]
142
+
143
+ model=get_model_onnx(runtimemodel_s3_filename='runtime_model.onnx')
144
+
145
+ # Load preprocessor
146
+
147
+ preprocessor=get_preprocessor(preprocessor_s3_filename="runtime_preprocessor.zip")
148
+
149
+
150
+ def predict(event,model,preprocessor):
151
+
152
+ # Load base64 encoded image stored within "data" key of event dictionary
153
+ print(event["body"])
154
+ body = event["body"]
155
+ if isinstance(event["body"], six.string_types):
156
+ body = json.loads(event["body"])
157
+
158
+ bodydata=body["data"]
159
+
160
+ # Extract image file extension (e.g.-jpg, png, etc.)
161
+ sample = base64.decodebytes(bytearray(bodydata, "utf-8"))
162
+
163
+ for tf in imghdr.tests:
164
+ image_file_type = tf(sample, None)
165
+ if image_file_type:
166
+ break;
167
+ image_file_type=image_file_type
168
+
169
+ if(image_file_type==None):
170
+ print("This file is not an image, please submit an image base64 encoded image file.")
171
+
172
+ # Save image to local file, read into session, and preprocess image with preprocessor function
173
+
174
+ with open("/tmp/imagetopredict."+image_file_type, "wb") as fh:
175
+ fh.write(base64.b64decode(bodydata))
176
+
177
+ input_data = preprocessor("/tmp/imagetopredict."+image_file_type)
178
+
179
+ # Generate prediction using preprocessed input data
180
+ print("The model expects input shape:", model.get_inputs()[0].shape)
181
+ input_name = model.get_inputs()[0].name
182
+
183
+ res = model.run(None, {input_name: input_data})
184
+
185
+ #extract predicted value
186
+
187
+ result = res[0].tolist()[0]
188
+
189
+ os.remove("/tmp/imagetopredict."+image_file_type)
190
+
191
+ return result
192
+
193
+ def handler(event, context):
194
+
195
+ result = predict(event,model,preprocessor)
196
+ return {"statusCode": 200,
197
+ "headers": {
198
+ "Access-Control-Allow-Origin" : "*",
199
+ "Access-Control-Allow-Credentials": True,
200
+ "Allow" : "GET, OPTIONS, POST",
201
+ "Access-Control-Allow-Methods" : "GET, OPTIONS, POST",
202
+ "Access-Control-Allow-Headers" : "*"
203
+ },
204
+ "body" : json.dumps(result)}
@@ -0,0 +1,187 @@
1
+ #Tabular Classification Prediction Runtime Code
2
+
3
+ import boto3
4
+ import pandas as pd
5
+ import os
6
+ import numpy as np
7
+ import onnxruntime as rt
8
+ import json
9
+
10
+ def get_model_onnx(runtimemodel_s3_filename="runtime_model.onnx"):
11
+ s3 = boto3.resource('s3')
12
+ obj = s3.Object("$bucket_name", "$unique_model_id" +
13
+ "/runtime_model.onnx")
14
+ model = rt.InferenceSession(obj.get()['Body'].read())
15
+ return model
16
+
17
+ def _get_pyspark_modules():
18
+ import pyspark
19
+ import pyspark.ml
20
+ import re
21
+
22
+ pyspark_modules = ['ml', 'ml.feature', 'ml.classification', 'ml.clustering', 'ml.regression']
23
+
24
+ models_modules_dict = {}
25
+
26
+ for i in pyspark_modules:
27
+ models_list = [j for j in dir(eval('pyspark.'+i, {'pyspark': pyspark})) if callable(getattr(eval('pyspark.'+i, {'pyspark': pyspark}), j))]
28
+ models_list = [j for j in models_list if re.match('^[A-Z]', j)]
29
+
30
+ for k in models_list:
31
+ models_modules_dict[k] = 'pyspark.'+i
32
+
33
+ return models_modules_dict
34
+
35
+ def pyspark_model_from_string(model_type):
36
+ import importlib
37
+
38
+ models_modules_dict = _get_pyspark_modules()
39
+ module = models_modules_dict[model_type]
40
+ model_class = getattr(importlib.import_module(module), model_type)
41
+ return model_class
42
+
43
+ def get_preprocessor(preprocessor_s3_filename="runtime_preprocessor.zip"):
44
+ import os
45
+ import pickle
46
+ import tempfile
47
+ from io import BytesIO
48
+ from pathlib import Path
49
+ from zipfile import ZipFile
50
+
51
+ #create temporary folder
52
+ temp_dir = tempfile.gettempdir()
53
+
54
+ # there are some other zip files on temp_dir that might affect import process
55
+ temp_dir = os.path.join(temp_dir, "$unique_model_id")
56
+ os.makedirs(temp_dir, exist_ok=True)
57
+
58
+ s3 = boto3.resource("s3")
59
+ bucket = s3.Bucket("$bucket_name")
60
+
61
+ zip_obj = s3.Object(bucket_name="$bucket_name",
62
+ key="$unique_model_id/runtime_preprocessor.zip")
63
+ buffer = BytesIO(zip_obj.get()["Body"].read())
64
+ z = ZipFile(buffer)
65
+ # Extract all the contents of zip file in temp directory
66
+ z.extractall(temp_dir)
67
+
68
+ # Then import all pkl files you want from bucket (need to generate this list from
69
+ # function globals
70
+ pickle_file_list = []
71
+ zip_file_list = []
72
+ for file in os.listdir(temp_dir):
73
+ if file.endswith(".pkl"):
74
+ pickle_file_list.append(os.path.join(temp_dir, file))
75
+ if file.endswith(".zip"):
76
+ zip_file_list.append(os.path.join(temp_dir, file))
77
+
78
+ for i in pickle_file_list:
79
+ objectname = str(os.path.basename(i)).replace(".pkl", "")
80
+ objects = { objectname: "" }
81
+ globals()[objectname] = pickle.load(open(str(i), "rb"))
82
+
83
+ # Need spark session and context to instantiate model object
84
+ # zip_file_list is only used by pyspark
85
+ if len(zip_file_list):
86
+ from pyspark.sql import SparkSession
87
+
88
+ spark = SparkSession \
89
+ .builder \
90
+ .appName('Pyspark Model') \
91
+ .getOrCreate()
92
+
93
+ for i in zip_file_list:
94
+ objectnames = str(os.path.basename(i)).replace(".zip", "").split("__")
95
+ dir_path = i.replace(".zip", "")
96
+ Path(dir_path).mkdir(parents=True, exist_ok=True)
97
+
98
+ # Create a ZipFile Object and load module.zip in it
99
+ with ZipFile(i, 'r') as zipObj:
100
+ # Extract all the contents of zip file in current directory
101
+ zipObj.extractall(dir_path)
102
+
103
+ preprocessor_type = objectnames[0].split("_")[0]
104
+ objectname = objectnames[1]
105
+ preprocessor_class = pyspark_model_from_string(preprocessor_type)
106
+ if preprocessor_type == "PipelineModel":
107
+ print(preprocessor_class)
108
+ preprocessor_model = preprocessor_class(stages=None)
109
+ else:
110
+ preprocessor_model = preprocessor_class()
111
+
112
+ preprocessor_model = preprocessor_model.load(dir_path)
113
+ globals()[objectname] = preprocessor_model
114
+
115
+ # First import preprocessor function to session from preprocessor.py
116
+ exec(open(os.path.join(temp_dir, 'preprocessor.py')).read(),globals())
117
+ return preprocessor
118
+
119
+ def get_runtimedata(runtimedata_s3_filename="runtime_data.json"):
120
+
121
+ s3 = boto3.resource('s3')
122
+ obj = s3.Object("$bucket_name", "$unique_model_id"+"/"+runtimedata_s3_filename)
123
+ runtime_data = json.load(obj.get()['Body'])
124
+
125
+ return runtime_data
126
+
127
+
128
+ runtime_data = get_runtimedata(runtimedata_s3_filename="runtime_data.json")
129
+
130
+ preprocessor_type = runtime_data["runtime_preprocessor"]
131
+
132
+ runtime_model = runtime_data["runtime_model"]["name"]
133
+
134
+ # Load model
135
+ model = get_model_onnx(runtimemodel_s3_filename='runtime_model.onnx')
136
+
137
+ # Load preprocessor
138
+ preprocessor = get_preprocessor(preprocessor_s3_filename="runtime_preprocessor.zip")
139
+
140
+
141
+ def predict(event,model,preprocessor):
142
+ import six
143
+
144
+ body = event["body"]
145
+ labels = $labels
146
+ if isinstance(event["body"], six.string_types):
147
+ body = json.loads(event["body"])
148
+ print(body["data"])
149
+ bodydata = pd.DataFrame.from_dict(body["data"])
150
+ else:
151
+ print(body["data"])
152
+ bodydata = pd.DataFrame.from_dict(body["data"])
153
+ print(bodydata)
154
+
155
+ def predict_classes(x): # adjusted from keras github code
156
+ if len(x.shape) == 2:
157
+ index = x.argmax(axis=-1)
158
+ return list(map(lambda x: labels[x], index))
159
+ else:
160
+ return list(x)
161
+ input_name = model.get_inputs()[0].name
162
+ input_data = preprocessor(bodydata).astype('float32') #needs to be float32
163
+ res = model.run(None, {input_name: input_data})
164
+ prob = res[0]
165
+ print(prob)
166
+
167
+ prediction = predict_classes(prob)
168
+
169
+ # pyspark returns np.longlong which is not json serializable.
170
+ if len(prediction) and type(prediction[0]) == np.longlong:
171
+ prediction = [int(x) for x in prediction]
172
+
173
+ return prediction
174
+
175
+ def handler(event, context):
176
+ result = predict(event,model, preprocessor)
177
+ return {
178
+ "statusCode": 200,
179
+ "headers": {
180
+ "Access-Control-Allow-Origin": "*",
181
+ "Access-Control-Allow-Credentials": True,
182
+ "Allow": "GET, OPTIONS, POST",
183
+ "Access-Control-Allow-Methods": "GET, OPTIONS, POST",
184
+ "Access-Control-Allow-Headers": "*"
185
+ },
186
+ "body": json.dumps(result)
187
+ }
@@ -0,0 +1,178 @@
1
+ #Tabular Regression Prediction Runtime Code
2
+
3
+ import boto3
4
+ import pandas as pd
5
+ import os
6
+ import numpy as np
7
+ import onnxruntime as rt
8
+ import json
9
+
10
+ def get_model_onnx(runtimemodel_s3_filename="runtime_model.onnx"):
11
+ s3 = boto3.resource('s3')
12
+ obj = s3.Object("$bucket_name", "$unique_model_id" +
13
+ "/runtime_model.onnx")
14
+ model = rt.InferenceSession(obj.get()['Body'].read())
15
+ return model
16
+
17
+ def _get_pyspark_modules():
18
+ import pyspark
19
+ import pyspark.ml
20
+ import re
21
+
22
+ pyspark_modules = ['ml', 'ml.feature', 'ml.classification', 'ml.clustering', 'ml.regression']
23
+
24
+ models_modules_dict = {}
25
+
26
+ for i in pyspark_modules:
27
+ models_list = [j for j in dir(eval('pyspark.'+i, {'pyspark': pyspark})) if callable(getattr(eval('pyspark.'+i, {'pyspark': pyspark}), j))]
28
+ models_list = [j for j in models_list if re.match('^[A-Z]', j)]
29
+
30
+ for k in models_list:
31
+ models_modules_dict[k] = 'pyspark.'+i
32
+
33
+ return models_modules_dict
34
+
35
+ def pyspark_model_from_string(model_type):
36
+ import importlib
37
+
38
+ models_modules_dict = _get_pyspark_modules()
39
+ module = models_modules_dict[model_type]
40
+ model_class = getattr(importlib.import_module(module), model_type)
41
+ return model_class
42
+
43
+ def get_preprocessor(preprocessor_s3_filename="runtime_preprocessor.zip"):
44
+ import os
45
+ import pickle
46
+ import tempfile
47
+ from io import BytesIO
48
+ from pathlib import Path
49
+ from zipfile import ZipFile
50
+
51
+ #create temporary folder
52
+ temp_dir = tempfile.gettempdir()
53
+
54
+ # there are some other zip files on temp_dir that might affect import process
55
+ temp_dir = os.path.join(temp_dir, "$unique_model_id")
56
+ os.makedirs(temp_dir, exist_ok=True)
57
+
58
+ s3 = boto3.resource("s3")
59
+ bucket = s3.Bucket("$bucket_name")
60
+
61
+ zip_obj = s3.Object(bucket_name="$bucket_name",
62
+ key="$unique_model_id/runtime_preprocessor.zip")
63
+ buffer = BytesIO(zip_obj.get()["Body"].read())
64
+ z = ZipFile(buffer)
65
+ # Extract all the contents of zip file in temp directory
66
+ z.extractall(temp_dir)
67
+
68
+ # Then import all pkl files you want from bucket (need to generate this list from
69
+ # function globals
70
+ pickle_file_list = []
71
+ zip_file_list = []
72
+ for file in os.listdir(temp_dir):
73
+ if file.endswith(".pkl"):
74
+ pickle_file_list.append(os.path.join(temp_dir, file))
75
+ if file.endswith(".zip"):
76
+ zip_file_list.append(os.path.join(temp_dir, file))
77
+
78
+ for i in pickle_file_list:
79
+ objectname = str(os.path.basename(i)).replace(".pkl", "")
80
+ objects = { objectname: "" }
81
+ globals()[objectname] = pickle.load(open(str(i), "rb"))
82
+
83
+ # Need spark session and context to instantiate model object
84
+ # zip_file_list is only used by pyspark
85
+ if len(zip_file_list):
86
+ from pyspark.sql import SparkSession
87
+
88
+ spark = SparkSession \
89
+ .builder \
90
+ .appName('Pyspark Model') \
91
+ .getOrCreate()
92
+
93
+ for i in zip_file_list:
94
+ objectnames = str(os.path.basename(i)).replace(".zip", "").split("__")
95
+ dir_path = i.replace(".zip", "")
96
+ Path(dir_path).mkdir(parents=True, exist_ok=True)
97
+
98
+ # Create a ZipFile Object and load module.zip in it
99
+ with ZipFile(i, 'r') as zipObj:
100
+ # Extract all the contents of zip file in current directory
101
+ zipObj.extractall(dir_path)
102
+
103
+ preprocessor_type = objectnames[0].split("_")[0]
104
+ objectname = objectnames[1]
105
+ preprocessor_class = pyspark_model_from_string(preprocessor_type)
106
+ if preprocessor_type == "PipelineModel":
107
+ print(preprocessor_class)
108
+ preprocessor_model = preprocessor_class(stages=None)
109
+ else:
110
+ preprocessor_model = preprocessor_class()
111
+
112
+ preprocessor_model = preprocessor_model.load(dir_path)
113
+ globals()[objectname] = preprocessor_model
114
+
115
+ # First import preprocessor function to session from preprocessor.py
116
+ exec(open(os.path.join(temp_dir, 'preprocessor.py')).read(),globals())
117
+ return preprocessor
118
+
119
+ def get_runtimedata(runtimedata_s3_filename="runtime_data.json"):
120
+
121
+ s3 = boto3.resource('s3')
122
+ obj = s3.Object("$bucket_name", "$unique_model_id"+"/"+runtimedata_s3_filename)
123
+ runtime_data = json.load(obj.get()['Body'])
124
+
125
+ return runtime_data
126
+
127
+
128
+ runtime_data=get_runtimedata(runtimedata_s3_filename="runtime_data.json")
129
+
130
+ preprocessor_type=runtime_data["runtime_preprocessor"]
131
+
132
+ runtime_model=runtime_data["runtime_model"]["name"]
133
+
134
+ # Load model
135
+ model=get_model_onnx(runtimemodel_s3_filename='runtime_model.onnx')
136
+
137
+ # Load preprocessor
138
+ preprocessor=get_preprocessor(preprocessor_s3_filename="runtime_preprocessor.zip")
139
+
140
+
141
+ def predict(event,model,preprocessor):
142
+ body = event["body"]
143
+ import six
144
+ if isinstance(event["body"], six.string_types):
145
+ body = json.loads(event["body"])
146
+ print(body["data"])
147
+ bodydata = pd.DataFrame.from_dict(body["data"])
148
+ else:
149
+ print(body["data"])
150
+ bodydata = pd.DataFrame.from_dict(body["data"])
151
+ print(bodydata)
152
+
153
+ input_name = model.get_inputs()[0].name
154
+ print(input_name)
155
+
156
+ #Preprocess data
157
+ input_data = preprocessor(bodydata).astype('float32') #needs to be float32
158
+ print(input_data)
159
+
160
+ # Generate prediction using preprocessed input data
161
+
162
+ res=model.run(None, {input_name: input_data})
163
+
164
+ result = res[0].tolist()[0]
165
+
166
+ return result
167
+
168
+ def handler(event, context):
169
+ result = predict(event,model,preprocessor)
170
+ return {"statusCode": 200,
171
+ "headers": {
172
+ "Access-Control-Allow-Origin" : "*",
173
+ "Access-Control-Allow-Credentials": True,
174
+ "Allow" : "GET, OPTIONS, POST",
175
+ "Access-Control-Allow-Methods" : "GET, OPTIONS, POST",
176
+ "Access-Control-Allow-Headers" : "*"
177
+ },
178
+ "body": json.dumps(result)}