Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,3 +20,4 @@ examples/tensorflow/distributed_mnist/data
doc/_build
**/.DS_Store
venv/
*.rec
5 changes: 4 additions & 1 deletion src/sagemaker/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,6 +16,8 @@
from sagemaker.amazon.kmeans import KMeans, KMeansModel, KMeansPredictor
from sagemaker.amazon.pca import PCA, PCAModel, PCAPredictor
from sagemaker.amazon.linear_learner import LinearLearner, LinearLearnerModel, LinearLearnerPredictor
from sagemaker.amazon.image_classification import ImageClassification, ImageClassificationModel
from sagemaker.amazon.image_classification import ImageClassificationPredictor
from sagemaker.amazon.factorization_machines import FactorizationMachines, FactorizationMachinesModel
from sagemaker.amazon.factorization_machines import FactorizationMachinesPredictor

Expand All@@ -32,4 +34,5 @@
LinearLearnerModel, LinearLearnerPredictor,
FactorizationMachines, FactorizationMachinesModel, FactorizationMachinesPredictor,
Model, RealTimePredictor, Session,
container_def, s3_input, production_variant, get_execution_role]
ImageClassification, ImageClassificationModel, ImageClassificationPredictor,
container_def, s3_input, production_variant, get_execution_role]
79 changes: 66 additions & 13 deletions src/sagemaker/amazon/amazon_estimator.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@

logger = logging.getLogger(__name__)


