S3 Estimator and Image Classification - #71

Closed
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master
Closed

S3 Estimator and Image Classification#71
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master

Conversation

@ragavvenkatesan

Copy link
Copy Markdown

This PR sets up the SDK for S3 algorithms to come in and this brings in image classification.

Comment thread.gitignore Outdated
**/.DS_Store
venv/
*.rec
*~ No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this symbol?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was added from a sync pull I made on the original repo. Not mine.

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

"""Base class for Amazon first-party Estimator implementations. This class isn't intended

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate doc

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo/

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These validations are gone. The pull request itself is stating there are conflicts, can you please update your branch to fix the conflicts?

Refer to this PR: 54b3830#diff-0bb270a0ed6827421dc5669020eb6427 to check what the changes to the hyperparameters are.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@orchidmajumderorchidmajumder left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly looked into syntactic issues. Need comments on semantics from Owen/Marcio.

@ragavvenkatesanragavvenkatesan left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iquintero Conflicts removed.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The unit tests failed :( It looks like there are some import errors and possibly flake8 errors too.

More importantly, please look into the changes to the hyperparameter class as the type validations are no longer required and instead you should declare the data type. I have left an example below.

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please maintain the import order:

1.- python built in libraries
2.- 3rd party imports
3.- local library imports (from sagemaker...)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

mini_batch_size = hp('mini_batch_size', (validation.isint, validation.gt(0)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please look at #54 we intentionally removed these type validations: isint() isbool() etc. In favor of declaring a specific type for the hp.

So this should be

hp('mini_batch_size', validation.gt(0), data_type=int)

This applies to every hp declaration in this PR.

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are a lot of cases where the alignment is not consistent. I didn't want to list every single one but please go through it and review them.

Some examples are in the docstrings where each line is aligned differently. In some cases you have:

param_name (str)

some others are:

param_name ...(long space..) (str)

The original comments have not been addressed yet either. Everything is minor changes but they do add up. Once you change that this should be ready to merge.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....



class record_deserializer(object):
class file_to_image_serializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keep one naming convention. FileToImageSerializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using this because the other methods are also in this convention.. Refer numpy_to_recod_serializer. ..

return payload


class record_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

RecordDeserializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I am maintaining this because of the other methods... refer
response_deseiralizer.

stream.close()


class response_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ResponseDeserializer

@@ -0,0 +1,65 @@
# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2017-2018

might as well :P

assert pca.num_components == 55


def test_s3_init(sagemaker_session):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all the tests you've added here should go on their own file. This way we have a better organized test suite. This existing file is meant to test the AmazonEstimator. you should create a file to test your new estimators. The content of the tests is fine just split it into its own file.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test I wrote tests the AmazonS3Estimator, which is on the same module as AmazonEstimator, which is why I think that this belongs on this file. I have a serparate test for image classification tests.

mini_batch_size (int or None): The size of each mini-batch to use when training. If None, a
default value will be used.
"""
default_mini_batch_size = 32

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why dont you make 32 the default value for mini_batch_size in the method signature?

def fit(self, s3set, mini_batch_size=32, distribution='ShardedByS3Key', **kwargs):

then you don't even have to do this whole thing. and you can just set it as
self.mini_batch_size = mini_batch_size

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two reasosn why: 1. Its a protocol used in the other alogrithms. 2. We want to make this a must supply parameter for user. If I assume a default and it fails because of memory error, it becomes a customer error, which is wrong.

The implementation of :meth:`~sagemaker.predictor.RealTimePredictor.predict` in this
`RealTimePredictor` requires a `x-image` as input.

``predict()`` returns """

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this sentence is also incomplete. predict() returns <>... ?

checkpoint_frequency = hp('checkpoint_frequency', (ge(1),),
'checkpoint_frequency should be an integer greater-than 1', int)
num_layers = hp('num_layers', (isin(18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110),),
'num_layers should be in the set [18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110]', int)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a suggestion but maybe putting these in ascending order would make it easier for users to reason about? Or is there a reason why they are seemingly in a random order?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I don't want to because this is a logic that is used in the docs also. There is a reason why it is in this order and users familiar with this algorithm will find this ordering comfortable.

@laurenyu

Copy link
Copy Markdown
Contributor

closing due to inactivity. feel free to reopen (or maybe create a new PR, given all the merge conflicts) if work on this resumes.

apacker pushed a commit to apacker/sagemaker-python-sdk that referenced this pull request Nov 15, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@ragavvenkatesan@laurenyu@iquintero@orchidmajumder@vrkhare
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

S3 Estimator and Image Classification - #71

Closed
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master
Closed

S3 Estimator and Image Classification#71
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master

Conversation

@ragavvenkatesan

Copy link
Copy Markdown

This PR sets up the SDK for S3 algorithms to come in and this brings in image classification.

Comment thread.gitignore Outdated
**/.DS_Store
venv/
*.rec
*~ No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this symbol?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was added from a sync pull I made on the original repo. Not mine.

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

"""Base class for Amazon first-party Estimator implementations. This class isn't intended

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate doc

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo/

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These validations are gone. The pull request itself is stating there are conflicts, can you please update your branch to fix the conflicts?

