Skip to content

feature: add TensorFlow 1.13 support #860

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jun 25, 2019
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ TensorFlow SageMaker Estimators

By using TensorFlow SageMaker Estimators, you can train and host TensorFlow models on Amazon SageMaker.

Supported versions of TensorFlow: ``1.4.1``, ``1.5.0``, ``1.6.0``, ``1.7.0``, ``1.8.0``, ``1.9.0``, ``1.10.0``, ``1.11.0``, ``1.12.0``.
Supported versions of TensorFlow: ``1.4.1``, ``1.5.0``, ``1.6.0``, ``1.7.0``, ``1.8.0``, ``1.9.0``, ``1.10.0``, ``1.11.0``, ``1.12.0``, ``1.13.1``.

Supported versions of TensorFlow for Elastic Inference: ``1.11.0``, ``1.12.0``.

Expand Down
16 changes: 3 additions & 13 deletions doc/using_tf.rst
Original file line number Diff line number Diff line change
Expand Up @@ -443,20 +443,10 @@ After a TensorFlow estimator has been fit, it saves a TensorFlow SavedModel in
the S3 location defined by ``output_path``. You can call ``deploy`` on a TensorFlow
estimator to create a SageMaker Endpoint.

SageMaker provides two different options for deploying TensorFlow models to a SageMaker
Endpoint:
Your model will be deployed to a TensorFlow Serving-based server. The server provides a super-set of the
`TensorFlow Serving REST API <https://www.tensorflow.org/serving/api_rest>`_.

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

See `Deploying to Python-based Endpoints <https://github.com/aws/sagemaker-python-sdk/blob/master/src/sagemaker/tensorflow/deploying_python.rst>`_ to learn how to use this option.


- The second option uses a TensorFlow Serving-based server to provide a super-set of the
`TensorFlow Serving REST API <https://www.tensorflow.org/serving/api_rest>`_. This option
does not require (or allow) a custom python script.

See `Deploying to TensorFlow Serving Endpoints <https://github.com/aws/sagemaker-python-sdk/blob/master/src/sagemaker/tensorflow/deploying_tensorflow_serving.rst>`_ to learn how to use this option.
See `Deploying to TensorFlow Serving Endpoints <https://github.com/aws/sagemaker-python-sdk/blob/master/src/sagemaker/tensorflow/deploying_tensorflow_serving.rst>`_ to learn how to deploy your model and make inference requests.


SageMaker TensorFlow Docker containers
Expand Down
199 changes: 0 additions & 199 deletions src/sagemaker/tensorflow/deploying_python.rst

This file was deleted.

21 changes: 17 additions & 4 deletions src/sagemaker/tensorflow/estimator.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
from sagemaker.tensorflow.defaults import TF_VERSION
from sagemaker.tensorflow.model import TensorFlowModel
from sagemaker.tensorflow.serving import Model
from sagemaker.utils import get_config_value
from sagemaker import utils
from sagemaker.vpc_utils import VPC_CONFIG_DEFAULT

logger = logging.getLogger("sagemaker")
Expand Down Expand Up @@ -190,9 +190,11 @@ class TensorFlow(Framework):

__framework_name__ = "tensorflow"

LATEST_VERSION = "1.12"
LATEST_VERSION = "1.13"
"""The latest version of TensorFlow included in the SageMaker pre-built Docker images."""

_LOWEST_SCRIPT_MODE_ONLY_VERSION = [1, 13]

def __init__(
self,
training_steps=None,
Expand Down Expand Up @@ -321,6 +323,17 @@ def _validate_args(
)
)

if (not self._script_mode_enabled()) and self._only_script_mode_supported():
logger.warning(
"Legacy mode is deprecated in versions 1.13 and higher. Using script mode instead."
)
self.script_mode = True

def _only_script_mode_supported(self):
return [
int(s) for s in self.framework_version.split(".")
] >= self._LOWEST_SCRIPT_MODE_ONLY_VERSION