class AmazonAlgorithmEstimatorBase(EstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't intended
to be instantiated directly."""
Expand DownExpand Up@@ -126,9 +125,53 @@ def record_set(self, train, labels=None, channel="train"):
return RecordSet(manifest_s3_file, num_records=train.shape[0], feature_dim=train.shape[1], channel=channel)


class AmazonS3AlgorithmEstimatorBase(AmazonAlgorithmEstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't
intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

def fit(self, records, mini_batch_size=None, distribution='ShardedByS3Key', **kwargs):
"""Fit this Estimator on serialized Record objects, stored in S3.

``records`` should be a list of instances of :class:`~RecordSet`. This defines a collection of
s3 data files to train this ``Estimator`` on.

More information on the Amazon Record format is available at:
https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-training.html

See :meth:`~AmazonS3AlgorithmEstimatorBase.s3_record_set` to construct a ``RecordSet`` object
from :class:`~numpy.ndarray` arrays.

Args:
records (list): This is a list of :class:`~RecordSet` items The list of records to train
this ``Estimator`` will depend on each algorithm and type of input data.
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
self.mini_batch_size = mini_batch_size or default_mini_batch_size
data = {}
for record in records:
data[record.channel] = s3_input(record.s3_data, distribution=distribution,
s3_data_type=record.s3_data_type)
super(AmazonAlgorithmEstimatorBase, self).fit(data, **kwargs)

def s3_record_set(self, s3_loc, channel="train"):
"""Build a :class:`~RecordSet` from a S3 location with data in it.

Args:
s3_loc (str): A s3 bucket where data is located
channel (str): The SageMaker TrainingJob channel this RecordSet should be assigned to.

Returns:
RecordSet: A RecordSet referencing the encoded, uploading training and label data.
"""
return RecordSet(self.data_location + '/' + s3_loc, channel=channel)

# Re-write a new recordset class for s3 objects.
class RecordSet(object):

def __init__(self, s3_data, num_records, feature_dim, s3_data_type='ManifestFile', channel='train'):
def __init__(self, s3_data, num_records = None, feature_dim = None, s3_data_type='ManifestFile', channel='train'):
"""A collection of Amazon :class:~`Record` objects serialized and stored in S3.

Args:
Expand DownExpand Up@@ -163,7 +206,6 @@ def _build_shards(num_shards, array):
shards.append(array[(num_shards - 1) * shard_size:])
return shards


def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=None):
"""Upload the training ``array`` and ``labels`` arrays to ``num_shards`` s3 objects,
stored in "s3://``bucket``/``key_prefix``/"."""
Expand DownExpand Up@@ -199,13 +241,24 @@ def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=
finally:
raise ex


def registry(region_name):
"""Return docker registry for the given AWS region"""
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
def registry(region_name, algorithm = None):
"""Return docker registry for the given AWS region

Args:
algorithm (str): Provide the algorithm to get the docker back"""
if algorithm is None:
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
elif algorithm in ['image_classification']:
account_id = {
"us-east-1": "811284229777",
"us-east-2": "825641698319",
"us-west-2": "433757028032",
"eu-west-1": "685385470294"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,3 +20,4 @@ examples/tensorflow/distributed_mnist/data
doc/_build
**/.DS_Store
venv/
*.rec
5 changes: 4 additions & 1 deletion src/sagemaker/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,6 +16,8 @@
from sagemaker.amazon.kmeans import KMeans, KMeansModel, KMeansPredictor
from sagemaker.amazon.pca import PCA, PCAModel, PCAPredictor
from sagemaker.amazon.linear_learner import LinearLearner, LinearLearnerModel, LinearLearnerPredictor
from sagemaker.amazon.image_classification import ImageClassification, ImageClassificationModel
from sagemaker.amazon.image_classification import ImageClassificationPredictor
from sagemaker.amazon.factorization_machines import FactorizationMachines, FactorizationMachinesModel
from sagemaker.amazon.factorization_machines import FactorizationMachinesPredictor

Expand All@@ -32,4 +34,5 @@
LinearLearnerModel, LinearLearnerPredictor,
FactorizationMachines, FactorizationMachinesModel, FactorizationMachinesPredictor,
Model, RealTimePredictor, Session,
container_def, s3_input, production_variant, get_execution_role]
ImageClassification, ImageClassificationModel, ImageClassificationPredictor,
container_def, s3_input, production_variant, get_execution_role]
79 changes: 66 additions & 13 deletions src/sagemaker/amazon/amazon_estimator.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@

logger = logging.getLogger(__name__)


class AmazonAlgorithmEstimatorBase(EstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't intended
to be instantiated directly."""
Expand DownExpand Up@@ -126,9 +125,53 @@ def record_set(self, train, labels=None, channel="train"):
return RecordSet(manifest_s3_file, num_records=train.shape[0], feature_dim=train.shape[1], channel=channel)


class AmazonS3AlgorithmEstimatorBase(AmazonAlgorithmEstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't
intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

def fit(self, records, mini_batch_size=None, distribution='ShardedByS3Key', **kwargs):
"""Fit this Estimator on serialized Record objects, stored in S3.

``records`` should be a list of instances of :class:`~RecordSet`. This defines a collection of
s3 data files to train this ``Estimator`` on.

More information on the Amazon Record format is available at:
https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-training.html

See :meth:`~AmazonS3AlgorithmEstimatorBase.s3_record_set` to construct a ``RecordSet`` object
from :class:`~numpy.ndarray` arrays.

Args:
records (list): This is a list of :class:`~RecordSet` items The list of records to train
this ``Estimator`` will depend on each algorithm and type of input data.
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
self.mini_batch_size = mini_batch_size or default_mini_batch_size
data = {}
for record in records:
data[record.channel] = s3_input(record.s3_data, distribution=distribution,
s3_data_type=record.s3_data_type)
super(AmazonAlgorithmEstimatorBase, self).fit(data, **kwargs)

def s3_record_set(self, s3_loc, channel="train"):
"""Build a :class:`~RecordSet` from a S3 location with data in it.

Args:
s3_loc (str): A s3 bucket where data is located
channel (str): The SageMaker TrainingJob channel this RecordSet should be assigned to.

Returns:
RecordSet: A RecordSet referencing the encoded, uploading training and label data.
"""
return RecordSet(self.data_location + '/' + s3_loc, channel=channel)

# Re-write a new recordset class for s3 objects.
class RecordSet(object):

def __init__(self, s3_data, num_records, feature_dim, s3_data_type='ManifestFile', channel='train'):
def __init__(self, s3_data, num_records = None, feature_dim = None, s3_data_type='ManifestFile', channel='train'):
"""A collection of Amazon :class:~`Record` objects serialized and stored in S3.

Args:
Expand DownExpand Up@@ -163,7 +206,6 @@ def _build_shards(num_shards, array):
shards.append(array[(num_shards - 1) * shard_size:])
return shards


def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=None):
"""Upload the training ``array`` and ``labels`` arrays to ``num_shards`` s3 objects,
stored in "s3://``bucket``/``key_prefix``/"."""
Expand DownExpand Up@@ -199,13 +241,24 @@ def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=
finally:
raise ex


def registry(region_name):
"""Return docker registry for the given AWS region"""
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
def registry(region_name, algorithm = None):
"""Return docker registry for the given AWS region

Args:
algorithm (str): Provide the algorithm to get the docker back"""
if algorithm is None:
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
elif algorithm in ['image_classification']:
account_id = {
"us-east-1": "811284229777",
"us-east-2": "825641698319",
"us-west-2": "433757028032",
"eu-west-1": "685385470294"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,3 +20,4 @@ examples/tensorflow/distributed_mnist/data
doc/_build
**/.DS_Store
venv/
*.rec
5 changes: 4 additions & 1 deletion src/sagemaker/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,6 +16,8 @@
from sagemaker.amazon.kmeans import KMeans, KMeansModel, KMeansPredictor
from sagemaker.amazon.pca import PCA, PCAModel, PCAPredictor
from sagemaker.amazon.linear_learner import LinearLearner, LinearLearnerModel, LinearLearnerPredictor
from sagemaker.amazon.image_classification import ImageClassification, ImageClassificationModel
from sagemaker.amazon.image_classification import ImageClassificationPredictor
from sagemaker.amazon.factorization_machines import FactorizationMachines, FactorizationMachinesModel
from sagemaker.amazon.factorization_machines import FactorizationMachinesPredictor

Expand All@@ -32,4 +34,5 @@
LinearLearnerModel, LinearLearnerPredictor,
FactorizationMachines, FactorizationMachinesModel, FactorizationMachinesPredictor,
Model, RealTimePredictor, Session,
container_def, s3_input, production_variant, get_execution_role]
ImageClassification, ImageClassificationModel, ImageClassificationPredictor,
container_def, s3_input, production_variant, get_execution_role]
79 changes: 66 additions & 13 deletions src/sagemaker/amazon/amazon_estimator.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@

