Skip to content

Commit 4b5b502

Browse files
committed
Merge branch 'master' into feat/jumpstart-model-id-list
2 parents 1f08fc6 + 4fc7f2c commit 4b5b502

File tree

111 files changed

+2757
-481
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

111 files changed

+2757
-481
lines changed

.githooks/pre-push

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ start_time=`date +%s`
1212
tox -e sphinx,doc8 --parallel all
1313
./ci-scripts/displaytime.sh 'sphinx,doc8' $start_time
1414
start_time=`date +%s`
15-
tox -e py36,py37,py38 --parallel all -- tests/unit
16-
./ci-scripts/displaytime.sh 'py36,py37,py38 unit' $start_time
15+
tox -e py36,py37,py38,py39 --parallel all -- tests/unit
16+
./ci-scripts/displaytime.sh 'py36,py37,py38,py39 unit' $start_time

CHANGELOG.md

+64
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,69 @@
11
# Changelog
22

3+
## v2.84.0 (2022-04-07)
4+
5+
### Features
6+
7+
* dependabot integ - move all deps to requirements.txt
8+
* add xgboost framework version 1.5-1
9+
10+
## v2.83.0 (2022-04-04)
11+
12+
### Features
13+
14+
* Hugging Face Transformers 4.17 for TF 2.6
15+
16+
### Bug Fixes and Other Changes
17+
18+
* IOC image version select issue
19+
20+
## v2.82.2 (2022-04-01)
21+
22+
### Bug Fixes and Other Changes
23+
24+
* Revert "fix: Fix Pipeline variables related customer issues (#2959)"
25+
* Refactor repack_model script injection, fixes tar.gz error
26+
27+
## v2.82.1 (2022-03-31)
28+
29+
### Bug Fixes and Other Changes
30+
31+
* Update Inferentia Image URI Config
32+
* Fix Pipeline variables related customer issues
33+
* more logging info for static pipeline test data setup
34+
35+
## v2.82.0 (2022-03-30)
36+
37+
### Features
38+
39+
* pluggable instance fallback mechanism, add CapacityError
40+
* support passing Env Vars to local mode training
41+
42+
## v2.81.1 (2022-03-29)
43+
44+
### Bug Fixes and Other Changes
45+
46+
* Update black-check version, add support for Spark 3.1 Processing
47+
48+
## v2.81.0 (2022-03-26)
49+
50+
### Features
51+
52+
* Retrieve data configuration
53+
* enable EnableInterContainerTrafficEncryption for model monitoring
54+
* Hugging Face Transformers 4.17 for PT 1.10
55+
56+
### Bug Fixes and Other Changes
57+
58+
* remove `new` from serverless
59+
* temporarily skip tests impacted by data inconsistency
60+
* Implement override solution for pipeline variables
61+
62+
### Documentation Changes
63+
64+
* add documentation for image_uri serverless use case
65+
* minor fixes for smddp 1.4.0 doc
66+
367
## v2.80.0 (2022-03-18)
468

569
### Features

MANIFEST.in

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
recursive-include src/sagemaker *.py
22