Refer to this PR: 54b3830#diff-0bb270a0ed6827421dc5669020eb6427 to check what the changes to the hyperparameters are.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@orchidmajumderorchidmajumder left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly looked into syntactic issues. Need comments on semantics from Owen/Marcio.

@ragavvenkatesanragavvenkatesan left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iquintero Conflicts removed.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The unit tests failed :( It looks like there are some import errors and possibly flake8 errors too.

More importantly, please look into the changes to the hyperparameter class as the type validations are no longer required and instead you should declare the data type. I have left an example below.

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please maintain the import order:

1.- python built in libraries
2.- 3rd party imports
3.- local library imports (from sagemaker...)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

mini_batch_size = hp('mini_batch_size', (validation.isint, validation.gt(0)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please look at #54 we intentionally removed these type validations: isint() isbool() etc. In favor of declaring a specific type for the hp.

So this should be

hp('mini_batch_size', validation.gt(0), data_type=int)

This applies to every hp declaration in this PR.

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are a lot of cases where the alignment is not consistent. I didn't want to list every single one but please go through it and review them.

Some examples are in the docstrings where each line is aligned differently. In some cases you have:

param_name (str)

some others are:

param_name ...(long space..) (str)

The original comments have not been addressed yet either. Everything is minor changes but they do add up. Once you change that this should be ready to merge.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....



class record_deserializer(object):
class file_to_image_serializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keep one naming convention. FileToImageSerializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using this because the other methods are also in this convention.. Refer numpy_to_recod_serializer. ..

return payload


class record_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

RecordDeserializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I am maintaining this because of the other methods... refer
response_deseiralizer.

stream.close()


class response_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ResponseDeserializer

@@ -0,0 +1,65 @@
# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2017-2018

might as well :P

assert pca.num_components == 55


def test_s3_init(sagemaker_session):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all the tests you've added here should go on their own file. This way we have a better organized test suite. This existing file is meant to test the AmazonEstimator. you should create a file to test your new estimators. The content of the tests is fine just split it into its own file.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test I wrote tests the AmazonS3Estimator, which is on the same module as AmazonEstimator, which is why I think that this belongs on this file. I have a serparate test for image classification tests.

mini_batch_size (int or None): The size of each mini-batch to use when training. If None, a
default value will be used.
"""
default_mini_batch_size = 32

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why dont you make 32 the default value for mini_batch_size in the method signature?

def fit(self, s3set, mini_batch_size=32, distribution='ShardedByS3Key', **kwargs):

then you don't even have to do this whole thing. and you can just set it as
self.mini_batch_size = mini_batch_size

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two reasosn why: 1. Its a protocol used in the other alogrithms. 2. We want to make this a must supply parameter for user. If I assume a default and it fails because of memory error, it becomes a customer error, which is wrong.

The implementation of :meth:`~sagemaker.predictor.RealTimePredictor.predict` in this
`RealTimePredictor` requires a `x-image` as input.

``predict()`` returns """

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this sentence is also incomplete. predict() returns <>... ?

checkpoint_frequency = hp('checkpoint_frequency', (ge(1),),
'checkpoint_frequency should be an integer greater-than 1', int)
num_layers = hp('num_layers', (isin(18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110),),
'num_layers should be in the set [18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110]', int)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a suggestion but maybe putting these in ascending order would make it easier for users to reason about? Or is there a reason why they are seemingly in a random order?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I don't want to because this is a logic that is used in the docs also. There is a reason why it is in this order and users familiar with this algorithm will find this ordering comfortable.

@laurenyu

Copy link
Copy Markdown
Contributor

closing due to inactivity. feel free to reopen (or maybe create a new PR, given all the merge conflicts) if work on this resumes.

apacker pushed a commit to apacker/sagemaker-python-sdk that referenced this pull request Nov 15, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@ragavvenkatesan@laurenyu@iquintero@orchidmajumder@vrkhare
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

S3 Estimator and Image Classification - #71

Closed
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master
Closed

S3 Estimator and Image Classification#71
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master

Conversation

@ragavvenkatesan

Copy link
Copy Markdown

This PR sets up the SDK for S3 algorithms to come in and this brings in image classification.

Comment thread.gitignore Outdated
**/.DS_Store
venv/
*.rec
*~ No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this symbol?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was added from a sync pull I made on the original repo. Not mine.

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

"""Base class for Amazon first-party Estimator implementations. This class isn't intended

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate doc

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo/

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These validations are gone. The pull request itself is stating there are conflicts, can you please update your branch to fix the conflicts?

Refer to this PR: 54b3830#diff-0bb270a0ed6827421dc5669020eb6427 to check what the changes to the hyperparameters are.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@orchidmajumderorchidmajumder left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly looked into syntactic issues. Need comments on semantics from Owen/Marcio.

@ragavvenkatesanragavvenkatesan left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iquintero Conflicts removed.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The unit tests failed :( It looks like there are some import errors and possibly flake8 errors too.

More importantly, please look into the changes to the hyperparameter class as the type validations are no longer required and instead you should declare the data type. I have left an example below.

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please maintain the import order:

1.- python built in libraries
2.- 3rd party imports
3.- local library imports (from sagemaker...)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

mini_batch_size = hp('mini_batch_size', (validation.isint, validation.gt(0)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please look at #54 we intentionally removed these type validations: isint() isbool() etc. In favor of declaring a specific type for the hp.

So this should be

hp('mini_batch_size', validation.gt(0), data_type=int)

This applies to every hp declaration in this PR.

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are a lot of cases where the alignment is not consistent. I didn't want to list every single one but please go through it and review them.

Some examples are in the docstrings where each line is aligned differently. In some cases you have:

param_name (str)

some others are:

param_name ...(long space..) (str)

The original comments have not been addressed yet either. Everything is minor changes but they do add up. Once you change that this should be ready to merge.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....



class record_deserializer(object):
class file_to_image_serializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keep one naming convention. FileToImageSerializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using this because the other methods are also in this convention.. Refer numpy_to_recod_serializer. ..

return payload


class record_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

RecordDeserializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I am maintaining this because of the other methods... refer
response_deseiralizer.

stream.close()


class response_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ResponseDeserializer

@@ -0,0 +1,65 @@
# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2017-2018

might as well :P

assert pca.num_components == 55


def test_s3_init(sagemaker_session):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all the tests you've added here should go on their own file. This way we have a better organized test suite. This existing file is meant to test the AmazonEstimator. you should create a file to test your new estimators. The content of the tests is fine just split it into its own file.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test I wrote tests the AmazonS3Estimator, which is on the same module as AmazonEstimator, which is why I think that this belongs on this file. I have a serparate test for image classification tests.

mini_batch_size (int or None): The size of each mini-batch to use when training. If None, a
default value will be used.
"""
default_mini_batch_size = 32

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why dont you make 32 the default value for mini_batch_size in the method signature?

def fit(self, s3set, mini_batch_size=32, distribution='ShardedByS3Key', **kwargs):

then you don't even have to do this whole thing. and you can just set it as
self.mini_batch_size = mini_batch_size

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two reasosn why: 1. Its a protocol used in the other alogrithms. 2. We want to make this a must supply parameter for user. If I assume a default and it fails because of memory error, it becomes a customer error, which is wrong.

The implementation of :meth:`~sagemaker.predictor.RealTimePredictor.predict` in this
`RealTimePredictor` requires a `x-image` as input.

``predict()`` returns """

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this sentence is also incomplete. predict() returns <>... ?

checkpoint_frequency = hp('checkpoint_frequency', (ge(1),),
'checkpoint_frequency should be an integer greater-than 1', int)
num_layers = hp('num_layers', (isin(18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110),),
'num_layers should be in the set [18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110]', int)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a suggestion but maybe putting these in ascending order would make it easier for users to reason about? Or is there a reason why they are seemingly in a random order?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I don't want to because this is a logic that is used in the docs also. There is a reason why it is in this order and users familiar with this algorithm will find this ordering comfortable.

@laurenyu

Copy link
Copy Markdown
Contributor

closing due to inactivity. feel free to reopen (or maybe create a new PR, given all the merge conflicts) if work on this resumes.

apacker pushed a commit to apacker/sagemaker-python-sdk that referenced this pull request Nov 15, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@ragavvenkatesan@laurenyu@iquintero@orchidmajumder@vrkhare
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

S3 Estimator and Image Classification - #71

Closed
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master
Closed

S3 Estimator and Image Classification#71
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master

Conversation

@ragavvenkatesan

Copy link
Copy Markdown

This PR sets up the SDK for S3 algorithms to come in and this brings in image classification.

Comment thread.gitignore Outdated
**/.DS_Store
venv/
*.rec
*~ No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this symbol?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was added from a sync pull I made on the original repo. Not mine.

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

"""Base class for Amazon first-party Estimator implementations. This class isn't intended

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate doc

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo/

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These validations are gone. The pull request itself is stating there are conflicts, can you please update your branch to fix the conflicts?

Refer to this PR: 54b3830#diff-0bb270a0ed6827421dc5669020eb6427 to check what the changes to the hyperparameters are.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@orchidmajumderorchidmajumder left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly looked into syntactic issues. Need comments on semantics from Owen/Marcio.

@ragavvenkatesanragavvenkatesan left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iquintero Conflicts removed.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The unit tests failed :( It looks like there are some import errors and possibly flake8 errors too.

More importantly, please look into the changes to the hyperparameter class as the type validations are no longer required and instead you should declare the data type. I have left an example below.

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please maintain the import order:

1.- python built in libraries
2.- 3rd party imports
3.- local library imports (from sagemaker...)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

mini_batch_size = hp('mini_batch_size', (validation.isint, validation.gt(0)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please look at #54 we intentionally removed these type validations: isint() isbool() etc. In favor of declaring a specific type for the hp.

So this should be

hp('mini_batch_size', validation.gt(0), data_type=int)

This applies to every hp declaration in this PR.

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are a lot of cases where the alignment is not consistent. I didn't want to list every single one but please go through it and review them.

Some examples are in the docstrings where each line is aligned differently. In some cases you have:

param_name (str)

some others are:

param_name ...(long space..) (str)

The original comments have not been addressed yet either. Everything is minor changes but they do add up. Once you change that this should be ready to merge.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....



class record_deserializer(object):
class file_to_image_serializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keep one naming convention. FileToImageSerializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using this because the other methods are also in this convention.. Refer numpy_to_recod_serializer. ..

return payload


class record_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

RecordDeserializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I am maintaining this because of the other methods... refer
response_deseiralizer.

stream.close()


class response_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ResponseDeserializer

@@ -0,0 +1,65 @@
# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2017-2018

might as well :P

assert pca.num_components == 55


def test_s3_init(sagemaker_session):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all the tests you've added here should go on their own file. This way we have a better organized test suite. This existing file is meant to test the AmazonEstimator. you should create a file to test your new estimators. The content of the tests is fine just split it into its own file.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test I wrote tests the AmazonS3Estimator, which is on the same module as AmazonEstimator, which is why I think that this belongs on this file. I have a serparate test for image classification tests.

mini_batch_size (int or None): The size of each mini-batch to use when training. If None, a
default value will be used.
"""
default_mini_batch_size = 32

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why dont you make 32 the default value for mini_batch_size in the method signature?

def fit(self, s3set, mini_batch_size=32, distribution='ShardedByS3Key', **kwargs):

then you don't even have to do this whole thing. and you can just set it as
self.mini_batch_size = mini_batch_size

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two reasosn why: 1. Its a protocol used in the other alogrithms. 2. We want to make this a must supply parameter for user. If I assume a default and it fails because of memory error, it becomes a customer error, which is wrong.

The implementation of :meth:`~sagemaker.predictor.RealTimePredictor.predict` in this
`RealTimePredictor` requires a `x-image` as input.

``predict()`` returns """

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this sentence is also incomplete. predict() returns <>... ?

checkpoint_frequency = hp('checkpoint_frequency', (ge(1),),
'checkpoint_frequency should be an integer greater-than 1', int)
num_layers = hp('num_layers', (isin(18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110),),
'num_layers should be in the set [18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110]', int)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a suggestion but maybe putting these in ascending order would make it easier for users to reason about? Or is there a reason why they are seemingly in a random order?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I don't want to because this is a logic that is used in the docs also. There is a reason why it is in this order and users familiar with this algorithm will find this ordering comfortable.

@laurenyu

Copy link
Copy Markdown
Contributor

closing due to inactivity. feel free to reopen (or maybe create a new PR, given all the merge conflicts) if work on this resumes.

apacker pushed a commit to apacker/sagemaker-python-sdk that referenced this pull request Nov 15, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@ragavvenkatesan@laurenyu@iquintero@orchidmajumder@vrkhare
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

S3 Estimator and Image Classification - #71

Closed
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master
Closed

S3 Estimator and Image Classification#71
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master

Conversation

@ragavvenkatesan

Copy link
Copy Markdown

This PR sets up the SDK for S3 algorithms to come in and this brings in image classification.

Comment thread.gitignore Outdated
**/.DS_Store
venv/
*.rec
*~ No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this symbol?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was added from a sync pull I made on the original repo. Not mine.

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

"""Base class for Amazon first-party Estimator implementations. This class isn't intended

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate doc

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo/

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These validations are gone. The pull request itself is stating there are conflicts, can you please update your branch to fix the conflicts?

Refer to this PR: 54b3830#diff-0bb270a0ed6827421dc5669020eb6427 to check what the changes to the hyperparameters are.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@orchidmajumderorchidmajumder left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly looked into syntactic issues. Need comments on semantics from Owen/Marcio.

@ragavvenkatesanragavvenkatesan left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iquintero Conflicts removed.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The unit tests failed :( It looks like there are some import errors and possibly flake8 errors too.

More importantly, please look into the changes to the hyperparameter class as the type validations are no longer required and instead you should declare the data type. I have left an example below.

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please maintain the import order:

1.- python built in libraries
2.- 3rd party imports
3.- local library imports (from sagemaker...)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

mini_batch_size = hp('mini_batch_size', (validation.isint, validation.gt(0)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please look at #54 we intentionally removed these type validations: isint() isbool() etc. In favor of declaring a specific type for the hp.

So this should be

hp('mini_batch_size', validation.gt(0), data_type=int)

This applies to every hp declaration in this PR.

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are a lot of cases where the alignment is not consistent. I didn't want to list every single one but please go through it and review them.

Some examples are in the docstrings where each line is aligned differently. In some cases you have:

param_name (str)

some others are:

param_name ...(long space..) (str)

The original comments have not been addressed yet either. Everything is minor changes but they do add up. Once you change that this should be ready to merge.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....



class record_deserializer(object):
class file_to_image_serializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keep one naming convention. FileToImageSerializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using this because the other methods are also in this convention.. Refer numpy_to_recod_serializer. ..

return payload


class record_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

RecordDeserializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I am maintaining this because of the other methods... refer
response_deseiralizer.

stream.close()


class response_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ResponseDeserializer

@@ -0,0 +1,65 @@
# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2017-2018

might as well :P

assert pca.num_components == 55


def test_s3_init(sagemaker_session):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all the tests you've added here should go on their own file. This way we have a better organized test suite. This existing file is meant to test the AmazonEstimator. you should create a file to test your new estimators. The content of the tests is fine just split it into its own file.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test I wrote tests the AmazonS3Estimator, which is on the same module as AmazonEstimator, which is why I think that this belongs on this file. I have a serparate test for image classification tests.

mini_batch_size (int or None): The size of each mini-batch to use when training. If None, a
default value will be used.
"""
default_mini_batch_size = 32

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why dont you make 32 the default value for mini_batch_size in the method signature?

def fit(self, s3set, mini_batch_size=32, distribution='ShardedByS3Key', **kwargs):

then you don't even have to do this whole thing. and you can just set it as
self.mini_batch_size = mini_batch_size

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two reasosn why: 1. Its a protocol used in the other alogrithms. 2. We want to make this a must supply parameter for user. If I assume a default and it fails because of memory error, it becomes a customer error, which is wrong.

The implementation of :meth:`~sagemaker.predictor.RealTimePredictor.predict` in this
`RealTimePredictor` requires a `x-image` as input.

``predict()`` returns """

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this sentence is also incomplete. predict() returns <>... ?

checkpoint_frequency = hp('checkpoint_frequency', (ge(1),),
'checkpoint_frequency should be an integer greater-than 1', int)
num_layers = hp('num_layers', (isin(18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110),),
'num_layers should be in the set [18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110]', int)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a suggestion but maybe putting these in ascending order would make it easier for users to reason about? Or is there a reason why they are seemingly in a random order?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I don't want to because this is a logic that is used in the docs also. There is a reason why it is in this order and users familiar with this algorithm will find this ordering comfortable.

@laurenyu

Copy link
Copy Markdown
Contributor

closing due to inactivity. feel free to reopen (or maybe create a new PR, given all the merge conflicts) if work on this resumes.

apacker pushed a commit to apacker/sagemaker-python-sdk that referenced this pull request Nov 15, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@ragavvenkatesan@laurenyu@iquintero@orchidmajumder@vrkhare
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

S3 Estimator and Image Classification - #71

Closed
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master
Closed

S3 Estimator and Image Classification#71
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master

Conversation

@ragavvenkatesan

Copy link
Copy Markdown

This PR sets up the SDK for S3 algorithms to come in and this brings in image classification.

Comment thread.gitignore Outdated
**/.DS_Store
venv/
*.rec
*~ No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this symbol?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was added from a sync pull I made on the original repo. Not mine.

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

"""Base class for Amazon first-party Estimator implementations. This class isn't intended

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate doc

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo/

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These validations are gone. The pull request itself is stating there are conflicts, can you please update your branch to fix the conflicts?

Refer to this PR: 54b3830#diff-0bb270a0ed6827421dc5669020eb6427 to check what the changes to the hyperparameters are.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@orchidmajumderorchidmajumder left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly looked into syntactic issues. Need comments on semantics from Owen/Marcio.

@ragavvenkatesanragavvenkatesan left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iquintero Conflicts removed.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The unit tests failed :( It looks like there are some import errors and possibly flake8 errors too.

More importantly, please look into the changes to the hyperparameter class as the type validations are no longer required and instead you should declare the data type. I have left an example below.

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please maintain the import order:

1.- python built in libraries
2.- 3rd party imports
3.- local library imports (from sagemaker...)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

mini_batch_size = hp('mini_batch_size', (validation.isint, validation.gt(0)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please look at #54 we intentionally removed these type validations: isint() isbool() etc. In favor of declaring a specific type for the hp.

So this should be

hp('mini_batch_size', validation.gt(0), data_type=int)

This applies to every hp declaration in this PR.

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are a lot of cases where the alignment is not consistent. I didn't want to list every single one but please go through it and review them.

Some examples are in the docstrings where each line is aligned differently. In some cases you have:

param_name (str)

some others are:

param_name ...(long space..) (str)

The original comments have not been addressed yet either. Everything is minor changes but they do add up. Once you change that this should be ready to merge.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....



class record_deserializer(object):
class file_to_image_serializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keep one naming convention. FileToImageSerializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using this because the other methods are also in this convention.. Refer numpy_to_recod_serializer. ..

return payload


class record_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

RecordDeserializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I am maintaining this because of the other methods... refer
response_deseiralizer.

stream.close()


class response_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ResponseDeserializer

@@ -0,0 +1,65 @@
# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2017-2018

might as well :P

assert pca.num_components == 55


def test_s3_init(sagemaker_session):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all the tests you've added here should go on their own file. This way we have a better organized test suite. This existing file is meant to test the AmazonEstimator. you should create a file to test your new estimators. The content of the tests is fine just split it into its own file.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test I wrote tests the AmazonS3Estimator, which is on the same module as AmazonEstimator, which is why I think that this belongs on this file. I have a serparate test for image classification tests.

mini_batch_size (int or None): The size of each mini-batch to use when training. If None, a
default value will be used.
"""
default_mini_batch_size = 32

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why dont you make 32 the default value for mini_batch_size in the method signature?

def fit(self, s3set, mini_batch_size=32, distribution='ShardedByS3Key', **kwargs):

then you don't even have to do this whole thing. and you can just set it as
self.mini_batch_size = mini_batch_size

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two reasosn why: 1. Its a protocol used in the other alogrithms. 2. We want to make this a must supply parameter for user. If I assume a default and it fails because of memory error, it becomes a customer error, which is wrong.

The implementation of :meth:`~sagemaker.predictor.RealTimePredictor.predict` in this
`RealTimePredictor` requires a `x-image` as input.

``predict()`` returns """

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this sentence is also incomplete. predict() returns <>... ?

checkpoint_frequency = hp('checkpoint_frequency', (ge(1),),
'checkpoint_frequency should be an integer greater-than 1', int)
num_layers = hp('num_layers', (isin(18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110),),
'num_layers should be in the set [18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110]', int)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a suggestion but maybe putting these in ascending order would make it easier for users to reason about? Or is there a reason why they are seemingly in a random order?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I don't want to because this is a logic that is used in the docs also. There is a reason why it is in this order and users familiar with this algorithm will find this ordering comfortable.

@laurenyu

Copy link
Copy Markdown
Contributor

closing due to inactivity. feel free to reopen (or maybe create a new PR, given all the merge conflicts) if work on this resumes.

apacker pushed a commit to apacker/sagemaker-python-sdk that referenced this pull request Nov 15, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@ragavvenkatesan@laurenyu@iquintero@orchidmajumder@vrkhare
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

S3 Estimator and Image Classification - #71

Closed
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master
Closed

S3 Estimator and Image Classification#71
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master

Conversation

@ragavvenkatesan

Copy link
Copy Markdown

This PR sets up the SDK for S3 algorithms to come in and this brings in image classification.

Comment thread.gitignore Outdated
**/.DS_Store
venv/
*.rec
*~ No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this symbol?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was added from a sync pull I made on the original repo. Not mine.

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

"""Base class for Amazon first-party Estimator implementations. This class isn't intended

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate doc

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo/

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These validations are gone. The pull request itself is stating there are conflicts, can you please update your branch to fix the conflicts?

Refer to this PR: 54b3830#diff-0bb270a0ed6827421dc5669020eb6427 to check what the changes to the hyperparameters are.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@orchidmajumderorchidmajumder left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly looked into syntactic issues. Need comments on semantics from Owen/Marcio.

@ragavvenkatesanragavvenkatesan left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iquintero Conflicts removed.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The unit tests failed :( It looks like there are some import errors and possibly flake8 errors too.

More importantly, please look into the changes to the hyperparameter class as the type validations are no longer required and instead you should declare the data type. I have left an example below.

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please maintain the import order:

1.- python built in libraries
2.- 3rd party imports
3.- local library imports (from sagemaker...)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

mini_batch_size = hp('mini_batch_size', (validation.isint, validation.gt(0)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please look at #54 we intentionally removed these type validations: isint() isbool() etc. In favor of declaring a specific type for the hp.

So this should be

hp('mini_batch_size', validation.gt(0), data_type=int)

This applies to every hp declaration in this PR.

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are a lot of cases where the alignment is not consistent. I didn't want to list every single one but please go through it and review them.

Some examples are in the docstrings where each line is aligned differently. In some cases you have:

param_name (str)

some others are:

param_name ...(long space..) (str)

The original comments have not been addressed yet either. Everything is minor changes but they do add up. Once you change that this should be ready to merge.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....



class record_deserializer(object):
class file_to_image_serializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keep one naming convention. FileToImageSerializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using this because the other methods are also in this convention.. Refer numpy_to_recod_serializer. ..

return payload


class record_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

RecordDeserializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I am maintaining this because of the other methods... refer
response_deseiralizer.

stream.close()


class response_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ResponseDeserializer

@@ -0,0 +1,65 @@
# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2017-2018

might as well :P

assert pca.num_components == 55


def test_s3_init(sagemaker_session):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all the tests you've added here should go on their own file. This way we have a better organized test suite. This existing file is meant to test the AmazonEstimator. you should create a file to test your new estimators. The content of the tests is fine just split it into its own file.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test I wrote tests the AmazonS3Estimator, which is on the same module as AmazonEstimator, which is why I think that this belongs on this file. I have a serparate test for image classification tests.

mini_batch_size (int or None): The size of each mini-batch to use when training. If None, a
default value will be used.
"""
default_mini_batch_size = 32

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why dont you make 32 the default value for mini_batch_size in the method signature?

def fit(self, s3set, mini_batch_size=32, distribution='ShardedByS3Key', **kwargs):

then you don't even have to do this whole thing. and you can just set it as
self.mini_batch_size = mini_batch_size

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two reasosn why: 1. Its a protocol used in the other alogrithms. 2. We want to make this a must supply parameter for user. If I assume a default and it fails because of memory error, it becomes a customer error, which is wrong.

The implementation of :meth:`~sagemaker.predictor.RealTimePredictor.predict` in this
`RealTimePredictor` requires a `x-image` as input.

``predict()`` returns """

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this sentence is also incomplete. predict() returns <>... ?

checkpoint_frequency = hp('checkpoint_frequency', (ge(1),),
'checkpoint_frequency should be an integer greater-than 1', int)
num_layers = hp('num_layers', (isin(18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110),),
'num_layers should be in the set [18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110]', int)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a suggestion but maybe putting these in ascending order would make it easier for users to reason about? Or is there a reason why they are seemingly in a random order?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I don't want to because this is a logic that is used in the docs also. There is a reason why it is in this order and users familiar with this algorithm will find this ordering comfortable.

@laurenyu

Copy link
Copy Markdown
Contributor

closing due to inactivity. feel free to reopen (or maybe create a new PR, given all the merge conflicts) if work on this resumes.

apacker pushed a commit to apacker/sagemaker-python-sdk that referenced this pull request Nov 15, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@ragavvenkatesan@laurenyu@iquintero@orchidmajumder@vrkhare
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

S3 Estimator and Image Classification - #71

Closed
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master
Closed

S3 Estimator and Image Classification#71
ragavvenkatesan wants to merge 31 commits into
aws:masterfrom
ragavvenkatesan:master

Conversation

@ragavvenkatesan

Copy link
Copy Markdown

This PR sets up the SDK for S3 algorithms to come in and this brings in image classification.

Comment thread.gitignore Outdated
**/.DS_Store
venv/
*.rec
*~ No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this symbol?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was added from a sync pull I made on the original repo. Not mine.

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

"""Base class for Amazon first-party Estimator implementations. This class isn't intended

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate doc

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo/

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These validations are gone. The pull request itself is stating there are conflicts, can you please update your branch to fix the conflicts?

Refer to this PR: 54b3830#diff-0bb270a0ed6827421dc5669020eb6427 to check what the changes to the hyperparameters are.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@orchidmajumderorchidmajumder left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly looked into syntactic issues. Need comments on semantics from Owen/Marcio.

@ragavvenkatesanragavvenkatesan left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iquintero Conflicts removed.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the typo? I don't see.

Comment threadsrc/sagemaker/amazon/validation.py Outdated

isint = istype(int)
isbool = istype(bool)
isstr = istype(str)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some of these validations. @orchidmajumder, what is a solution to this?

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The unit tests failed :( It looks like there are some import errors and possibly flake8 errors too.

More importantly, please look into the changes to the hyperparameter class as the type validations are no longer required and instead you should declare the data type. I have left an example below.

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please maintain the import order:

1.- python built in libraries
2.- 3rd party imports
3.- local library imports (from sagemaker...)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....

intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

mini_batch_size = hp('mini_batch_size', (validation.isint, validation.gt(0)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please look at #54 we intentionally removed these type validations: isint() isbool() etc. In favor of declaring a specific type for the hp.

So this should be

hp('mini_batch_size', validation.gt(0), data_type=int)

This applies to every hp declaration in this PR.

@iquinteroiquintero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are a lot of cases where the alignment is not consistent. I didn't want to list every single one but please go through it and review them.

Some examples are in the docstrings where each line is aligned differently. In some cases you have:

param_name (str)

some others are:

param_name ...(long space..) (str)

The original comments have not been addressed yet either. Everything is minor changes but they do add up. Once you change that this should be ready to merge.

"""Initialize an AmazonAlgorithmEstimatorBase.

Args:
algortihm (str): Use one of the supported algorithms

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

algortihm

Comment threadsrc/sagemaker/amazon/common.py Outdated
import numpy as np
from scipy.sparse import issparse

import json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this still needs to be fixed. import json should go before the numpy import.

Also, please maintain the alphabetical order of the imports when you change it.

import io
import json
import struct
....



class record_deserializer(object):
class file_to_image_serializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keep one naming convention. FileToImageSerializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using this because the other methods are also in this convention.. Refer numpy_to_recod_serializer. ..

return payload


class record_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

RecordDeserializer

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I am maintaining this because of the other methods... refer
response_deseiralizer.

stream.close()


class response_deserializer(object):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ResponseDeserializer

@@ -0,0 +1,65 @@
# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2017-2018

might as well :P

assert pca.num_components == 55


def test_s3_init(sagemaker_session):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all the tests you've added here should go on their own file. This way we have a better organized test suite. This existing file is meant to test the AmazonEstimator. you should create a file to test your new estimators. The content of the tests is fine just split it into its own file.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test I wrote tests the AmazonS3Estimator, which is on the same module as AmazonEstimator, which is why I think that this belongs on this file. I have a serparate test for image classification tests.

mini_batch_size (int or None): The size of each mini-batch to use when training. If None, a
default value will be used.
"""
default_mini_batch_size = 32

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why dont you make 32 the default value for mini_batch_size in the method signature?

def fit(self, s3set, mini_batch_size=32, distribution='ShardedByS3Key', **kwargs):

then you don't even have to do this whole thing. and you can just set it as
self.mini_batch_size = mini_batch_size

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two reasosn why: 1. Its a protocol used in the other alogrithms. 2. We want to make this a must supply parameter for user. If I assume a default and it fails because of memory error, it becomes a customer error, which is wrong.

The implementation of :meth:`~sagemaker.predictor.RealTimePredictor.predict` in this
`RealTimePredictor` requires a `x-image` as input.

``predict()`` returns """

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this sentence is also incomplete. predict() returns <>... ?

checkpoint_frequency = hp('checkpoint_frequency', (ge(1),),
'checkpoint_frequency should be an integer greater-than 1', int)
num_layers = hp('num_layers', (isin(18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110),),
'num_layers should be in the set [18, 34, 50, 101, 152, 200, 20, 32, 44, 56, 110]', int)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a suggestion but maybe putting these in ascending order would make it easier for users to reason about? Or is there a reason why they are seemingly in a random order?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I don't want to because this is a logic that is used in the docs also. There is a reason why it is in this order and users familiar with this algorithm will find this ordering comfortable.

@laurenyu

Copy link
Copy Markdown
Contributor

closing due to inactivity. feel free to reopen (or maybe create a new PR, given all the merge conflicts) if work on this resumes.

apacker pushed a commit to apacker/sagemaker-python-sdk that referenced this pull request Nov 15, 2018
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@ragavvenkatesan@laurenyu@iquintero@orchidmajumder@vrkhare