logger = logging.getLogger(__name__)


class AmazonAlgorithmEstimatorBase(EstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't intended
to be instantiated directly."""
Expand DownExpand Up@@ -126,9 +125,53 @@ def record_set(self, train, labels=None, channel="train"):
return RecordSet(manifest_s3_file, num_records=train.shape[0], feature_dim=train.shape[1], channel=channel)


class AmazonS3AlgorithmEstimatorBase(AmazonAlgorithmEstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't
intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

def fit(self, records, mini_batch_size=None, distribution='ShardedByS3Key', **kwargs):
"""Fit this Estimator on serialized Record objects, stored in S3.

``records`` should be a list of instances of :class:`~RecordSet`. This defines a collection of
s3 data files to train this ``Estimator`` on.

More information on the Amazon Record format is available at:
https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-training.html

See :meth:`~AmazonS3AlgorithmEstimatorBase.s3_record_set` to construct a ``RecordSet`` object
from :class:`~numpy.ndarray` arrays.

Args:
records (list): This is a list of :class:`~RecordSet` items The list of records to train
this ``Estimator`` will depend on each algorithm and type of input data.
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
self.mini_batch_size = mini_batch_size or default_mini_batch_size
data = {}
for record in records:
data[record.channel] = s3_input(record.s3_data, distribution=distribution,
s3_data_type=record.s3_data_type)
super(AmazonAlgorithmEstimatorBase, self).fit(data, **kwargs)

def s3_record_set(self, s3_loc, channel="train"):
"""Build a :class:`~RecordSet` from a S3 location with data in it.

Args:
s3_loc (str): A s3 bucket where data is located
channel (str): The SageMaker TrainingJob channel this RecordSet should be assigned to.

Returns:
RecordSet: A RecordSet referencing the encoded, uploading training and label data.
"""
return RecordSet(self.data_location + '/' + s3_loc, channel=channel)

# Re-write a new recordset class for s3 objects.
class RecordSet(object):

def __init__(self, s3_data, num_records, feature_dim, s3_data_type='ManifestFile', channel='train'):
def __init__(self, s3_data, num_records = None, feature_dim = None, s3_data_type='ManifestFile', channel='train'):
"""A collection of Amazon :class:~`Record` objects serialized and stored in S3.

Args:
Expand DownExpand Up@@ -163,7 +206,6 @@ def _build_shards(num_shards, array):
shards.append(array[(num_shards - 1) * shard_size:])
return shards


def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=None):
"""Upload the training ``array`` and ``labels`` arrays to ``num_shards`` s3 objects,
stored in "s3://``bucket``/``key_prefix``/"."""
Expand DownExpand Up@@ -199,13 +241,24 @@ def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=
finally:
raise ex


def registry(region_name):
"""Return docker registry for the given AWS region"""
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
def registry(region_name, algorithm = None):
"""Return docker registry for the given AWS region

Args:
algorithm (str): Provide the algorithm to get the docker back"""
if algorithm is None:
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
elif algorithm in ['image_classification']:
account_id = {
"us-east-1": "811284229777",
"us-east-2": "825641698319",
"us-west-2": "433757028032",
"eu-west-1": "685385470294"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,3 +20,4 @@ examples/tensorflow/distributed_mnist/data
doc/_build
**/.DS_Store
venv/
*.rec
5 changes: 4 additions & 1 deletion src/sagemaker/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,6 +16,8 @@
from sagemaker.amazon.kmeans import KMeans, KMeansModel, KMeansPredictor
from sagemaker.amazon.pca import PCA, PCAModel, PCAPredictor
from sagemaker.amazon.linear_learner import LinearLearner, LinearLearnerModel, LinearLearnerPredictor
from sagemaker.amazon.image_classification import ImageClassification, ImageClassificationModel
from sagemaker.amazon.image_classification import ImageClassificationPredictor
from sagemaker.amazon.factorization_machines import FactorizationMachines, FactorizationMachinesModel
from sagemaker.amazon.factorization_machines import FactorizationMachinesPredictor

Expand All@@ -32,4 +34,5 @@
LinearLearnerModel, LinearLearnerPredictor,
FactorizationMachines, FactorizationMachinesModel, FactorizationMachinesPredictor,
Model, RealTimePredictor, Session,
container_def, s3_input, production_variant, get_execution_role]
ImageClassification, ImageClassificationModel, ImageClassificationPredictor,
container_def, s3_input, production_variant, get_execution_role]
79 changes: 66 additions & 13 deletions src/sagemaker/amazon/amazon_estimator.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@

logger = logging.getLogger(__name__)


class AmazonAlgorithmEstimatorBase(EstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't intended
to be instantiated directly."""
Expand DownExpand Up@@ -126,9 +125,53 @@ def record_set(self, train, labels=None, channel="train"):
return RecordSet(manifest_s3_file, num_records=train.shape[0], feature_dim=train.shape[1], channel=channel)


class AmazonS3AlgorithmEstimatorBase(AmazonAlgorithmEstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't
intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

def fit(self, records, mini_batch_size=None, distribution='ShardedByS3Key', **kwargs):
"""Fit this Estimator on serialized Record objects, stored in S3.

``records`` should be a list of instances of :class:`~RecordSet`. This defines a collection of
s3 data files to train this ``Estimator`` on.

More information on the Amazon Record format is available at:
https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-training.html

See :meth:`~AmazonS3AlgorithmEstimatorBase.s3_record_set` to construct a ``RecordSet`` object
from :class:`~numpy.ndarray` arrays.

Args:
records (list): This is a list of :class:`~RecordSet` items The list of records to train
this ``Estimator`` will depend on each algorithm and type of input data.
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
self.mini_batch_size = mini_batch_size or default_mini_batch_size
data = {}
for record in records:
data[record.channel] = s3_input(record.s3_data, distribution=distribution,
s3_data_type=record.s3_data_type)
super(AmazonAlgorithmEstimatorBase, self).fit(data, **kwargs)

def s3_record_set(self, s3_loc, channel="train"):
"""Build a :class:`~RecordSet` from a S3 location with data in it.

Args:
s3_loc (str): A s3 bucket where data is located
channel (str): The SageMaker TrainingJob channel this RecordSet should be assigned to.

Returns:
RecordSet: A RecordSet referencing the encoded, uploading training and label data.
"""
return RecordSet(self.data_location + '/' + s3_loc, channel=channel)

# Re-write a new recordset class for s3 objects.
class RecordSet(object):

def __init__(self, s3_data, num_records, feature_dim, s3_data_type='ManifestFile', channel='train'):
def __init__(self, s3_data, num_records = None, feature_dim = None, s3_data_type='ManifestFile', channel='train'):
"""A collection of Amazon :class:~`Record` objects serialized and stored in S3.

Args:
Expand DownExpand Up@@ -163,7 +206,6 @@ def _build_shards(num_shards, array):
shards.append(array[(num_shards - 1) * shard_size:])
return shards


def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=None):
"""Upload the training ``array`` and ``labels`` arrays to ``num_shards`` s3 objects,
stored in "s3://``bucket``/``key_prefix``/"."""
Expand DownExpand Up@@ -199,13 +241,24 @@ def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=
finally:
raise ex


def registry(region_name):
"""Return docker registry for the given AWS region"""
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
def registry(region_name, algorithm = None):
"""Return docker registry for the given AWS region

Args:
algorithm (str): Provide the algorithm to get the docker back"""
if algorithm is None:
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
elif algorithm in ['image_classification']:
account_id = {
"us-east-1": "811284229777",
"us-east-2": "825641698319",
"us-west-2": "433757028032",
"eu-west-1": "685385470294"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,3 +20,4 @@ examples/tensorflow/distributed_mnist/data
doc/_build
**/.DS_Store
venv/
*.rec
5 changes: 4 additions & 1 deletion src/sagemaker/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,6 +16,8 @@
from sagemaker.amazon.kmeans import KMeans, KMeansModel, KMeansPredictor
from sagemaker.amazon.pca import PCA, PCAModel, PCAPredictor
from sagemaker.amazon.linear_learner import LinearLearner, LinearLearnerModel, LinearLearnerPredictor
from sagemaker.amazon.image_classification import ImageClassification, ImageClassificationModel
from sagemaker.amazon.image_classification import ImageClassificationPredictor
from sagemaker.amazon.factorization_machines import FactorizationMachines, FactorizationMachinesModel
from sagemaker.amazon.factorization_machines import FactorizationMachinesPredictor

Expand All@@ -32,4 +34,5 @@
LinearLearnerModel, LinearLearnerPredictor,
FactorizationMachines, FactorizationMachinesModel, FactorizationMachinesPredictor,
Model, RealTimePredictor, Session,
container_def, s3_input, production_variant, get_execution_role]
ImageClassification, ImageClassificationModel, ImageClassificationPredictor,
container_def, s3_input, production_variant, get_execution_role]
79 changes: 66 additions & 13 deletions src/sagemaker/amazon/amazon_estimator.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@

