Skip to content

Commit 25c678d

Browse files
author
Raymond Liu
committed
add integration tests for decoupling from model registry
1 parent ecb60fc commit 25c678d

File tree

2 files changed

+142
-9
lines changed

2 files changed

+142
-9
lines changed

src/sagemaker/inference_recommender/inference_recommender_mixin.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,22 +148,22 @@ def right_size(
148148

149149
self._init_sagemaker_session_if_does_not_exist()
150150

151-
temp_model_name = None
151+
self.temp_model_name = None
152152
if isinstance(self, sagemaker.model.Model) and not isinstance(self, sagemaker.model.ModelPackage):
153153

154154
unique_tail = uuid.uuid4()
155-
temp_model_name = "SMPYTHONSDK-" + str(unique_tail)
155+
self.temp_model_name = "SMPYTHONSDK-" + str(unique_tail)
156156

157157
create_model_args = dict(
158-
name=temp_model_name,
158+
name=self.temp_model_name,
159159
role=self.role,
160160
container_defs=None,
161161
primary_container=self.prepare_container_def(),
162162
vpc_config=self.vpc_config,
163163
enable_network_isolation=self.enable_network_isolation()
164164
)
165-
print(f"Creating temporary model with name: {temp_model_name}" \
166-
"for Inference Recommender.", flush=True)
165+
print(f"Creating temporary model with name: {self.temp_model_name}" \
166+
" for Inference Recommender.", flush=True)
167167
self.sagemaker_session.create_model(**create_model_args)
168168
print("Temporary model created. Start to run Inference Recommender...", flush=True)
169169

@@ -173,7 +173,7 @@ def right_size(
173173
job_name=job_name,
174174
job_type=job_type,
175175
job_duration_in_seconds=job_duration_in_seconds,
176-
model_name=temp_model_name,
176+
model_name=self.temp_model_name,
177177
model_package_version_arn=getattr(self, "model_package_arn", None),
178178
framework=framework,
179179
framework_version=framework_version,
@@ -195,10 +195,11 @@ def right_size(
195195
"InferenceRecommendations"
196196
)
197197

198-
if temp_model_name is not None:
199-
print(f"Deleting temporary model with name: {temp_model_name}" \
198+
if self.temp_model_name is not None:
199+
print(f"Deleting temporary model with name: {self.temp_model_name} " \
200200
"for Inference Recommender.", flush=True)
201-
self.sagemaker_session.delete_model(temp_model_name)
201+
self.sagemaker_session.delete_model(self.temp_model_name)
202+
self.temp_model_name = None
202203
print("Delete complete.")
203204
return self
204205

tests/integ/test_inference_recommender.py

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,95 @@ def advanced_right_sized_model(sagemaker_session, cpu_instance_type):
154154
)
155155

156156

157+
@pytest.fixture(scope="module")
158+
def default_right_sized_unregistered_model(sagemaker_session, cpu_instance_type):
159+
with timeout(minutes=45):
160+
try:
161+
ir_job_name = unique_name_from_base("test-ir-right-size-job-name")
162+
model_data = sagemaker_session.upload_data(path=IR_SKLEARN_MODEL)
163+
payload_data = sagemaker_session.upload_data(path=IR_SKLEARN_PAYLOAD)
164+
165+
iam_client = sagemaker_session.boto_session.client("iam")
166+
role_arn = iam_client.get_role(RoleName="SageMakerRole")["Role"]["Arn"]
167+
168+
sklearn_model = SKLearnModel(
169+
model_data=model_data,
170+
role=role_arn,
171+
entry_point=IR_SKLEARN_ENTRY_POINT,
172+
framework_version=IR_SKLEARN_FRAMEWORK_VERSION,
173+
)
174+
175+
return (
176+
sklearn_model.right_size(
177+
job_name=ir_job_name,
178+
sample_payload_url=payload_data,
179+
supported_content_types=IR_SKLEARN_CONTENT_TYPE,
180+
supported_instance_types=[cpu_instance_type],
181+
framework=IR_SKLEARN_FRAMEWORK,
182+
log_level="Quiet",
183+
),
184+
ir_job_name,
185+
)
186+
except Exception:
187+
sagemaker_session.delete_model(
188+
ModelName=sklearn_model.temp_model_name
189+
)
190+
191+
192+
@pytest.fixture(scope="module")
193+
def advanced_right_sized_unregistered_model(sagemaker_session, cpu_instance_type):
194+
with timeout(minutes=45):
195+
try:
196+
model_data = sagemaker_session.upload_data(path=IR_SKLEARN_MODEL)
197+
payload_data = sagemaker_session.upload_data(path=IR_SKLEARN_PAYLOAD)
198+
199+
iam_client = sagemaker_session.boto_session.client("iam")
200+
role_arn = iam_client.get_role(RoleName="SageMakerRole")["Role"]["Arn"]
201+
202+
sklearn_model = SKLearnModel(
203+
model_data=model_data,
204+
role=role_arn,
205+
entry_point=IR_SKLEARN_ENTRY_POINT,
206+
framework_version=IR_SKLEARN_FRAMEWORK_VERSION,
207+
)
208+
209+
hyperparameter_ranges = [
210+
{
211+
"instance_types": CategoricalParameter([cpu_instance_type]),
212+
"TEST_PARAM": CategoricalParameter(
213+
["TEST_PARAM_VALUE_1", "TEST_PARAM_VALUE_2"]
214+
),
215+
}
216+
]
217+
218+
phases = [
219+
Phase(duration_in_seconds=300, initial_number_of_users=2, spawn_rate=2),
220+
Phase(duration_in_seconds=300, initial_number_of_users=14, spawn_rate=2),
221+
]
222+
223+
model_latency_thresholds = [
224+
ModelLatencyThreshold(percentile="P95", value_in_milliseconds=100)
225+
]
226+
227+
return sklearn_model.right_size(
228+
sample_payload_url=payload_data,
229+
supported_content_types=IR_SKLEARN_CONTENT_TYPE,
230+
framework=IR_SKLEARN_FRAMEWORK,
231+
job_duration_in_seconds=3600,
232+
hyperparameter_ranges=hyperparameter_ranges,
233+
phases=phases,
234+
model_latency_thresholds=model_latency_thresholds,
235+
max_invocations=100,
236+
max_tests=5,
237+
max_parallel_tests=5,
238+
log_level="Quiet",
239+
)
240+
241+
except Exception:
242+
sagemaker_session.delete_model(
243+
ModelName=sklearn_model.temp_model_name
244+
)
245+
157246
@pytest.mark.slow_test
158247
def test_default_right_size_and_deploy_registered_model_sklearn(
159248
default_right_sized_model, sagemaker_session
@@ -175,6 +264,49 @@ def test_default_right_size_and_deploy_registered_model_sklearn(
175264
predictor.delete_model()
176265
predictor.delete_endpoint()
177266

267+
@pytest.mark.slow_test
268+
def test_default_right_size_and_deploy_unregistered_model_sklearn(
269+
default_right_sized_unregistered_model, sagemaker_session
270+
):
271+
endpoint_name = unique_name_from_base("test-ir-right-size-default-unregistered-sklearn")
272+
273+
right_size_model, ir_job_name = default_right_sized_unregistered_model
274+
with timeout(minutes=45):
275+
try:
276+
right_size_model.predictor_cls = SKLearnPredictor
277+
predictor = right_size_model.deploy(endpoint_name=endpoint_name)
278+
279+
payload = pd.read_csv(IR_SKLEARN_DATA, header=None)
280+
281+
inference = predictor.predict(payload)
282+
assert inference is not None
283+
assert 26 == len(inference)
284+
finally:
285+
predictor.delete_model()
286+
predictor.delete_endpoint()
287+
288+
@pytest.mark.slow_test
289+
def test_advanced_right_size_and_deploy_unregistered_model_sklearn(
290+
advanced_right_sized_unregistered_model, sagemaker_session
291+
):
292+
endpoint_name = unique_name_from_base("test-ir-right-size-advanced-sklearn")
293+
294+
right_size_model = advanced_right_sized_unregistered_model
295+
with timeout(minutes=45):
296+
try:
297+
right_size_model.predictor_cls = SKLearnPredictor
298+
predictor = right_size_model.deploy(endpoint_name=endpoint_name)
299+
300+
payload = pd.read_csv(IR_SKLEARN_DATA, header=None)
301+
302+
inference = predictor.predict(payload)
303+
assert inference is not None
304+
assert 26 == len(inference)
305+
finally:
306+
predictor.delete_model()
307+
predictor.delete_endpoint()
308+
309+
178310

179311
@pytest.mark.slow_test
180312
def test_advanced_right_size_and_deploy_registered_model_sklearn(

0 commit comments

Comments
 (0)