33
include src/sagemaker/image_uri_config/*.json
4+
recursive-include requirements *
45

56
include VERSION
67
include LICENSE.txt

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.80.1.dev0
1+
2.84.1.dev0

doc/_static/js/analytics.js

-2
This file was deleted.

doc/_static/js/datatable.js

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
$(document).ready( function () {
2+
$('table.datatable').DataTable();
3+
$('a.external').attr('target', '_blank');
4+
} );

doc/doc_utils/jumpstart_doc_utils.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ def create_jumpstart_model_table():
6767
We highly suggest pinning an exact model version however.\n
6868
"""
6969
)
70+
file_content.append(
71+
"""
72+
Each model id is linked to an external page that describes the model.\n
73+
"""
74+
)
7075
file_content.append("\n")
7176
file_content.append(".. list-table:: Available Models\n")
7277
file_content.append(" :widths: 50 20 20 20\n")
@@ -80,7 +85,7 @@ def create_jumpstart_model_table():
8085

8186
for model in sdk_manifest_top_versions_for_models.values():
8287
model_spec = get_jumpstart_sdk_spec(model["spec_key"])
83-
file_content.append(" * - {}\n".format(model["model_id"]))
88+
file_content.append(" * - `{} <{}>`_\n".format(model_spec["model_id"], model_spec["url"]))
8489
file_content.append(" - {}\n".format(model_spec["training_supported"]))
8590
file_content.append(" - {}\n".format(model["version"]))
8691
file_content.append(" - {}\n".format(model["min_version"]))

doc/overview.rst

+31-2
Original file line numberDiff line numberDiff line change
@@ -1226,6 +1226,28 @@ to configure or manage the underlying infrastructure. After you trained a model,
12261226
Serverless endpoint and then invoke the endpoint with the model to get inference results back. More information about
12271227
SageMaker Serverless Inference can be found in the `AWS documentation <https://docs.aws.amazon.com/sagemaker/latest/dg/serverless-endpoints.html>`__.
12281228

1229+
For using SageMaker Serverless Inference, you can either use SageMaker-provided container or Bring Your Own Container model.
1230+
A step by step example for using Serverless Inference with MXNet image :
1231+
1232+
Firstly, create MXNet model
1233+
1234+
.. code:: python
1235+
1236+
from sagemaker.mxnet import MXNetModel
1237+
from sagemaker.serverless import ServerlessInferenceConfig
1238+
import sagemaker
1239+
1240+
role = sagemaker.get_execution_role()
1241+
1242+
# create MXNet Model Class
1243+
model = MXNetModel(
1244+
model_data="s3://my_bucket/pretrained_model/model.tar.gz", # path to your trained sagemaker model
1245+
role=role, # iam role with permissions to create an Endpoint
1246+
entry_point="inference.py",
1247+
py_version="py3", # Python version
1248+
framework_version="1.6.0", # MXNet framework version
1249+
)
1250+
12291251
To deploy serverless endpoint, you will need to create a ``ServerlessInferenceConfig``.
12301252
If you create ``ServerlessInferenceConfig`` without specifying its arguments, the default ``MemorySizeInMB`` will be **2048** and
12311253
the default ``MaxConcurrency`` will be **5** :
@@ -1235,14 +1257,14 @@ the default ``MaxConcurrency`` will be **5** :
12351257
from sagemaker.serverless import ServerlessInferenceConfig
12361258
12371259
# Create an empty ServerlessInferenceConfig object to use default values
1238-
serverless_config = new ServerlessInferenceConfig()
1260+
serverless_config = ServerlessInferenceConfig()
12391261
12401262
Or you can specify ``MemorySizeInMB`` and ``MaxConcurrency`` in ``ServerlessInferenceConfig`` (example shown below):
12411263

12421264
.. code:: python
12431265
12441266
# Specify MemorySizeInMB and MaxConcurrency in the serverless config object
1245-
serverless_config = new ServerlessInferenceConfig(
1267+
serverless_config = ServerlessInferenceConfig(
12461268
memory_size_in_mb=4096,
12471269
max_concurrency=10,
12481270
)
@@ -1254,6 +1276,13 @@ Then use the ``ServerlessInferenceConfig`` in the estimator's ``deploy()`` metho
12541276
# Deploys the model that was generated by fit() to a SageMaker serverless endpoint
12551277
serverless_predictor = estimator.deploy(serverless_inference_config=serverless_config)
12561278
1279+
Or directly using model's ``deploy()`` method to deploy a serverless endpoint:
1280+
1281+
.. code:: python
1282+
1283+
# Deploys the model to a SageMaker serverless endpoint
1284+
serverless_predictor = model.deploy(serverless_inference_config=serverless_config)
1285+
12571286
After deployment is complete, you can use predictor's ``predict()`` method to invoke the serverless endpoint just like
12581287
real-time endpoints:
12591288

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
urllib3==1.26.8
2+
docker-compose==1.29.2
3+
docker~=5.0.0
4+
PyYAML==5.4.1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
scipy==1.5.4
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
tox==3.24.5
2+
flake8==4.0.1
3+
pytest==6.0.2
4+
pytest-cov==3.0.0
5+
pytest-rerunfailures==10.2
6+
pytest-timeout==2.1.0
7+
pytest-xdist==2.4.0
8+
coverage>=5.2, <6.2
9+
mock==4.0.3
10+
contextlib2==21.6.0
11+
awslogs==0.14.0
12+
black==22.3.0
13+
stopit==1.1.2
14+
apache-airflow==2.2.4
15+
apache-airflow-providers-amazon==3.0.0
16+
attrs==20.3.0
17+
fabric==2.6.0
18+
requests==2.27.1
19+
sagemaker-experiments==0.1.35
20+
Jinja2==3.0.3
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
doc8==0.10.1
2+
Pygments==2.11.2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pydocstyle==6.1.1
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
flake8==4.0.1
2+
flake8-future-import==0.4.6
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
mypy==0.942
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pydocstyle==6.1.1
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pylint==2.6.2
2+
astroid==2.4.2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pyenchant==3.2.2
2+
pylint==2.6.2
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
twine==3.8.0

setup.py

+19-32
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import os
1717
from glob import glob
1818

19-
from setuptools import setup, find_packages
19+
from setuptools import find_packages, setup
2020

2121

2222
def read(fname):
@@ -31,6 +31,20 @@ def read_version():
3131
return read("VERSION").strip()
3232

3333

34+
def read_requirements(filename):
35+
"""Reads requirements file which lists package dependencies.
36+
37+
Args:
38+
filename: type(str) Relative file path of requirements.txt file
39+
40+
Returns:
41+
list of dependencies extracted from file
42+
"""
43+
with open(os.path.abspath(filename)) as fp:
44+
deps = [line.strip() for line in fp.readlines()]
45+
return deps
46+
47+
3448
# Declare minimal set for installation
3549
required_packages = [
3650
"attrs==20.3.0",
@@ -47,42 +61,15 @@ def read_version():
4761
]
4862

4963
# Specific use case dependencies
64+
# Keep format of *_requirements.txt to be tracked by dependabot
5065
extras = {
51-
"local": [
52-
"urllib3==1.26.8",
53-
"docker-compose==1.29.2",
54-
"docker~=5.0.0",
55-
"PyYAML==5.4.1", # PyYAML version has to match docker-compose requirements
56-
],
57-
"scipy": ["scipy==1.5.4"],
66+
"local": read_requirements("requirements/extras/local_requirements.txt"),
67+
"scipy": read_requirements("requirements/extras/scipy_requirements.txt"),
5868
}
5969
# Meta dependency groups
6070
extras["all"] = [item for group in extras.values() for item in group]
6171
# Tests specific dependencies (do not need to be included in 'all')
62-
extras["test"] = (
63-
[
64-
extras["all"],
65-
"tox==3.24.5",
66-
"flake8==4.0.1",
67-
"pytest==6.0.2",
68-
"pytest-cov==3.0.0",
69-
"pytest-rerunfailures==10.2",
70-
"pytest-timeout==2.1.0",
71-
"pytest-xdist==2.4.0",
72-
"coverage>=5.2, <6.2",
73-
"mock==4.0.3",
74-
"contextlib2==21.6.0",
75-
"awslogs==0.14.0",
76-
"black==22.1.0",
77-
"stopit==1.1.2",
78-
"apache-airflow==2.2.3",
79-
"apache-airflow-providers-amazon==3.0.0",
80-
"attrs==20.3.0",
81-
"fabric==2.6.0",
82-
"requests==2.27.1",
83-
"sagemaker-experiments==0.1.35",
84-
],
85-
)
72+
extras["test"] = (extras["all"] + read_requirements("requirements/extras/test_requirements.txt"),)
8673

8774
setup(
8875
name="sagemaker",

src/sagemaker/chainer/model.py

+23-8
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,11 @@ def __init__(
9999
file which should be executed as the entry point to model
100100
hosting. If ``source_dir`` is specified, then ``entry_point``
101101
must point to a file located at the root of ``source_dir``.
102-
image_uri (str): A Docker image URI (default: None). If not specified, a
103-
default image for Chainer will be used. If ``framework_version``
104-
or ``py_version`` are ``None``, then ``image_uri`` is required. If
105-
also ``None``, then a ``ValueError`` will be raised.
102+
image_uri (str): A Docker image URI (default: None). If not specified,
103+
a default image for Chainer will be used.
104+
If ``framework_version`` or ``py_version``
105+
are ``None``, then ``image_uri`` is required. If ``image_uri`` is also ``None``,
106+
then a ``ValueError`` will be raised.
106107
framework_version (str): Chainer version you want to use for
107108
executing your model training code. Defaults to ``None``. Required
108109
unless ``image_uri`` is provided.
@@ -139,7 +140,9 @@ def __init__(
139140

140141
self.model_server_workers = model_server_workers
141142

142-
def prepare_container_def(self, instance_type=None, accelerator_type=None):
143+
def prepare_container_def(
144+
self, instance_type=None, accelerator_type=None, serverless_inference_config=None
145+
):
143146
"""Return a container definition with framework configuration set in model environment.
144147
145148
Args:
@@ -148,21 +151,27 @@ def prepare_container_def(self, instance_type=None, accelerator_type=None):
148151
accelerator_type (str): The Elastic Inference accelerator type to
149152
deploy to the instance for loading and making inferences to the
150153
model. For example, 'ml.eia1.medium'.
154+
serverless_inference_config (sagemaker.serverless.ServerlessInferenceConfig):
155+
Specifies configuration related to serverless endpoint. Instance type is
156+
not provided in serverless inference. So this is used to find image URIs.
151157
152158
Returns:
153159
dict[str, str]: A container definition object usable with the
154160
CreateModel API.
155161
"""
156162
deploy_image = self.image_uri
157163
if not deploy_image:
158-
if instance_type is None:
164+
if instance_type is None and serverless_inference_config is None:
159165
raise ValueError(
160166
"Must supply either an instance type (for choosing CPU vs GPU) or an image URI."
161167
)
162168

163169
region_name = self.sagemaker_session.boto_session.region_name
164170
deploy_image = self.serving_image_uri(
165-
region_name, instance_type, accelerator_type=accelerator_type
171+
region_name,
172+
instance_type,
173+
accelerator_type=accelerator_type,
174+
serverless_inference_config=serverless_inference_config,
166175
)
167176

168177
deploy_key_prefix = model_code_key_prefix(self.key_prefix, self.name, deploy_image)
@@ -174,13 +183,18 @@ def prepare_container_def(self, instance_type=None, accelerator_type=None):
174183
deploy_env[MODEL_SERVER_WORKERS_PARAM_NAME.upper()] = str(self.model_server_workers)
175184
return sagemaker.container_def(deploy_image, self.model_data, deploy_env)
176185

177-
def serving_image_uri(self, region_name, instance_type, accelerator_type=None):
186+
def serving_image_uri(
187+
self, region_name, instance_type, accelerator_type=None, serverless_inference_config=None
188+
):
178189
"""Create a URI for the serving image.
179190
180191
Args:
181192
region_name (str): AWS region where the image is uploaded.
182193
instance_type (str): SageMaker instance type. Used to determine device type
183194
(cpu/gpu/family-specific optimized).
195+
serverless_inference_config (sagemaker.serverless.ServerlessInferenceConfig):
196+
Specifies configuration related to serverless endpoint. Instance type is
197+
not provided in serverless inference. So this is used to determine device type.
184198
185199
Returns:
186200
str: The appropriate image URI based on the given parameters.
@@ -194,4 +208,5 @@ def serving_image_uri(self, region_name, instance_type, accelerator_type=None):
194208
instance_type=instance_type,
195209
accelerator_type=accelerator_type,
196210
image_scope="inference",
211+
serverless_inference_config=serverless_inference_config,
197212
)

0 commit comments

Comments
 (0)