logger = logging.getLogger(__name__)


class AmazonAlgorithmEstimatorBase(EstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't intended
to be instantiated directly."""
Expand DownExpand Up@@ -126,9 +125,53 @@ def record_set(self, train, labels=None, channel="train"):
return RecordSet(manifest_s3_file, num_records=train.shape[0], feature_dim=train.shape[1], channel=channel)


class AmazonS3AlgorithmEstimatorBase(AmazonAlgorithmEstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't
intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

def fit(self, records, mini_batch_size=None, distribution='ShardedByS3Key', **kwargs):
"""Fit this Estimator on serialized Record objects, stored in S3.

``records`` should be a list of instances of :class:`~RecordSet`. This defines a collection of
s3 data files to train this ``Estimator`` on.

More information on the Amazon Record format is available at:
https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-training.html

See :meth:`~AmazonS3AlgorithmEstimatorBase.s3_record_set` to construct a ``RecordSet`` object
from :class:`~numpy.ndarray` arrays.

Args:
records (list): This is a list of :class:`~RecordSet` items The list of records to train
this ``Estimator`` will depend on each algorithm and type of input data.
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
self.mini_batch_size = mini_batch_size or default_mini_batch_size
data = {}
for record in records:
data[record.channel] = s3_input(record.s3_data, distribution=distribution,
s3_data_type=record.s3_data_type)
super(AmazonAlgorithmEstimatorBase, self).fit(data, **kwargs)

def s3_record_set(self, s3_loc, channel="train"):
"""Build a :class:`~RecordSet` from a S3 location with data in it.

Args:
s3_loc (str): A s3 bucket where data is located
channel (str): The SageMaker TrainingJob channel this RecordSet should be assigned to.

Returns:
RecordSet: A RecordSet referencing the encoded, uploading training and label data.
"""
return RecordSet(self.data_location + '/' + s3_loc, channel=channel)

# Re-write a new recordset class for s3 objects.
class RecordSet(object):

def __init__(self, s3_data, num_records, feature_dim, s3_data_type='ManifestFile', channel='train'):
def __init__(self, s3_data, num_records = None, feature_dim = None, s3_data_type='ManifestFile', channel='train'):
"""A collection of Amazon :class:~`Record` objects serialized and stored in S3.

Args:
Expand DownExpand Up@@ -163,7 +206,6 @@ def _build_shards(num_shards, array):
shards.append(array[(num_shards - 1) * shard_size:])
return shards


def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=None):
"""Upload the training ``array`` and ``labels`` arrays to ``num_shards`` s3 objects,
stored in "s3://``bucket``/``key_prefix``/"."""
Expand DownExpand Up@@ -199,13 +241,24 @@ def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=
finally:
raise ex


def registry(region_name):
"""Return docker registry for the given AWS region"""
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
def registry(region_name, algorithm = None):
"""Return docker registry for the given AWS region

Args:
algorithm (str): Provide the algorithm to get the docker back"""
if algorithm is None:
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
elif algorithm in ['image_classification']:
account_id = {
"us-east-1": "811284229777",
"us-east-2": "825641698319",
"us-west-2": "433757028032",
"eu-west-1": "685385470294"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,3 +20,4 @@ examples/tensorflow/distributed_mnist/data
doc/_build
**/.DS_Store
venv/
*.rec
5 changes: 4 additions & 1 deletion src/sagemaker/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,6 +16,8 @@
from sagemaker.amazon.kmeans import KMeans, KMeansModel, KMeansPredictor
from sagemaker.amazon.pca import PCA, PCAModel, PCAPredictor
from sagemaker.amazon.linear_learner import LinearLearner, LinearLearnerModel, LinearLearnerPredictor
from sagemaker.amazon.image_classification import ImageClassification, ImageClassificationModel
from sagemaker.amazon.image_classification import ImageClassificationPredictor
from sagemaker.amazon.factorization_machines import FactorizationMachines, FactorizationMachinesModel
from sagemaker.amazon.factorization_machines import FactorizationMachinesPredictor

Expand All@@ -32,4 +34,5 @@
LinearLearnerModel, LinearLearnerPredictor,
FactorizationMachines, FactorizationMachinesModel, FactorizationMachinesPredictor,
Model, RealTimePredictor, Session,
container_def, s3_input, production_variant, get_execution_role]
ImageClassification, ImageClassificationModel, ImageClassificationPredictor,
container_def, s3_input, production_variant, get_execution_role]
79 changes: 66 additions & 13 deletions src/sagemaker/amazon/amazon_estimator.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@

logger = logging.getLogger(__name__)


class AmazonAlgorithmEstimatorBase(EstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't intended
to be instantiated directly."""
Expand DownExpand Up@@ -126,9 +125,53 @@ def record_set(self, train, labels=None, channel="train"):
return RecordSet(manifest_s3_file, num_records=train.shape[0], feature_dim=train.shape[1], channel=channel)


class AmazonS3AlgorithmEstimatorBase(AmazonAlgorithmEstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't
intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

def fit(self, records, mini_batch_size=None, distribution='ShardedByS3Key', **kwargs):
"""Fit this Estimator on serialized Record objects, stored in S3.

``records`` should be a list of instances of :class:`~RecordSet`. This defines a collection of
s3 data files to train this ``Estimator`` on.

More information on the Amazon Record format is available at:
https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-training.html

See :meth:`~AmazonS3AlgorithmEstimatorBase.s3_record_set` to construct a ``RecordSet`` object
from :class:`~numpy.ndarray` arrays.

Args:
records (list): This is a list of :class:`~RecordSet` items The list of records to train
this ``Estimator`` will depend on each algorithm and type of input data.
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
self.mini_batch_size = mini_batch_size or default_mini_batch_size
data = {}
for record in records:
data[record.channel] = s3_input(record.s3_data, distribution=distribution,
s3_data_type=record.s3_data_type)
super(AmazonAlgorithmEstimatorBase, self).fit(data, **kwargs)

def s3_record_set(self, s3_loc, channel="train"):
"""Build a :class:`~RecordSet` from a S3 location with data in it.

Args:
s3_loc (str): A s3 bucket where data is located
channel (str): The SageMaker TrainingJob channel this RecordSet should be assigned to.

Returns:
RecordSet: A RecordSet referencing the encoded, uploading training and label data.
"""
return RecordSet(self.data_location + '/' + s3_loc, channel=channel)

# Re-write a new recordset class for s3 objects.
class RecordSet(object):

def __init__(self, s3_data, num_records, feature_dim, s3_data_type='ManifestFile', channel='train'):
def __init__(self, s3_data, num_records = None, feature_dim = None, s3_data_type='ManifestFile', channel='train'):
"""A collection of Amazon :class:~`Record` objects serialized and stored in S3.

Args:
Expand DownExpand Up@@ -163,7 +206,6 @@ def _build_shards(num_shards, array):
shards.append(array[(num_shards - 1) * shard_size:])
return shards


def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=None):
"""Upload the training ``array`` and ``labels`` arrays to ``num_shards`` s3 objects,
stored in "s3://``bucket``/``key_prefix``/"."""
Expand DownExpand Up@@ -199,13 +241,24 @@ def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=
finally:
raise ex


def registry(region_name):
"""Return docker registry for the given AWS region"""
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
def registry(region_name, algorithm = None):
"""Return docker registry for the given AWS region

Args:
algorithm (str): Provide the algorithm to get the docker back"""
if algorithm is None:
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
elif algorithm in ['image_classification']:
account_id = {
"us-east-1": "811284229777",
"us-east-2": "825641698319",
"us-west-2": "433757028032",
"eu-west-1": "685385470294"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,3 +20,4 @@ examples/tensorflow/distributed_mnist/data
doc/_build
**/.DS_Store
venv/
*.rec
5 changes: 4 additions & 1 deletion src/sagemaker/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,6 +16,8 @@
from sagemaker.amazon.kmeans import KMeans, KMeansModel, KMeansPredictor
from sagemaker.amazon.pca import PCA, PCAModel, PCAPredictor
from sagemaker.amazon.linear_learner import LinearLearner, LinearLearnerModel, LinearLearnerPredictor
from sagemaker.amazon.image_classification import ImageClassification, ImageClassificationModel
from sagemaker.amazon.image_classification import ImageClassificationPredictor
from sagemaker.amazon.factorization_machines import FactorizationMachines, FactorizationMachinesModel
from sagemaker.amazon.factorization_machines import FactorizationMachinesPredictor

Expand All@@ -32,4 +34,5 @@
LinearLearnerModel, LinearLearnerPredictor,
FactorizationMachines, FactorizationMachinesModel, FactorizationMachinesPredictor,
Model, RealTimePredictor, Session,
container_def, s3_input, production_variant, get_execution_role]
ImageClassification, ImageClassificationModel, ImageClassificationPredictor,
container_def, s3_input, production_variant, get_execution_role]
79 changes: 66 additions & 13 deletions src/sagemaker/amazon/amazon_estimator.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@

