16
16
17
17
import pytest
18
18
19
+ from sagemaker .model import Model
19
20
from sagemaker .sklearn .model import SKLearnModel , SKLearnPredictor
20
21
from sagemaker .utils import unique_name_from_base
21
22
from tests .integ import DATA_DIR
@@ -154,6 +155,120 @@ def advanced_right_sized_model(sagemaker_session, cpu_instance_type):
154
155
)
155
156
156
157
158
+ @pytest .fixture (scope = "module" )
159
+ def default_right_sized_unregistered_model (sagemaker_session , cpu_instance_type ):
160
+ with timeout (minutes = 45 ):
161
+ try :
162
+ ir_job_name = unique_name_from_base ("test-ir-right-size-job-name" )
163
+ model_data = sagemaker_session .upload_data (path = IR_SKLEARN_MODEL )
164
+ payload_data = sagemaker_session .upload_data (path = IR_SKLEARN_PAYLOAD )
165
+
166
+ iam_client = sagemaker_session .boto_session .client ("iam" )
167
+ role_arn = iam_client .get_role (RoleName = "SageMakerRole" )["Role" ]["Arn" ]
168
+
169
+ sklearn_model = SKLearnModel (
170
+ model_data = model_data ,
171
+ role = role_arn ,
172
+ entry_point = IR_SKLEARN_ENTRY_POINT ,
173
+ framework_version = IR_SKLEARN_FRAMEWORK_VERSION ,
174
+ )
175
+
176
+ return (
177
+ sklearn_model .right_size (
178
+ job_name = ir_job_name ,
179
+ sample_payload_url = payload_data ,
180
+ supported_content_types = IR_SKLEARN_CONTENT_TYPE ,
181
+ supported_instance_types = [cpu_instance_type ],
182
+ framework = IR_SKLEARN_FRAMEWORK ,
183
+ log_level = "Quiet" ,
184
+ ),
185
+ ir_job_name ,
186
+ )
187
+ except Exception :
188
+ sagemaker_session .delete_model (ModelName = sklearn_model .name )
189
+
190
+
191
+ @pytest .fixture (scope = "module" )
192
+ def advanced_right_sized_unregistered_model (sagemaker_session , cpu_instance_type ):
193
+ with timeout (minutes = 45 ):
194
+ try :
195
+ model_data = sagemaker_session .upload_data (path = IR_SKLEARN_MODEL )
196
+ payload_data = sagemaker_session .upload_data (path = IR_SKLEARN_PAYLOAD )
197
+
198
+ iam_client = sagemaker_session .boto_session .client ("iam" )
199
+ role_arn = iam_client .get_role (RoleName = "SageMakerRole" )["Role" ]["Arn" ]
200
+
201
+ sklearn_model = SKLearnModel (
202
+ model_data = model_data ,
203
+ role = role_arn ,
204
+ entry_point = IR_SKLEARN_ENTRY_POINT ,
205
+ framework_version = IR_SKLEARN_FRAMEWORK_VERSION ,
206
+ )
207
+
208
+ hyperparameter_ranges = [
209
+ {
210
+ "instance_types" : CategoricalParameter ([cpu_instance_type ]),
211
+ "TEST_PARAM" : CategoricalParameter (
212
+ ["TEST_PARAM_VALUE_1" , "TEST_PARAM_VALUE_2" ]
213
+ ),
214
+ }
215
+ ]
216
+
217
+ phases = [
218
+ Phase (duration_in_seconds = 300 , initial_number_of_users = 2 , spawn_rate = 2 ),
219
+ Phase (duration_in_seconds = 300 , initial_number_of_users = 14 , spawn_rate = 2 ),
220
+ ]
221
+
222
+ model_latency_thresholds = [
223
+ ModelLatencyThreshold (percentile = "P95" , value_in_milliseconds = 100 )
224
+ ]
225
+
226
+ return sklearn_model .right_size (
227
+ sample_payload_url = payload_data ,
228
+ supported_content_types = IR_SKLEARN_CONTENT_TYPE ,
229
+ framework = IR_SKLEARN_FRAMEWORK ,
230
+ job_duration_in_seconds = 3600 ,
231
+ hyperparameter_ranges = hyperparameter_ranges ,
232
+ phases = phases ,
233
+ model_latency_thresholds = model_latency_thresholds ,
234
+ max_invocations = 100 ,
235
+ max_tests = 5 ,
236
+ max_parallel_tests = 5 ,
237
+ log_level = "Quiet" ,
238
+ )
239
+
240
+ except Exception :
241
+ sagemaker_session .delete_model (ModelName = sklearn_model .name )
242
+
243
+
244
+ @pytest .fixture (scope = "module" )
245
+ def default_right_sized_unregistered_base_model (sagemaker_session , cpu_instance_type ):
246
+ with timeout (minutes = 45 ):
247
+ try :
248
+ ir_job_name = unique_name_from_base ("test-ir-right-size-job-name" )
249
+ model_data = sagemaker_session .upload_data (path = IR_SKLEARN_MODEL )
250
+ payload_data = sagemaker_session .upload_data (path = IR_SKLEARN_PAYLOAD )
251
+
252
+ iam_client = sagemaker_session .boto_session .client ("iam" )
253
+ role_arn = iam_client .get_role (RoleName = "SageMakerRole" )["Role" ]["Arn" ]
254
+
255
+ model = Model (model_data = model_data , role = role_arn , entry_point = IR_SKLEARN_ENTRY_POINT )
256
+
257
+ return (
258
+ model .right_size (
259
+ job_name = ir_job_name ,
260
+ sample_payload_url = payload_data ,
261
+ supported_content_types = IR_SKLEARN_CONTENT_TYPE ,
262
+ supported_instance_types = [cpu_instance_type ],
263
+ framework = IR_SKLEARN_FRAMEWORK ,
264
+ log_level = "Quiet" ,
265
+ ),
266
+ ir_job_name ,
267
+ )
268
+ except Exception :
269
+ sagemaker_session .delete_model (ModelName = model .name )
270
+
271
+
157
272
@pytest .mark .slow_test
158
273
def test_default_right_size_and_deploy_registered_model_sklearn (
159
274
default_right_sized_model , sagemaker_session
@@ -176,6 +291,72 @@ def test_default_right_size_and_deploy_registered_model_sklearn(
176
291
predictor .delete_endpoint ()
177
292
178
293
294
+ @pytest .mark .slow_test
295
+ def test_default_right_size_and_deploy_unregistered_model_sklearn (
296
+ default_right_sized_unregistered_model , sagemaker_session
297
+ ):
298
+ endpoint_name = unique_name_from_base ("test-ir-right-size-default-unregistered-sklearn" )
299
+
300
+ right_size_model , ir_job_name = default_right_sized_unregistered_model
301
+ with timeout (minutes = 45 ):
302
+ try :
303
+ right_size_model .predictor_cls = SKLearnPredictor
304
+ predictor = right_size_model .deploy (endpoint_name = endpoint_name )
305
+
306
+ payload = pd .read_csv (IR_SKLEARN_DATA , header = None )
307
+
308
+ inference = predictor .predict (payload )
309
+ assert inference is not None
310
+ assert 26 == len (inference )
311
+ finally :
312
+ predictor .delete_model ()
313
+ predictor .delete_endpoint ()
314
+
315
+
316
+ @pytest .mark .slow_test
317
+ def test_default_right_size_and_deploy_unregistered_base_model (
318
+ default_right_sized_unregistered_base_model , sagemaker_session
319
+ ):
320
+ endpoint_name = unique_name_from_base ("test-ir-right-size-default-unregistered-base" )
321
+
322
+ right_size_model , ir_job_name = default_right_sized_unregistered_base_model
323
+ with timeout (minutes = 45 ):
324
+ try :
325
+ right_size_model .predictor_cls = SKLearnPredictor
326
+ predictor = right_size_model .deploy (endpoint_name = endpoint_name )
327
+
328
+ payload = pd .read_csv (IR_SKLEARN_DATA , header = None )
329
+
330
+ inference = predictor .predict (payload )
331
+ assert inference is not None
332
+ assert 26 == len (inference )
333
+ finally :
334
+ predictor .delete_model ()
335
+ predictor .delete_endpoint ()
336
+
337
+
338
+ @pytest .mark .slow_test
339
+ def test_advanced_right_size_and_deploy_unregistered_model_sklearn (
340
+ advanced_right_sized_unregistered_model , sagemaker_session
341
+ ):
342
+ endpoint_name = unique_name_from_base ("test-ir-right-size-advanced-sklearn" )
343
+
344
+ right_size_model = advanced_right_sized_unregistered_model
345
+ with timeout (minutes = 45 ):
346
+ try :
347
+ right_size_model .predictor_cls = SKLearnPredictor
348
+ predictor = right_size_model .deploy (endpoint_name = endpoint_name )
349
+
350
+ payload = pd .read_csv (IR_SKLEARN_DATA , header = None )
351
+
352
+ inference = predictor .predict (payload )
353
+ assert inference is not None
354
+ assert 26 == len (inference )
355
+ finally :
356
+ predictor .delete_model ()
357
+ predictor .delete_endpoint ()
358
+
359
+
179
360
@pytest .mark .slow_test
180
361
def test_advanced_right_size_and_deploy_registered_model_sklearn (
181
362
advanced_right_sized_model , sagemaker_session
0 commit comments