add tensorflow serving docs - #468

Merged
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs
Nov 10, 2018
Merged

add tensorflow serving docs#468
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs

Conversation

@jesterhazy

Copy link
Copy Markdown
Contributor

Description of changes:

  • add tensorflow serving docs
  • add content_type to tensorflow.serving.Predictor
  • add additional tests

Merge Checklist

Put an x in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your pull request.

  • I have read the CONTRIBUTING doc
  • I have added tests that prove my fix is effective or that my feature works (if appropriate)
  • I have updated the changelog with a description of my changes (if appropriate)
  • I have updated any necessary documentation (if appropriate)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@codecov-io

codecov-io commented Nov 9, 2018

Copy link
Copy Markdown

Codecov Report

Merging #468 into master will decrease coverage by 0.04%.
The diff coverage is 33.33%.

Impacted file tree graph

@@ Coverage Diff @@## master #468 +/- ##
==========================================
- Coverage 93.98% 93.94% -0.05% 
==========================================
Files 57 57 Lines 4259 4261 +2 ==========================================
Hits 4003 4003 - Misses 256 258 +2
Impacted FilesCoverage Δ
src/sagemaker/tensorflow/serving.py98.33% <ø> (ø)⬆️
src/sagemaker/local/local_session.py87.25% <33.33%> (-1.75%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 576af44...5980332. Read the comment docs.

@jesterhazy
jesterhazy removed the request for review from mvsuspNovember 9, 2018 18:21
Comment threadCHANGELOG.rst Outdated
1.14.2-dev
==========

* enhancement: add content_type parameter to sagemaker.tensorflow.serving.Predictor

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.

nitpick: I'd make content_type and sagemaker.tensorflow.serving.Predictor monospace

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but required for deploying the trained model to a SageMaker endpoint.
``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but is required to create the SavedModel bundle needed to deploying the trained model to a SageMaker endpoint.

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 it sounds a little weird to have "it is optional, but is required". maybe something like "it is required only for x; otherwise it is optional" instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
estimator.
will generate a `TensorFlow SavedModel <https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md>`_
bundle ready for deployment. Your model will be available in S3 at the ``output_path`` location
that you specified when you created your `sagemaker.tensorflow.TensorFlow` estimator.

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.

add another set of backticks around sagemaker.tensorflow.TensorFlow

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 don't think "Estimator" needs to be capitalized here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
Deploying directly from model artifacts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The first option uses a Python-based server that allows you to specify your own custom
input and output handling functions in a python script. This is the default option.

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.

capitalize "Python"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The common functionality can be extended by the addiction of the following two functions to your training script:

Overriding input preprocessing with an ``input_fn``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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.

extend the header lines on ll. 153 and 172

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 capitalization comment about "Estimator"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

'predictions': [3.5, 4.0, 5.5]
}

The format of the input and the output data correspond directly to the request and response formats

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.

either s/format/formats or s/correspond/corresponds (I think it depends on if you count "data" as plural there)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The format of the input and the output data correspond directly to the request and response formats
of the ``Predict`` method in the `TensorFlow Serving REST API <https://www.tensorflow.org/serving/api_rest>`_.

If your SavedModel includes the right ``signature_def``, you can also make Classify or Regress requests:

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.

should "SavedModel" be monospace here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think not. I Corrected the one or two places where it was to match.

you are likely to have `./multi/model1/export/Servo/...` and `./multi/model2/export/Servo/...`. In both cases,
"Servo" is the base name for the SaveModel files. When serving multiple models, each model needs a unique
basename, so one or both of these will need to be changed. The `/export/` part of the path isn't needed
either, so you can simplify the layout at the same time:

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.

double backticks for rst

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

aargh again!! ok

@jesterhazy
jesterhazy removed the request for review from eslesar-awsNovember 9, 2018 22:25
- Starts ``initial_instance_count`` EC2 instances of the type ``instance_type``.
- On each instance, it will do the following steps:

- start a Docker container optimized for TensorFlow Serving, see `SageMaker TensorFlow Serving containers <https://github.com/aws/sagemaker-tensorflow-serving-container>`_.

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.

Does this repo exist?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

it will soon

To use this feature, you will need to:

#. create a multi-model archive file
#. create a SageMaker and deploy it to an Endpoint

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.

create a SageMaker model**

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

# result is prediction from 'model2'
result = model2_predictor.predict(...)

Making predictions with the AWS CLI

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.

If I am not mistaken this doesn't work with localmode. I think we should make that clear here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good catch. there is a way to make it work with local mode, but it requires a change to local mode. I will add that.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

fixed

The ``predictor.predict`` method call takes one parameter, the input ``data`` for which you want the SageMaker Endpoint
to provide inference. ``predict`` will serialize the input data, and send it in as request to the SageMaker Endpoint by
an ``InvokeEndpoint`` SageMaker operation. ``InvokeEndpoint`` operation requests can be made by ``predictor.predict``, by
boto3 ``sageMaker.runtime`` client or by AWS CLI.

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 should probably be "SageMaker Runtime client". if you want, could also add a link to https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-runtime.html

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

another SavedModel in backticks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

and another monospaced SavedModel

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

self.serving_port = get_config_value('local.serving_port', config) or 8080