def _validate_requirements_file(self, requirements_file):
if not requirements_file:
return
Expand Down Expand Up @@ -489,7 +502,7 @@ def _create_tfs_model(self, role=None, vpc_config_override=VPC_CONFIG_DEFAULT):
image=self.image_name,
name=self._current_job_name,
container_log_level=self.container_log_level,
framework_version=self.framework_version,
framework_version=utils.get_short_version(self.framework_version),
sagemaker_session=self.sagemaker_session,
vpc_config=self.get_vpc_config(vpc_config_override),
)
Expand Down Expand Up @@ -553,7 +566,7 @@ def hyperparameters(self):
return hyperparameters

def _default_s3_path(self, directory, mpi=False):
local_code = get_config_value("local.local_code", self.sagemaker_session.config)
local_code = utils.get_config_value("local.local_code", self.sagemaker_session.config)
if self.sagemaker_session.local_mode and local_code:
return "/opt/ml/shared/{}".format(directory)
elif mpi:
Expand Down
12 changes: 12 additions & 0 deletions src/sagemaker/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,18 @@ def get_config_value(key_path, config):
return current_section


def get_short_version(framework_version):
"""Return short version in the format of x.x

Args:
framework_version: The version string to be shortened.

Returns:
str: The short version string
"""
return ".".join(framework_version.split(".")[:2])


def to_str(value):
"""Convert the input to a string, unless it is a unicode string in Python 2.

Expand Down
8 changes: 0 additions & 8 deletions tests/data/tensorflow_mnist/mnist.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,11 @@

import argparse
import json
import logging as _logging
import numpy as np
import os
import sys as _sys
import tensorflow as tf
from tensorflow.python.platform import tf_logging

tf.logging.set_verbosity(tf.logging.DEBUG)
_handler = _logging.StreamHandler(_sys.stdout)
tf_logger = tf_logging._get_logger()
tf_logger.handlers = [_handler]


def cnn_model_fn(features, labels, mode):
Expand Down Expand Up @@ -179,5 +173,3 @@ def serving_input_fn():

if args.current_host == args.hosts[0]:
mnist_classifier.export_savedmodel("/opt/ml/model", serving_input_fn)

tf_logger.info("====== Training finished =========")
7 changes: 5 additions & 2 deletions tests/integ/test_local_mode.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,14 +85,14 @@ def _create_model(output_path):

@pytest.mark.local_mode
@pytest.mark.skipif(PYTHON_VERSION != "py2", reason="TensorFlow image supports only python 2.")
def test_tf_local_mode(tf_full_version, sagemaker_local_session):
def test_tf_local_mode(sagemaker_local_session):
with timeout(minutes=5):
script_path = os.path.join(DATA_DIR, "iris", "iris-dnn-classifier.py")

estimator = TensorFlow(
entry_point=script_path,
role="SageMakerRole",
framework_version=tf_full_version,
framework_version='1.12',
training_steps=1,
evaluation_steps=1,
hyperparameters={"input_tensor_name": "inputs"},
Expand Down Expand Up @@ -135,6 +135,7 @@ def test_tf_distributed_local_mode(sagemaker_local_session):
estimator = TensorFlow(
entry_point=script_path,
role="SageMakerRole",
framework_version='1.12',
training_steps=1,
evaluation_steps=1,
hyperparameters={"input_tensor_name": "inputs"},
Expand Down Expand Up @@ -176,6 +177,7 @@ def test_tf_local_data(sagemaker_local_session):
estimator = TensorFlow(
entry_point=script_path,
role="SageMakerRole",
framework_version='1.12',
training_steps=1,
evaluation_steps=1,
hyperparameters={"input_tensor_name": "inputs"},
Expand Down Expand Up @@ -216,6 +218,7 @@ def test_tf_local_data_local_script():
estimator = TensorFlow(
entry_point=script_path,
role="SageMakerRole",
framework_version='1.12',
training_steps=1,
evaluation_steps=1,
hyperparameters={"input_tensor_name": "inputs"},
Expand Down
Loading