From 7f86d3da4d72db646039d534b0e05acc4ed29863 Mon Sep 17 00:00:00 2001 From: djarpin Date: Sat, 23 Dec 2017 19:18:25 -0800 Subject: [PATCH 1/3] Added: print out billable seconds after training completes --- src/sagemaker/session.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sagemaker/session.py b/src/sagemaker/session.py index cd6f222d42..f6feef1e8b 100644 --- a/src/sagemaker/session.py +++ b/src/sagemaker/session.py @@ -648,6 +648,9 @@ def logs_for_job(self, job_name, wait=False, poll=5): # noqa: C901 - suppress c if dot: print() print('===== Job Complete =====') + # Customers are not billed for hardware provisioning, so billable time is less than total time + billable_time = (description['TrainingEndTime'] - description['TrainingStartTime']) * instance_count + print('Billable seconds:', int(billable_time.total_seconds()) + 1) def container_def(image, model_data_url=None, env=None): From f8806b07ff5168edbfed7b2daae2e052f17907d2 Mon Sep 17 00:00:00 2001 From: djarpin Date: Sat, 17 Feb 2018 22:09:24 -0800 Subject: [PATCH 2/3] Fixed: test_session.py to pass unit tests --- tests/unit/test_session.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/unit/test_session.py b/tests/unit/test_session.py index 4251ffcab5..75d58e4031 100644 --- a/tests/unit/test_session.py +++ b/tests/unit/test_session.py @@ -16,6 +16,7 @@ from mock import Mock, patch, call import sagemaker from sagemaker import s3_input, Session, get_execution_role +import datetime from botocore.exceptions import ClientError @@ -177,6 +178,11 @@ def test_s3_input_all_arguments(): {'ModelArtifacts': { 'S3ModelArtifacts': S3_OUTPUT + '/model/model.tar.gz' }}) +# TrainingStartTime and TrainingEndTime are for billable seconds calculation +COMPLETED_DESCRIBE_JOB_RESULT.update( + {'TrainingStartTime': datetime.datetime(2018, 2, 17, 7, 15, 0, 103000, tzinfo=tzlocal())}) +COMPLETED_DESCRIBE_JOB_RESULT.update( + {'TrainingEndTime': datetime.datetime(2018, 2, 17, 7, 19, 34, 953000, tzinfo=tzlocal())}) IN_PROGRESS_DESCRIBE_JOB_RESULT = dict(DEFAULT_EXPECTED_TRAIN_JOB_ARGS) IN_PROGRESS_DESCRIBE_JOB_RESULT.update({'TrainingJobStatus': 'InProgress'}) From 8df1fd3810a60b20fd26db67eae720c1ed48357c Mon Sep 17 00:00:00 2001 From: djarpin Date: Sat, 17 Feb 2018 22:17:42 -0800 Subject: [PATCH 3/3] Fixed: removed offending tzlocal() --- tests/unit/test_session.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_session.py b/tests/unit/test_session.py index 75d58e4031..0256b54569 100644 --- a/tests/unit/test_session.py +++ b/tests/unit/test_session.py @@ -180,9 +180,9 @@ def test_s3_input_all_arguments(): }}) # TrainingStartTime and TrainingEndTime are for billable seconds calculation COMPLETED_DESCRIBE_JOB_RESULT.update( - {'TrainingStartTime': datetime.datetime(2018, 2, 17, 7, 15, 0, 103000, tzinfo=tzlocal())}) + {'TrainingStartTime': datetime.datetime(2018, 2, 17, 7, 15, 0, 103000)}) COMPLETED_DESCRIBE_JOB_RESULT.update( - {'TrainingEndTime': datetime.datetime(2018, 2, 17, 7, 19, 34, 953000, tzinfo=tzlocal())}) + {'TrainingEndTime': datetime.datetime(2018, 2, 17, 7, 19, 34, 953000)}) IN_PROGRESS_DESCRIBE_JOB_RESULT = dict(DEFAULT_EXPECTED_TRAIN_JOB_ARGS) IN_PROGRESS_DESCRIBE_JOB_RESULT.update({'TrainingJobStatus': 'InProgress'})