def invoke_endpoint(self, Body, EndpointName, ContentType, Accept): # pylint: disable=unused-argument
def invoke_endpoint(self, Body, EndpointName, # pylint: disable=unused-argument

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.

We have agreed on adding some unit tests in a follow up pr for this later.

icywang86rui
icywang86rui previously approved these changes Nov 10, 2018
laurenyu
laurenyu previously approved these changes Nov 10, 2018

@laurenyulaurenyu 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.

lgtm. not sure if @icywang86rui still has comments

edit: see she beat me to it

@jesterhazy
jesterhazy dismissed stale reviews from laurenyu and icywang86rui via 0ca9c32November 10, 2018 01:04
@jesterhazy
jesterhazy merged commit 4f08a3d into aws:masterNov 10, 2018
@jesterhazy
jesterhazy deleted the je-tfs-docs branch November 10, 2018 06:27
metrizable pushed a commit to metrizable/sagemaker-python-sdk that referenced this pull request Dec 1, 2020
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
* add tensorflow serving docs
* add content_type to tensorflow.serving.Predictor
* support CustomAttributes in local mode
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jesterhazy@codecov-io@laurenyu@icywang86rui
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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

add tensorflow serving docs - #468

Merged
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs
Nov 10, 2018
Merged

add tensorflow serving docs#468
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs

Conversation

@jesterhazy

Copy link
Copy Markdown
Contributor

Description of changes:

  • add tensorflow serving docs
  • add content_type to tensorflow.serving.Predictor
  • add additional tests

Merge Checklist

Put an x in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your pull request.

  • I have read the CONTRIBUTING doc
  • I have added tests that prove my fix is effective or that my feature works (if appropriate)
  • I have updated the changelog with a description of my changes (if appropriate)
  • I have updated any necessary documentation (if appropriate)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@codecov-io

codecov-io commented Nov 9, 2018

Copy link
Copy Markdown

Codecov Report

Merging #468 into master will decrease coverage by 0.04%.
The diff coverage is 33.33%.

Impacted file tree graph

@@ Coverage Diff @@## master #468 +/- ##
==========================================
- Coverage 93.98% 93.94% -0.05% 
==========================================
Files 57 57 Lines 4259 4261 +2 ==========================================
Hits 4003 4003 - Misses 256 258 +2
Impacted FilesCoverage Δ
src/sagemaker/tensorflow/serving.py98.33% <ø> (ø)⬆️
src/sagemaker/local/local_session.py87.25% <33.33%> (-1.75%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 576af44...5980332. Read the comment docs.

@jesterhazy
jesterhazy removed the request for review from mvsuspNovember 9, 2018 18:21
Comment threadCHANGELOG.rst Outdated
1.14.2-dev
==========

* enhancement: add content_type parameter to sagemaker.tensorflow.serving.Predictor

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.

nitpick: I'd make content_type and sagemaker.tensorflow.serving.Predictor monospace

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but required for deploying the trained model to a SageMaker endpoint.
``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but is required to create the SavedModel bundle needed to deploying the trained model to a SageMaker endpoint.

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 it sounds a little weird to have "it is optional, but is required". maybe something like "it is required only for x; otherwise it is optional" instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
estimator.
will generate a `TensorFlow SavedModel <https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md>`_
bundle ready for deployment. Your model will be available in S3 at the ``output_path`` location
that you specified when you created your `sagemaker.tensorflow.TensorFlow` estimator.

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.

add another set of backticks around sagemaker.tensorflow.TensorFlow

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 don't think "Estimator" needs to be capitalized here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
Deploying directly from model artifacts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The first option uses a Python-based server that allows you to specify your own custom
input and output handling functions in a python script. This is the default option.

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.

capitalize "Python"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The common functionality can be extended by the addiction of the following two functions to your training script:

Overriding input preprocessing with an ``input_fn``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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.

extend the header lines on ll. 153 and 172

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 capitalization comment about "Estimator"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

'predictions': [3.5, 4.0, 5.5]
}

The format of the input and the output data correspond directly to the request and response formats

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.

either s/format/formats or s/correspond/corresponds (I think it depends on if you count "data" as plural there)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The format of the input and the output data correspond directly to the request and response formats
of the ``Predict`` method in the `TensorFlow Serving REST API <https://www.tensorflow.org/serving/api_rest>`_.

If your SavedModel includes the right ``signature_def``, you can also make Classify or Regress requests:

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.

should "SavedModel" be monospace here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think not. I Corrected the one or two places where it was to match.

you are likely to have `./multi/model1/export/Servo/...` and `./multi/model2/export/Servo/...`. In both cases,
"Servo" is the base name for the SaveModel files. When serving multiple models, each model needs a unique
basename, so one or both of these will need to be changed. The `/export/` part of the path isn't needed
either, so you can simplify the layout at the same time:

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.

double backticks for rst

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

aargh again!! ok

@jesterhazy
jesterhazy removed the request for review from eslesar-awsNovember 9, 2018 22:25
- Starts ``initial_instance_count`` EC2 instances of the type ``instance_type``.
- On each instance, it will do the following steps:

- start a Docker container optimized for TensorFlow Serving, see `SageMaker TensorFlow Serving containers <https://github.com/aws/sagemaker-tensorflow-serving-container>`_.

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.

Does this repo exist?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

it will soon

To use this feature, you will need to:

#. create a multi-model archive file
#. create a SageMaker and deploy it to an Endpoint

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.

create a SageMaker model**

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

# result is prediction from 'model2'
result = model2_predictor.predict(...)

Making predictions with the AWS CLI

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.

If I am not mistaken this doesn't work with localmode. I think we should make that clear here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good catch. there is a way to make it work with local mode, but it requires a change to local mode. I will add that.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

fixed

The ``predictor.predict`` method call takes one parameter, the input ``data`` for which you want the SageMaker Endpoint
to provide inference. ``predict`` will serialize the input data, and send it in as request to the SageMaker Endpoint by
an ``InvokeEndpoint`` SageMaker operation. ``InvokeEndpoint`` operation requests can be made by ``predictor.predict``, by
boto3 ``sageMaker.runtime`` client or by AWS CLI.

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 should probably be "SageMaker Runtime client". if you want, could also add a link to https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-runtime.html

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

another SavedModel in backticks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

and another monospaced SavedModel

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

self.serving_port = get_config_value('local.serving_port', config) or 8080

def invoke_endpoint(self, Body, EndpointName, ContentType, Accept): # pylint: disable=unused-argument
def invoke_endpoint(self, Body, EndpointName, # pylint: disable=unused-argument

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.

We have agreed on adding some unit tests in a follow up pr for this later.

icywang86rui
icywang86rui previously approved these changes Nov 10, 2018
laurenyu
laurenyu previously approved these changes Nov 10, 2018

@laurenyulaurenyu 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.

lgtm. not sure if @icywang86rui still has comments

edit: see she beat me to it

@jesterhazy
jesterhazy dismissed stale reviews from laurenyu and icywang86rui via 0ca9c32November 10, 2018 01:04
@jesterhazy
jesterhazy merged commit 4f08a3d into aws:masterNov 10, 2018
@jesterhazy
jesterhazy deleted the je-tfs-docs branch November 10, 2018 06:27
metrizable pushed a commit to metrizable/sagemaker-python-sdk that referenced this pull request Dec 1, 2020
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
* add tensorflow serving docs
* add content_type to tensorflow.serving.Predictor
* support CustomAttributes in local mode
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jesterhazy@codecov-io@laurenyu@icywang86rui
, '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

add tensorflow serving docs - #468

Merged
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs
Nov 10, 2018
Merged

add tensorflow serving docs#468
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs

Conversation

@jesterhazy

Copy link
Copy Markdown
Contributor

Description of changes:

  • add tensorflow serving docs
  • add content_type to tensorflow.serving.Predictor
  • add additional tests

Merge Checklist

Put an x in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your pull request.

  • I have read the CONTRIBUTING doc
  • I have added tests that prove my fix is effective or that my feature works (if appropriate)
  • I have updated the changelog with a description of my changes (if appropriate)
  • I have updated any necessary documentation (if appropriate)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@codecov-io

codecov-io commented Nov 9, 2018

Copy link
Copy Markdown

Codecov Report

Merging #468 into master will decrease coverage by 0.04%.
The diff coverage is 33.33%.

Impacted file tree graph

@@ Coverage Diff @@## master #468 +/- ##
==========================================
- Coverage 93.98% 93.94% -0.05% 
==========================================
Files 57 57 Lines 4259 4261 +2 ==========================================
Hits 4003 4003 - Misses 256 258 +2
Impacted FilesCoverage Δ
src/sagemaker/tensorflow/serving.py98.33% <ø> (ø)⬆️
src/sagemaker/local/local_session.py87.25% <33.33%> (-1.75%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 576af44...5980332. Read the comment docs.

@jesterhazy
jesterhazy removed the request for review from mvsuspNovember 9, 2018 18:21
Comment threadCHANGELOG.rst Outdated
1.14.2-dev
==========

* enhancement: add content_type parameter to sagemaker.tensorflow.serving.Predictor

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.

nitpick: I'd make content_type and sagemaker.tensorflow.serving.Predictor monospace

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but required for deploying the trained model to a SageMaker endpoint.
``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but is required to create the SavedModel bundle needed to deploying the trained model to a SageMaker endpoint.

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 it sounds a little weird to have "it is optional, but is required". maybe something like "it is required only for x; otherwise it is optional" instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
estimator.
will generate a `TensorFlow SavedModel <https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md>`_
bundle ready for deployment. Your model will be available in S3 at the ``output_path`` location
that you specified when you created your `sagemaker.tensorflow.TensorFlow` estimator.

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.

add another set of backticks around sagemaker.tensorflow.TensorFlow

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 don't think "Estimator" needs to be capitalized here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
Deploying directly from model artifacts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The first option uses a Python-based server that allows you to specify your own custom
input and output handling functions in a python script. This is the default option.

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.

capitalize "Python"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The common functionality can be extended by the addiction of the following two functions to your training script:

Overriding input preprocessing with an ``input_fn``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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.

extend the header lines on ll. 153 and 172

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 capitalization comment about "Estimator"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

'predictions': [3.5, 4.0, 5.5]
}

The format of the input and the output data correspond directly to the request and response formats

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.

either s/format/formats or s/correspond/corresponds (I think it depends on if you count "data" as plural there)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The format of the input and the output data correspond directly to the request and response formats
of the ``Predict`` method in the `TensorFlow Serving REST API <https://www.tensorflow.org/serving/api_rest>`_.

If your SavedModel includes the right ``signature_def``, you can also make Classify or Regress requests:

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.

should "SavedModel" be monospace here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think not. I Corrected the one or two places where it was to match.

you are likely to have `./multi/model1/export/Servo/...` and `./multi/model2/export/Servo/...`. In both cases,
"Servo" is the base name for the SaveModel files. When serving multiple models, each model needs a unique
basename, so one or both of these will need to be changed. The `/export/` part of the path isn't needed
either, so you can simplify the layout at the same time:

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.

double backticks for rst

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

aargh again!! ok

@jesterhazy
jesterhazy removed the request for review from eslesar-awsNovember 9, 2018 22:25
- Starts ``initial_instance_count`` EC2 instances of the type ``instance_type``.
- On each instance, it will do the following steps:

- start a Docker container optimized for TensorFlow Serving, see `SageMaker TensorFlow Serving containers <https://github.com/aws/sagemaker-tensorflow-serving-container>`_.

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.

Does this repo exist?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

it will soon

To use this feature, you will need to:

#. create a multi-model archive file
#. create a SageMaker and deploy it to an Endpoint

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.

create a SageMaker model**

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

# result is prediction from 'model2'
result = model2_predictor.predict(...)

Making predictions with the AWS CLI

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.

If I am not mistaken this doesn't work with localmode. I think we should make that clear here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good catch. there is a way to make it work with local mode, but it requires a change to local mode. I will add that.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

fixed

The ``predictor.predict`` method call takes one parameter, the input ``data`` for which you want the SageMaker Endpoint
to provide inference. ``predict`` will serialize the input data, and send it in as request to the SageMaker Endpoint by
an ``InvokeEndpoint`` SageMaker operation. ``InvokeEndpoint`` operation requests can be made by ``predictor.predict``, by
boto3 ``sageMaker.runtime`` client or by AWS CLI.

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 should probably be "SageMaker Runtime client". if you want, could also add a link to https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-runtime.html

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

another SavedModel in backticks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

and another monospaced SavedModel

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

self.serving_port = get_config_value('local.serving_port', config) or 8080

def invoke_endpoint(self, Body, EndpointName, ContentType, Accept): # pylint: disable=unused-argument
def invoke_endpoint(self, Body, EndpointName, # pylint: disable=unused-argument

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.

We have agreed on adding some unit tests in a follow up pr for this later.

icywang86rui
icywang86rui previously approved these changes Nov 10, 2018
laurenyu
laurenyu previously approved these changes Nov 10, 2018

@laurenyulaurenyu 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.

lgtm. not sure if @icywang86rui still has comments

edit: see she beat me to it

@jesterhazy
jesterhazy dismissed stale reviews from laurenyu and icywang86rui via 0ca9c32November 10, 2018 01:04
@jesterhazy
jesterhazy merged commit 4f08a3d into aws:masterNov 10, 2018
@jesterhazy
jesterhazy deleted the je-tfs-docs branch November 10, 2018 06:27
metrizable pushed a commit to metrizable/sagemaker-python-sdk that referenced this pull request Dec 1, 2020
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
* add tensorflow serving docs
* add content_type to tensorflow.serving.Predictor
* support CustomAttributes in local mode
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jesterhazy@codecov-io@laurenyu@icywang86rui
, '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 \u003e 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

add tensorflow serving docs - #468

Merged
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs
Nov 10, 2018
Merged

add tensorflow serving docs#468
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs

Conversation

@jesterhazy

Copy link
Copy Markdown
Contributor

Description of changes:

  • add tensorflow serving docs
  • add content_type to tensorflow.serving.Predictor
  • add additional tests

Merge Checklist

Put an x in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your pull request.

  • I have read the CONTRIBUTING doc
  • I have added tests that prove my fix is effective or that my feature works (if appropriate)
  • I have updated the changelog with a description of my changes (if appropriate)
  • I have updated any necessary documentation (if appropriate)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@codecov-io

codecov-io commented Nov 9, 2018

Copy link
Copy Markdown

Codecov Report

Merging #468 into master will decrease coverage by 0.04%.
The diff coverage is 33.33%.

Impacted file tree graph

@@ Coverage Diff @@## master #468 +/- ##
==========================================
- Coverage 93.98% 93.94% -0.05% 
==========================================
Files 57 57 Lines 4259 4261 +2 ==========================================
Hits 4003 4003 - Misses 256 258 +2
Impacted FilesCoverage Δ
src/sagemaker/tensorflow/serving.py98.33% <ø> (ø)⬆️
src/sagemaker/local/local_session.py87.25% <33.33%> (-1.75%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 576af44...5980332. Read the comment docs.

@jesterhazy
jesterhazy removed the request for review from mvsuspNovember 9, 2018 18:21
Comment threadCHANGELOG.rst Outdated
1.14.2-dev
==========

* enhancement: add content_type parameter to sagemaker.tensorflow.serving.Predictor

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.

nitpick: I'd make content_type and sagemaker.tensorflow.serving.Predictor monospace

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but required for deploying the trained model to a SageMaker endpoint.
``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but is required to create the SavedModel bundle needed to deploying the trained model to a SageMaker endpoint.

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 it sounds a little weird to have "it is optional, but is required". maybe something like "it is required only for x; otherwise it is optional" instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
estimator.
will generate a `TensorFlow SavedModel <https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md>`_
bundle ready for deployment. Your model will be available in S3 at the ``output_path`` location
that you specified when you created your `sagemaker.tensorflow.TensorFlow` estimator.

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.

add another set of backticks around sagemaker.tensorflow.TensorFlow

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 don't think "Estimator" needs to be capitalized here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
Deploying directly from model artifacts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The first option uses a Python-based server that allows you to specify your own custom
input and output handling functions in a python script. This is the default option.

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.

capitalize "Python"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The common functionality can be extended by the addiction of the following two functions to your training script:

Overriding input preprocessing with an ``input_fn``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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.

extend the header lines on ll. 153 and 172

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 capitalization comment about "Estimator"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

'predictions': [3.5, 4.0, 5.5]
}

The format of the input and the output data correspond directly to the request and response formats

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.

either s/format/formats or s/correspond/corresponds (I think it depends on if you count "data" as plural there)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The format of the input and the output data correspond directly to the request and response formats
of the ``Predict`` method in the `TensorFlow Serving REST API <https://www.tensorflow.org/serving/api_rest>`_.

If your SavedModel includes the right ``signature_def``, you can also make Classify or Regress requests:

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.

should "SavedModel" be monospace here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think not. I Corrected the one or two places where it was to match.

you are likely to have `./multi/model1/export/Servo/...` and `./multi/model2/export/Servo/...`. In both cases,
"Servo" is the base name for the SaveModel files. When serving multiple models, each model needs a unique
basename, so one or both of these will need to be changed. The `/export/` part of the path isn't needed
either, so you can simplify the layout at the same time:

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.

double backticks for rst

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

aargh again!! ok

@jesterhazy
jesterhazy removed the request for review from eslesar-awsNovember 9, 2018 22:25
- Starts ``initial_instance_count`` EC2 instances of the type ``instance_type``.
- On each instance, it will do the following steps:

- start a Docker container optimized for TensorFlow Serving, see `SageMaker TensorFlow Serving containers <https://github.com/aws/sagemaker-tensorflow-serving-container>`_.

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.

Does this repo exist?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

it will soon

To use this feature, you will need to:

#. create a multi-model archive file
#. create a SageMaker and deploy it to an Endpoint

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.

create a SageMaker model**

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

# result is prediction from 'model2'
result = model2_predictor.predict(...)

Making predictions with the AWS CLI

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.

If I am not mistaken this doesn't work with localmode. I think we should make that clear here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good catch. there is a way to make it work with local mode, but it requires a change to local mode. I will add that.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

fixed

The ``predictor.predict`` method call takes one parameter, the input ``data`` for which you want the SageMaker Endpoint
to provide inference. ``predict`` will serialize the input data, and send it in as request to the SageMaker Endpoint by
an ``InvokeEndpoint`` SageMaker operation. ``InvokeEndpoint`` operation requests can be made by ``predictor.predict``, by
boto3 ``sageMaker.runtime`` client or by AWS CLI.

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 should probably be "SageMaker Runtime client". if you want, could also add a link to https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-runtime.html

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

another SavedModel in backticks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

and another monospaced SavedModel

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

self.serving_port = get_config_value('local.serving_port', config) or 8080

def invoke_endpoint(self, Body, EndpointName, ContentType, Accept): # pylint: disable=unused-argument
def invoke_endpoint(self, Body, EndpointName, # pylint: disable=unused-argument

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.

We have agreed on adding some unit tests in a follow up pr for this later.

icywang86rui
icywang86rui previously approved these changes Nov 10, 2018
laurenyu
laurenyu previously approved these changes Nov 10, 2018

@laurenyulaurenyu 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.

lgtm. not sure if @icywang86rui still has comments

edit: see she beat me to it

@jesterhazy
jesterhazy dismissed stale reviews from laurenyu and icywang86rui via 0ca9c32November 10, 2018 01:04
@jesterhazy
jesterhazy merged commit 4f08a3d into aws:masterNov 10, 2018
@jesterhazy
jesterhazy deleted the je-tfs-docs branch November 10, 2018 06:27
metrizable pushed a commit to metrizable/sagemaker-python-sdk that referenced this pull request Dec 1, 2020
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
* add tensorflow serving docs
* add content_type to tensorflow.serving.Predictor
* support CustomAttributes in local mode
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jesterhazy@codecov-io@laurenyu@icywang86rui
, '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

add tensorflow serving docs - #468

Merged
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs
Nov 10, 2018
Merged

add tensorflow serving docs#468
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs

Conversation

@jesterhazy

Copy link
Copy Markdown
Contributor

Description of changes:

  • add tensorflow serving docs
  • add content_type to tensorflow.serving.Predictor
  • add additional tests

Merge Checklist

Put an x in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your pull request.

  • I have read the CONTRIBUTING doc
  • I have added tests that prove my fix is effective or that my feature works (if appropriate)
  • I have updated the changelog with a description of my changes (if appropriate)
  • I have updated any necessary documentation (if appropriate)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@codecov-io

codecov-io commented Nov 9, 2018

Copy link
Copy Markdown

Codecov Report

Merging #468 into master will decrease coverage by 0.04%.
The diff coverage is 33.33%.

Impacted file tree graph

@@ Coverage Diff @@## master #468 +/- ##
==========================================
- Coverage 93.98% 93.94% -0.05% 
==========================================
Files 57 57 Lines 4259 4261 +2 ==========================================
Hits 4003 4003 - Misses 256 258 +2
Impacted FilesCoverage Δ
src/sagemaker/tensorflow/serving.py98.33% <ø> (ø)⬆️
src/sagemaker/local/local_session.py87.25% <33.33%> (-1.75%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 576af44...5980332. Read the comment docs.

@jesterhazy
jesterhazy removed the request for review from mvsuspNovember 9, 2018 18:21
Comment threadCHANGELOG.rst Outdated
1.14.2-dev
==========

* enhancement: add content_type parameter to sagemaker.tensorflow.serving.Predictor

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.

nitpick: I'd make content_type and sagemaker.tensorflow.serving.Predictor monospace

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but required for deploying the trained model to a SageMaker endpoint.
``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but is required to create the SavedModel bundle needed to deploying the trained model to a SageMaker endpoint.

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 it sounds a little weird to have "it is optional, but is required". maybe something like "it is required only for x; otherwise it is optional" instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
estimator.
will generate a `TensorFlow SavedModel <https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md>`_
bundle ready for deployment. Your model will be available in S3 at the ``output_path`` location
that you specified when you created your `sagemaker.tensorflow.TensorFlow` estimator.

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.

add another set of backticks around sagemaker.tensorflow.TensorFlow

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 don't think "Estimator" needs to be capitalized here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
Deploying directly from model artifacts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The first option uses a Python-based server that allows you to specify your own custom
input and output handling functions in a python script. This is the default option.

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.

capitalize "Python"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The common functionality can be extended by the addiction of the following two functions to your training script:

Overriding input preprocessing with an ``input_fn``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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.

extend the header lines on ll. 153 and 172

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 capitalization comment about "Estimator"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

'predictions': [3.5, 4.0, 5.5]
}

The format of the input and the output data correspond directly to the request and response formats

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.

either s/format/formats or s/correspond/corresponds (I think it depends on if you count "data" as plural there)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The format of the input and the output data correspond directly to the request and response formats
of the ``Predict`` method in the `TensorFlow Serving REST API <https://www.tensorflow.org/serving/api_rest>`_.

If your SavedModel includes the right ``signature_def``, you can also make Classify or Regress requests:

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.

should "SavedModel" be monospace here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think not. I Corrected the one or two places where it was to match.

you are likely to have `./multi/model1/export/Servo/...` and `./multi/model2/export/Servo/...`. In both cases,
"Servo" is the base name for the SaveModel files. When serving multiple models, each model needs a unique
basename, so one or both of these will need to be changed. The `/export/` part of the path isn't needed
either, so you can simplify the layout at the same time:

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.

double backticks for rst

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

aargh again!! ok

@jesterhazy
jesterhazy removed the request for review from eslesar-awsNovember 9, 2018 22:25
- Starts ``initial_instance_count`` EC2 instances of the type ``instance_type``.
- On each instance, it will do the following steps:

- start a Docker container optimized for TensorFlow Serving, see `SageMaker TensorFlow Serving containers <https://github.com/aws/sagemaker-tensorflow-serving-container>`_.

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.

Does this repo exist?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

it will soon

To use this feature, you will need to:

#. create a multi-model archive file
#. create a SageMaker and deploy it to an Endpoint

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.

create a SageMaker model**

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

# result is prediction from 'model2'
result = model2_predictor.predict(...)

Making predictions with the AWS CLI

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.

If I am not mistaken this doesn't work with localmode. I think we should make that clear here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good catch. there is a way to make it work with local mode, but it requires a change to local mode. I will add that.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

fixed

The ``predictor.predict`` method call takes one parameter, the input ``data`` for which you want the SageMaker Endpoint
to provide inference. ``predict`` will serialize the input data, and send it in as request to the SageMaker Endpoint by
an ``InvokeEndpoint`` SageMaker operation. ``InvokeEndpoint`` operation requests can be made by ``predictor.predict``, by
boto3 ``sageMaker.runtime`` client or by AWS CLI.

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 should probably be "SageMaker Runtime client". if you want, could also add a link to https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-runtime.html

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

another SavedModel in backticks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

and another monospaced SavedModel

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

self.serving_port = get_config_value('local.serving_port', config) or 8080

def invoke_endpoint(self, Body, EndpointName, ContentType, Accept): # pylint: disable=unused-argument
def invoke_endpoint(self, Body, EndpointName, # pylint: disable=unused-argument

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.

We have agreed on adding some unit tests in a follow up pr for this later.

icywang86rui
icywang86rui previously approved these changes Nov 10, 2018
laurenyu
laurenyu previously approved these changes Nov 10, 2018

@laurenyulaurenyu 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.

lgtm. not sure if @icywang86rui still has comments

edit: see she beat me to it

@jesterhazy
jesterhazy dismissed stale reviews from laurenyu and icywang86rui via 0ca9c32November 10, 2018 01:04
@jesterhazy
jesterhazy merged commit 4f08a3d into aws:masterNov 10, 2018
@jesterhazy
jesterhazy deleted the je-tfs-docs branch November 10, 2018 06:27
metrizable pushed a commit to metrizable/sagemaker-python-sdk that referenced this pull request Dec 1, 2020
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
* add tensorflow serving docs
* add content_type to tensorflow.serving.Predictor
* support CustomAttributes in local mode
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jesterhazy@codecov-io@laurenyu@icywang86rui
, '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

add tensorflow serving docs - #468

Merged
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs
Nov 10, 2018
Merged

add tensorflow serving docs#468
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs

Conversation

@jesterhazy

Copy link
Copy Markdown
Contributor

Description of changes:

  • add tensorflow serving docs
  • add content_type to tensorflow.serving.Predictor
  • add additional tests

Merge Checklist

Put an x in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your pull request.

  • I have read the CONTRIBUTING doc
  • I have added tests that prove my fix is effective or that my feature works (if appropriate)
  • I have updated the changelog with a description of my changes (if appropriate)
  • I have updated any necessary documentation (if appropriate)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@codecov-io

codecov-io commented Nov 9, 2018

Copy link
Copy Markdown

Codecov Report

Merging #468 into master will decrease coverage by 0.04%.
The diff coverage is 33.33%.

Impacted file tree graph

@@ Coverage Diff @@## master #468 +/- ##
==========================================
- Coverage 93.98% 93.94% -0.05% 
==========================================
Files 57 57 Lines 4259 4261 +2 ==========================================
Hits 4003 4003 - Misses 256 258 +2
Impacted FilesCoverage Δ
src/sagemaker/tensorflow/serving.py98.33% <ø> (ø)⬆️
src/sagemaker/local/local_session.py87.25% <33.33%> (-1.75%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 576af44...5980332. Read the comment docs.

@jesterhazy
jesterhazy removed the request for review from mvsuspNovember 9, 2018 18:21
Comment threadCHANGELOG.rst Outdated
1.14.2-dev
==========

* enhancement: add content_type parameter to sagemaker.tensorflow.serving.Predictor

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.

nitpick: I'd make content_type and sagemaker.tensorflow.serving.Predictor monospace

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but required for deploying the trained model to a SageMaker endpoint.
``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but is required to create the SavedModel bundle needed to deploying the trained model to a SageMaker endpoint.

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 it sounds a little weird to have "it is optional, but is required". maybe something like "it is required only for x; otherwise it is optional" instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
estimator.
will generate a `TensorFlow SavedModel <https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md>`_
bundle ready for deployment. Your model will be available in S3 at the ``output_path`` location
that you specified when you created your `sagemaker.tensorflow.TensorFlow` estimator.

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.

add another set of backticks around sagemaker.tensorflow.TensorFlow

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 don't think "Estimator" needs to be capitalized here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
Deploying directly from model artifacts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The first option uses a Python-based server that allows you to specify your own custom
input and output handling functions in a python script. This is the default option.

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.

capitalize "Python"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The common functionality can be extended by the addiction of the following two functions to your training script:

Overriding input preprocessing with an ``input_fn``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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.

extend the header lines on ll. 153 and 172

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 capitalization comment about "Estimator"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

'predictions': [3.5, 4.0, 5.5]
}

The format of the input and the output data correspond directly to the request and response formats

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.

either s/format/formats or s/correspond/corresponds (I think it depends on if you count "data" as plural there)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The format of the input and the output data correspond directly to the request and response formats
of the ``Predict`` method in the `TensorFlow Serving REST API <https://www.tensorflow.org/serving/api_rest>`_.

If your SavedModel includes the right ``signature_def``, you can also make Classify or Regress requests:

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.

should "SavedModel" be monospace here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think not. I Corrected the one or two places where it was to match.

you are likely to have `./multi/model1/export/Servo/...` and `./multi/model2/export/Servo/...`. In both cases,
"Servo" is the base name for the SaveModel files. When serving multiple models, each model needs a unique
basename, so one or both of these will need to be changed. The `/export/` part of the path isn't needed
either, so you can simplify the layout at the same time:

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.

double backticks for rst

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

aargh again!! ok

@jesterhazy
jesterhazy removed the request for review from eslesar-awsNovember 9, 2018 22:25
- Starts ``initial_instance_count`` EC2 instances of the type ``instance_type``.
- On each instance, it will do the following steps:

- start a Docker container optimized for TensorFlow Serving, see `SageMaker TensorFlow Serving containers <https://github.com/aws/sagemaker-tensorflow-serving-container>`_.

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.

Does this repo exist?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

it will soon

To use this feature, you will need to:

#. create a multi-model archive file
#. create a SageMaker and deploy it to an Endpoint

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.

create a SageMaker model**

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

# result is prediction from 'model2'
result = model2_predictor.predict(...)

Making predictions with the AWS CLI

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.

If I am not mistaken this doesn't work with localmode. I think we should make that clear here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good catch. there is a way to make it work with local mode, but it requires a change to local mode. I will add that.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

fixed

The ``predictor.predict`` method call takes one parameter, the input ``data`` for which you want the SageMaker Endpoint
to provide inference. ``predict`` will serialize the input data, and send it in as request to the SageMaker Endpoint by
an ``InvokeEndpoint`` SageMaker operation. ``InvokeEndpoint`` operation requests can be made by ``predictor.predict``, by
boto3 ``sageMaker.runtime`` client or by AWS CLI.

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 should probably be "SageMaker Runtime client". if you want, could also add a link to https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-runtime.html

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

another SavedModel in backticks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

and another monospaced SavedModel

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

self.serving_port = get_config_value('local.serving_port', config) or 8080

def invoke_endpoint(self, Body, EndpointName, ContentType, Accept): # pylint: disable=unused-argument
def invoke_endpoint(self, Body, EndpointName, # pylint: disable=unused-argument

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.

We have agreed on adding some unit tests in a follow up pr for this later.

icywang86rui
icywang86rui previously approved these changes Nov 10, 2018
laurenyu
laurenyu previously approved these changes Nov 10, 2018

@laurenyulaurenyu 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.

lgtm. not sure if @icywang86rui still has comments

edit: see she beat me to it

@jesterhazy
jesterhazy dismissed stale reviews from laurenyu and icywang86rui via 0ca9c32November 10, 2018 01:04
@jesterhazy
jesterhazy merged commit 4f08a3d into aws:masterNov 10, 2018
@jesterhazy
jesterhazy deleted the je-tfs-docs branch November 10, 2018 06:27
metrizable pushed a commit to metrizable/sagemaker-python-sdk that referenced this pull request Dec 1, 2020
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
* add tensorflow serving docs
* add content_type to tensorflow.serving.Predictor
* support CustomAttributes in local mode
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jesterhazy@codecov-io@laurenyu@icywang86rui
, '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

add tensorflow serving docs - #468

Merged
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs
Nov 10, 2018
Merged

add tensorflow serving docs#468
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs

Conversation

@jesterhazy

Copy link
Copy Markdown
Contributor

Description of changes:

  • add tensorflow serving docs
  • add content_type to tensorflow.serving.Predictor
  • add additional tests

Merge Checklist

Put an x in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your pull request.

  • I have read the CONTRIBUTING doc
  • I have added tests that prove my fix is effective or that my feature works (if appropriate)
  • I have updated the changelog with a description of my changes (if appropriate)
  • I have updated any necessary documentation (if appropriate)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@codecov-io

codecov-io commented Nov 9, 2018

Copy link
Copy Markdown

Codecov Report

Merging #468 into master will decrease coverage by 0.04%.
The diff coverage is 33.33%.

Impacted file tree graph

@@ Coverage Diff @@## master #468 +/- ##
==========================================
- Coverage 93.98% 93.94% -0.05% 
==========================================
Files 57 57 Lines 4259 4261 +2 ==========================================
Hits 4003 4003 - Misses 256 258 +2
Impacted FilesCoverage Δ
src/sagemaker/tensorflow/serving.py98.33% <ø> (ø)⬆️
src/sagemaker/local/local_session.py87.25% <33.33%> (-1.75%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 576af44...5980332. Read the comment docs.

@jesterhazy
jesterhazy removed the request for review from mvsuspNovember 9, 2018 18:21
Comment threadCHANGELOG.rst Outdated
1.14.2-dev
==========

* enhancement: add content_type parameter to sagemaker.tensorflow.serving.Predictor

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.

nitpick: I'd make content_type and sagemaker.tensorflow.serving.Predictor monospace

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but required for deploying the trained model to a SageMaker endpoint.
``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but is required to create the SavedModel bundle needed to deploying the trained model to a SageMaker endpoint.

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 it sounds a little weird to have "it is optional, but is required". maybe something like "it is required only for x; otherwise it is optional" instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
estimator.
will generate a `TensorFlow SavedModel <https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md>`_
bundle ready for deployment. Your model will be available in S3 at the ``output_path`` location
that you specified when you created your `sagemaker.tensorflow.TensorFlow` estimator.

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.

add another set of backticks around sagemaker.tensorflow.TensorFlow

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 don't think "Estimator" needs to be capitalized here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
Deploying directly from model artifacts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The first option uses a Python-based server that allows you to specify your own custom
input and output handling functions in a python script. This is the default option.

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.

capitalize "Python"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The common functionality can be extended by the addiction of the following two functions to your training script:

Overriding input preprocessing with an ``input_fn``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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.

extend the header lines on ll. 153 and 172

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 capitalization comment about "Estimator"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

'predictions': [3.5, 4.0, 5.5]
}

The format of the input and the output data correspond directly to the request and response formats

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.

either s/format/formats or s/correspond/corresponds (I think it depends on if you count "data" as plural there)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The format of the input and the output data correspond directly to the request and response formats
of the ``Predict`` method in the `TensorFlow Serving REST API <https://www.tensorflow.org/serving/api_rest>`_.

If your SavedModel includes the right ``signature_def``, you can also make Classify or Regress requests:

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.

should "SavedModel" be monospace here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think not. I Corrected the one or two places where it was to match.

you are likely to have `./multi/model1/export/Servo/...` and `./multi/model2/export/Servo/...`. In both cases,
"Servo" is the base name for the SaveModel files. When serving multiple models, each model needs a unique
basename, so one or both of these will need to be changed. The `/export/` part of the path isn't needed
either, so you can simplify the layout at the same time:

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.

double backticks for rst

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

aargh again!! ok

@jesterhazy
jesterhazy removed the request for review from eslesar-awsNovember 9, 2018 22:25
- Starts ``initial_instance_count`` EC2 instances of the type ``instance_type``.
- On each instance, it will do the following steps:

- start a Docker container optimized for TensorFlow Serving, see `SageMaker TensorFlow Serving containers <https://github.com/aws/sagemaker-tensorflow-serving-container>`_.

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.

Does this repo exist?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

it will soon

To use this feature, you will need to:

#. create a multi-model archive file
#. create a SageMaker and deploy it to an Endpoint

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.

create a SageMaker model**

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

# result is prediction from 'model2'
result = model2_predictor.predict(...)

Making predictions with the AWS CLI

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.

If I am not mistaken this doesn't work with localmode. I think we should make that clear here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good catch. there is a way to make it work with local mode, but it requires a change to local mode. I will add that.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

fixed

The ``predictor.predict`` method call takes one parameter, the input ``data`` for which you want the SageMaker Endpoint
to provide inference. ``predict`` will serialize the input data, and send it in as request to the SageMaker Endpoint by
an ``InvokeEndpoint`` SageMaker operation. ``InvokeEndpoint`` operation requests can be made by ``predictor.predict``, by
boto3 ``sageMaker.runtime`` client or by AWS CLI.

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 should probably be "SageMaker Runtime client". if you want, could also add a link to https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-runtime.html

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

another SavedModel in backticks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

and another monospaced SavedModel

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

self.serving_port = get_config_value('local.serving_port', config) or 8080

def invoke_endpoint(self, Body, EndpointName, ContentType, Accept): # pylint: disable=unused-argument
def invoke_endpoint(self, Body, EndpointName, # pylint: disable=unused-argument

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.

We have agreed on adding some unit tests in a follow up pr for this later.

icywang86rui
icywang86rui previously approved these changes Nov 10, 2018
laurenyu
laurenyu previously approved these changes Nov 10, 2018

@laurenyulaurenyu 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.

lgtm. not sure if @icywang86rui still has comments

edit: see she beat me to it

@jesterhazy
jesterhazy dismissed stale reviews from laurenyu and icywang86rui via 0ca9c32November 10, 2018 01:04
@jesterhazy
jesterhazy merged commit 4f08a3d into aws:masterNov 10, 2018
@jesterhazy
jesterhazy deleted the je-tfs-docs branch November 10, 2018 06:27
metrizable pushed a commit to metrizable/sagemaker-python-sdk that referenced this pull request Dec 1, 2020
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
* add tensorflow serving docs
* add content_type to tensorflow.serving.Predictor
* support CustomAttributes in local mode
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jesterhazy@codecov-io@laurenyu@icywang86rui
, '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

add tensorflow serving docs - #468

Merged
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs
Nov 10, 2018
Merged

add tensorflow serving docs#468
jesterhazy merged 12 commits into
aws:masterfrom
jesterhazy:je-tfs-docs

Conversation

@jesterhazy

Copy link
Copy Markdown
Contributor

Description of changes:

  • add tensorflow serving docs
  • add content_type to tensorflow.serving.Predictor
  • add additional tests

Merge Checklist

Put an x in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your pull request.

  • I have read the CONTRIBUTING doc
  • I have added tests that prove my fix is effective or that my feature works (if appropriate)
  • I have updated the changelog with a description of my changes (if appropriate)
  • I have updated any necessary documentation (if appropriate)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@codecov-io

codecov-io commented Nov 9, 2018

Copy link
Copy Markdown

Codecov Report

Merging #468 into master will decrease coverage by 0.04%.
The diff coverage is 33.33%.

Impacted file tree graph

@@ Coverage Diff @@## master #468 +/- ##
==========================================
- Coverage 93.98% 93.94% -0.05% 
==========================================
Files 57 57 Lines 4259 4261 +2 ==========================================
Hits 4003 4003 - Misses 256 258 +2
Impacted FilesCoverage Δ
src/sagemaker/tensorflow/serving.py98.33% <ø> (ø)⬆️
src/sagemaker/local/local_session.py87.25% <33.33%> (-1.75%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 576af44...5980332. Read the comment docs.

@jesterhazy
jesterhazy removed the request for review from mvsuspNovember 9, 2018 18:21
Comment threadCHANGELOG.rst Outdated
1.14.2-dev
==========

* enhancement: add content_type parameter to sagemaker.tensorflow.serving.Predictor

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.

nitpick: I'd make content_type and sagemaker.tensorflow.serving.Predictor monospace

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but required for deploying the trained model to a SageMaker endpoint.
``serving_input_fn`` is used to define the shapes and types of the inputs the model accepts when the model is exported for Tensorflow Serving. It is optional, but is required to create the SavedModel bundle needed to deploying the trained model to a SageMaker endpoint.

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 it sounds a little weird to have "it is optional, but is required". maybe something like "it is required only for x; otherwise it is optional" instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
estimator.
will generate a `TensorFlow SavedModel <https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md>`_
bundle ready for deployment. Your model will be available in S3 at the ``output_path`` location
that you specified when you created your `sagemaker.tensorflow.TensorFlow` estimator.

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.

add another set of backticks around sagemaker.tensorflow.TensorFlow

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 don't think "Estimator" needs to be capitalized here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated
Deploying directly from model artifacts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The first option uses a Python-based server that allows you to specify your own custom
input and output handling functions in a python script. This is the default option.

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.

capitalize "Python"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The common functionality can be extended by the addiction of the following two functions to your training script:

Overriding input preprocessing with an ``input_fn``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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.

extend the header lines on ll. 153 and 172

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow Estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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 capitalization comment about "Estimator"

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

'predictions': [3.5, 4.0, 5.5]
}

The format of the input and the output data correspond directly to the request and response formats

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.

either s/format/formats or s/correspond/corresponds (I think it depends on if you count "data" as plural there)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

The format of the input and the output data correspond directly to the request and response formats
of the ``Predict`` method in the `TensorFlow Serving REST API <https://www.tensorflow.org/serving/api_rest>`_.

If your SavedModel includes the right ``signature_def``, you can also make Classify or Regress requests:

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.

should "SavedModel" be monospace here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think not. I Corrected the one or two places where it was to match.

you are likely to have `./multi/model1/export/Servo/...` and `./multi/model2/export/Servo/...`. In both cases,
"Servo" is the base name for the SaveModel files. When serving multiple models, each model needs a unique
basename, so one or both of these will need to be changed. The `/export/` part of the path isn't needed
either, so you can simplify the layout at the same time:

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.

double backticks for rst

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

aargh again!! ok

@jesterhazy
jesterhazy removed the request for review from eslesar-awsNovember 9, 2018 22:25
- Starts ``initial_instance_count`` EC2 instances of the type ``instance_type``.
- On each instance, it will do the following steps:

- start a Docker container optimized for TensorFlow Serving, see `SageMaker TensorFlow Serving containers <https://github.com/aws/sagemaker-tensorflow-serving-container>`_.

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.

Does this repo exist?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

it will soon

To use this feature, you will need to:

#. create a multi-model archive file
#. create a SageMaker and deploy it to an Endpoint

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.

create a SageMaker model**

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

# result is prediction from 'model2'
result = model2_predictor.predict(...)

Making predictions with the AWS CLI

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.

If I am not mistaken this doesn't work with localmode. I think we should make that clear here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good catch. there is a way to make it work with local mode, but it requires a change to local mode. I will add that.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

fixed

The ``predictor.predict`` method call takes one parameter, the input ``data`` for which you want the SageMaker Endpoint
to provide inference. ``predict`` will serialize the input data, and send it in as request to the SageMaker Endpoint by
an ``InvokeEndpoint`` SageMaker operation. ``InvokeEndpoint`` operation requests can be made by ``predictor.predict``, by
boto3 ``sageMaker.runtime`` client or by AWS CLI.

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 should probably be "SageMaker Runtime client". if you want, could also add a link to https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-runtime.html

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Comment threadsrc/sagemaker/tensorflow/README.rst Outdated

After a ``TensorFlow`` Estimator has been fit, it saves a ``TensorFlow Serving`` model in
the S3 location defined by ``output_path``. You can call ``deploy`` on a ``TensorFlow``
After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

another SavedModel in backticks

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

Deploying from an Estimator
~~~~~~~~~~~~~~~~~~~~~~~~~~~

After a TensorFlow estimator has been fit, it saves a TensorFlow ``SavedModel`` in

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.

and another monospaced SavedModel

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

ok

self.serving_port = get_config_value('local.serving_port', config) or 8080

def invoke_endpoint(self, Body, EndpointName, ContentType, Accept): # pylint: disable=unused-argument
def invoke_endpoint(self, Body, EndpointName, # pylint: disable=unused-argument

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.

We have agreed on adding some unit tests in a follow up pr for this later.

icywang86rui
icywang86rui previously approved these changes Nov 10, 2018
laurenyu
laurenyu previously approved these changes Nov 10, 2018

@laurenyulaurenyu 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.

lgtm. not sure if @icywang86rui still has comments

edit: see she beat me to it

@jesterhazy
jesterhazy dismissed stale reviews from laurenyu and icywang86rui via 0ca9c32November 10, 2018 01:04
@jesterhazy
jesterhazy merged commit 4f08a3d into aws:masterNov 10, 2018
@jesterhazy
jesterhazy deleted the je-tfs-docs branch November 10, 2018 06:27
metrizable pushed a commit to metrizable/sagemaker-python-sdk that referenced this pull request Dec 1, 2020
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
* add tensorflow serving docs
* add content_type to tensorflow.serving.Predictor
* support CustomAttributes in local mode
Evan-W-ang added a commit to Evan-W-ang/sagemaker-python-sdk that referenced this pull request Jun 8, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jesterhazy@codecov-io@laurenyu@icywang86rui