logger = logging.getLogger(__name__)


class AmazonAlgorithmEstimatorBase(EstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't intended
to be instantiated directly."""
Expand DownExpand Up@@ -126,9 +125,53 @@ def record_set(self, train, labels=None, channel="train"):
return RecordSet(manifest_s3_file, num_records=train.shape[0], feature_dim=train.shape[1], channel=channel)


class AmazonS3AlgorithmEstimatorBase(AmazonAlgorithmEstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't
intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

def fit(self, records, mini_batch_size=None, distribution='ShardedByS3Key', **kwargs):
"""Fit this Estimator on serialized Record objects, stored in S3.

``records`` should be a list of instances of :class:`~RecordSet`. This defines a collection of
s3 data files to train this ``Estimator`` on.

More information on the Amazon Record format is available at:
https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-training.html

See :meth:`~AmazonS3AlgorithmEstimatorBase.s3_record_set` to construct a ``RecordSet`` object
from :class:`~numpy.ndarray` arrays.

Args:
records (list): This is a list of :class:`~RecordSet` items The list of records to train
this ``Estimator`` will depend on each algorithm and type of input data.
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
self.mini_batch_size = mini_batch_size or default_mini_batch_size
data = {}
for record in records:
data[record.channel] = s3_input(record.s3_data, distribution=distribution,
s3_data_type=record.s3_data_type)
super(AmazonAlgorithmEstimatorBase, self).fit(data, **kwargs)

def s3_record_set(self, s3_loc, channel="train"):
"""Build a :class:`~RecordSet` from a S3 location with data in it.

Args:
s3_loc (str): A s3 bucket where data is located
channel (str): The SageMaker TrainingJob channel this RecordSet should be assigned to.

Returns:
RecordSet: A RecordSet referencing the encoded, uploading training and label data.
"""
return RecordSet(self.data_location + '/' + s3_loc, channel=channel)

# Re-write a new recordset class for s3 objects.
class RecordSet(object):

def __init__(self, s3_data, num_records, feature_dim, s3_data_type='ManifestFile', channel='train'):
def __init__(self, s3_data, num_records = None, feature_dim = None, s3_data_type='ManifestFile', channel='train'):
"""A collection of Amazon :class:~`Record` objects serialized and stored in S3.

Args:
Expand DownExpand Up@@ -163,7 +206,6 @@ def _build_shards(num_shards, array):
shards.append(array[(num_shards - 1) * shard_size:])
return shards


def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=None):
"""Upload the training ``array`` and ``labels`` arrays to ``num_shards`` s3 objects,
stored in "s3://``bucket``/``key_prefix``/"."""
Expand DownExpand Up@@ -199,13 +241,24 @@ def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=
finally:
raise ex


def registry(region_name):
"""Return docker registry for the given AWS region"""
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
def registry(region_name, algorithm = None):
"""Return docker registry for the given AWS region

Args:
algorithm (str): Provide the algorithm to get the docker back"""
if algorithm is None:
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
elif algorithm in ['image_classification']:
account_id = {
"us-east-1": "811284229777",
"us-east-2": "825641698319",
"us-west-2": "433757028032",
"eu-west-1": "685385470294"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,3 +20,4 @@ examples/tensorflow/distributed_mnist/data
doc/_build
**/.DS_Store
venv/
*.rec
5 changes: 4 additions & 1 deletion src/sagemaker/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,6 +16,8 @@
from sagemaker.amazon.kmeans import KMeans, KMeansModel, KMeansPredictor
from sagemaker.amazon.pca import PCA, PCAModel, PCAPredictor
from sagemaker.amazon.linear_learner import LinearLearner, LinearLearnerModel, LinearLearnerPredictor
from sagemaker.amazon.image_classification import ImageClassification, ImageClassificationModel
from sagemaker.amazon.image_classification import ImageClassificationPredictor
from sagemaker.amazon.factorization_machines import FactorizationMachines, FactorizationMachinesModel
from sagemaker.amazon.factorization_machines import FactorizationMachinesPredictor

Expand All@@ -32,4 +34,5 @@
LinearLearnerModel, LinearLearnerPredictor,
FactorizationMachines, FactorizationMachinesModel, FactorizationMachinesPredictor,
Model, RealTimePredictor, Session,
container_def, s3_input, production_variant, get_execution_role]
ImageClassification, ImageClassificationModel, ImageClassificationPredictor,
container_def, s3_input, production_variant, get_execution_role]
79 changes: 66 additions & 13 deletions src/sagemaker/amazon/amazon_estimator.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@

logger = logging.getLogger(__name__)


class AmazonAlgorithmEstimatorBase(EstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't intended
to be instantiated directly."""
Expand DownExpand Up@@ -126,9 +125,53 @@ def record_set(self, train, labels=None, channel="train"):
return RecordSet(manifest_s3_file, num_records=train.shape[0], feature_dim=train.shape[1], channel=channel)


class AmazonS3AlgorithmEstimatorBase(AmazonAlgorithmEstimatorBase):
"""Base class for Amazon first-party Estimator implementations. This class isn't
intended to be instantiated directly. This is difference from the base class
because this class handles S3 data"""

def fit(self, records, mini_batch_size=None, distribution='ShardedByS3Key', **kwargs):
"""Fit this Estimator on serialized Record objects, stored in S3.

``records`` should be a list of instances of :class:`~RecordSet`. This defines a collection of
s3 data files to train this ``Estimator`` on.

More information on the Amazon Record format is available at:
https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-training.html

See :meth:`~AmazonS3AlgorithmEstimatorBase.s3_record_set` to construct a ``RecordSet`` object
from :class:`~numpy.ndarray` arrays.

Args:
records (list): This is a list of :class:`~RecordSet` items The list of records to train
this ``Estimator`` will depend on each algorithm and type of input data.
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
self.mini_batch_size = mini_batch_size or default_mini_batch_size
data = {}
for record in records:
data[record.channel] = s3_input(record.s3_data, distribution=distribution,
s3_data_type=record.s3_data_type)
super(AmazonAlgorithmEstimatorBase, self).fit(data, **kwargs)

def s3_record_set(self, s3_loc, channel="train"):
"""Build a :class:`~RecordSet` from a S3 location with data in it.

Args:
s3_loc (str): A s3 bucket where data is located
channel (str): The SageMaker TrainingJob channel this RecordSet should be assigned to.

Returns:
RecordSet: A RecordSet referencing the encoded, uploading training and label data.
"""
return RecordSet(self.data_location + '/' + s3_loc, channel=channel)

# Re-write a new recordset class for s3 objects.
class RecordSet(object):

def __init__(self, s3_data, num_records, feature_dim, s3_data_type='ManifestFile', channel='train'):
def __init__(self, s3_data, num_records = None, feature_dim = None, s3_data_type='ManifestFile', channel='train'):
"""A collection of Amazon :class:~`Record` objects serialized and stored in S3.

Args:
Expand DownExpand Up@@ -163,7 +206,6 @@ def _build_shards(num_shards, array):
shards.append(array[(num_shards - 1) * shard_size:])
return shards


def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=None):
"""Upload the training ``array`` and ``labels`` arrays to ``num_shards`` s3 objects,
stored in "s3://``bucket``/``key_prefix``/"."""
Expand DownExpand Up@@ -199,13 +241,24 @@ def upload_numpy_to_s3_shards(num_shards, s3, bucket, key_prefix, array, labels=
finally:
raise ex


def registry(region_name):
"""Return docker registry for the given AWS region"""
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
def registry(region_name, algorithm = None):
"""Return docker registry for the given AWS region

Args:
algorithm (str): Provide the algorithm to get the docker back"""
if algorithm is None:
account_id = {
"us-east-1": "382416733822",
"us-east-2": "404615174143",
"us-west-2": "174872318107",
"eu-west-1": "438346466558"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
elif algorithm in ['image_classification']:
account_id = {
"us-east-1": "811284229777",
"us-east-2": "825641698319",
"us-west-2": "433757028032",
"eu-west-1": "685385470294"
}[region_name]
return "{}.dkr.ecr.{}.amazonaws.com".format(account_id, region_name)
Loading